Open penglongli opened 6 years ago
说起观察者模式,我们会联想到另外一个设计模式:Pub-Sub 模式。通常我们会认为这两个模式是相同的,但并非如此。关于它们之间的不同放到“订阅-发布模式”章节说明
假设公司有三个办公室:北京、上海、深圳,每次开会需要通知三个办公室。我们目前采用人工的方式一个个去通知,可以设计出来如下的类图
Meeting 类拥有 observers 属性,包含所有的观察者。通过实现 Subject 接口拥有:注册观察者、移除观察者、通知观察者的操作
observers
Observer 接口拥有 update() 方法,用来接收主题的状态变化。
update()
核心代码如下:
public class Meeting implements Subject { private List<Observer> observers; public Meeting() { observers = new ArrayList<>(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { System.out.println("要开会了,通知所有地区办公室"); for (Observer observer : observers) { observer.update(); } } }
在 notifyObserver 方法中调用所有观察者的 update() 方法,来通知观察者状态改变了。
notifyObserver
源码参见:
注意:其中所有方法均为线程不安全的
观察者模式
说起观察者模式,我们会联想到另外一个设计模式:Pub-Sub 模式。通常我们会认为这两个模式是相同的,但并非如此。关于它们之间的不同放到“订阅-发布模式”章节说明
假设公司有三个办公室:北京、上海、深圳,每次开会需要通知三个办公室。我们目前采用人工的方式一个个去通知,可以设计出来如下的类图
Meeting 类拥有
observers
属性,包含所有的观察者。通过实现 Subject 接口拥有:注册观察者、移除观察者、通知观察者的操作Observer 接口拥有
update()
方法,用来接收主题的状态变化。核心代码如下:
在
notifyObserver
方法中调用所有观察者的 update() 方法,来通知观察者状态改变了。源码参见:
注意:其中所有方法均为线程不安全的