penglongli / blog

18 stars 1 forks source link

GOF 观察者模式 #83

Open penglongli opened 6 years ago

penglongli commented 6 years ago

观察者模式

说起观察者模式,我们会联想到另外一个设计模式: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() 方法,来通知观察者状态改变了。

源码参见:

注意:其中所有方法均为线程不安全的