天天看點

設計模式-觀察者模式

設計模式-觀察者模式

Subject:抽象主題,定義增加,删除,以及通知觀察者的方法

Observer:抽象觀察者,定義接口,在被通知要更新時更新自己

ConcreteSubject:主題的實作,内部存在一個存放所有觀察者引用的集合

ConcreteObserver:觀察者的實作

核心就是 主題中儲存着觀察者的集合,當需要更新時,主題通知觀察者做更新,常用的通知方式是直接調用觀察者的方法

代碼例子:

//subject 主題
interface Subject {
    public void addObserver(Observer observer);

    public void deleteObserver(Observer observer);

    public void notifyObserver();
}      
//observer 觀察者
interface Observer {
    public void update();
}      
//ConcreteSubject 主題的具體實作
class ConcreteSubject implements Subject {
    //内部維護一個被通知者的集合
    List<Observer> observerList = new ArrayList<>();

    @Override
    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObserver() {
        for (Observer observer : observerList) {
            observer.update();
        }
    }
}      
//觀察者實作
class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update() {
        System.out.println("接受到了name=" + name);
    }
}
      
//測試
public static void main(String[] args) {
    ConcreteSubject concreteSubject = new ConcreteSubject();

    ConcreteObserver obs1 = new ConcreteObserver("做了1件事情");
    ConcreteObserver obs2 = new ConcreteObserver("做了3件事情");
    concreteSubject.addObserver(obs1);
    concreteSubject.addObserver(obs2);

    concreteSubject.notifyObserver();

}      

可以看到主題通知觀察者更新是直接調用了觀察者的方法實作