blog
blog copied to clipboard
GOF 观察者模式
trafficstars
观察者模式
说起观察者模式,我们会联想到另外一个设计模式:Pub-Sub 模式。通常我们会认为这两个模式是相同的,但并非如此。关于它们之间的不同放到“订阅-发布模式”章节说明
假设公司有三个办公室:北京、上海、深圳,每次开会需要通知三个办公室。我们目前采用人工的方式一个个去通知,可以设计出来如下的类图

Meeting 类拥有 observers 属性,包含所有的观察者。通过实现 Subject 接口拥有:注册观察者、移除观察者、通知观察者的操作
Observer 接口拥有 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() 方法,来通知观察者状态改变了。
源码参见:
- https://github.com/penglongli/sample/tree/master/design-sample
注意:其中所有方法均为线程不安全的