
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();
}
可以看到主題通知觀察者更新是直接調用了觀察者的方法實作