观察者模式(Observer)
定义:
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
通俗解释:
好比一个网络聊天室模型。有多个聊天者在聊天室内聊天,其中一个聊天者发送一条消息,则需要通知所有聊天者查看消息。例如我们 App 当中的通知机制也是如此,保存用户的标志,然后挨个给每个用户推送信息。
代码:
抽象主题:提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
public abstract class Subject { protected List<Observer> observers = new ArrayList(); public void addObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public abstract void notifyObserver(); }
具体主题:聊天室类,可以通知所有注册过的观察者对象查看新信息。
public class Chatroom extends Subject { @Override public void notifyObserver() { // 挨个通知每个观察者 for (Observer observer : observers) { observer.response(); } } }
抽象观察者:拥有一个被通知的方法。
public interface Observer { public void response(); }
具体观察者:聊天者类,有一个提示查看新消息的方法供主题调用。
public class Chatter implements Observer { private String name; public Chatter(String name) { this.name = name; } public void sendMessage(String message) { System.out.println(name + "发送了一条信息:" + message); } @Override public void response() { System.out.println(name + "收到一条新消息!"); } }
测试观察者模式
public class TestObserver { public static void main(String[] args) { // 聊天室 Subject chatroom = new Chatroom(); Observer chatter1 = new Chatter("张三"); Observer chatter2 = new Chatter("李四"); Observer chatter3 = new Chatter("王五"); // 依次添加到观察者列表 chatroom.addObserver(chatter1); chatroom.addObserver(chatter2); chatroom.addObserver(chatter3); ((Chatter) chatter1).sendMessage("大家好!"); chatroom.notifyObserver(); } }
运行结果:
张三发送了一条信息:大家好! 张三收到一条新消息! 李四收到一条新消息! 王五收到一条新消息!
解析:
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
- 目标与观察者之间建立了一套触发机制。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于