可進入個人博客查看原文。javascript
觀察者模式定義了對象之間的一對多依賴,使得當一個對象改變狀態時,它的全部依賴者都會收到通知並自動更新。觀察者模式又叫發佈/訂閱模式。java
抽象主題(Subject):它把全部觀察者對象的引用保存到一個列表裏,每一個主題均可以有任何數量的觀察者。抽象主題提供一個接口,能夠增長和刪除觀察者對象。ide
具體主題(ConcreteSubject):將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給全部登記過的觀察者發出通知。測試
抽象觀察者(Observer):爲全部的具體觀察者定義一個接口,在獲得主題通知時更新本身。this
具體觀察者(ConcreteObserver):實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題狀態協調。spa
以獵頭-求職者爲例。獵頭是主題,求職者是觀察者。設計
Subject 接口3d
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyAllObservers();
}複製代碼
Observer 接口code
public interface Observer {
public void update(Subject s);
}複製代碼
HeadHunter 類實現 Subject 接口cdn
import java.util.LinkedList;
public class HeadHunter implements Subject {
private LinkedList<Observer> userList;
private LinkedList<String> jobs;
public HeadHunter() {
userList = new LinkedList<Observer>();
jobs = new LinkedList<String>();
}
@Override
public void registerObserver(Observer o) {
userList.add(o);
}
@Override
public void removeObserver(Observer o) {
userList.remove(o);
}
@Override
public void notifyAllObservers() {
for (Observer o: userList) {
o.update(this);
}
}
public void addJob(String job) {
jobs.add(job);
notifyAllObservers();
}
public LinkedList<String> getJobs() {
return jobs;
}
public String toString() {
return jobs.toString();
}
}複製代碼
JobSeeker 類實現 Observer 接口
public class JobSeeker implements Observer {
private String name;
public JobSeeker(String name) {
this.name = name;
}
@Override
public void update(Subject s) {
System.out.println(this.name + " got notified!");
System.out.println(s);
}
}複製代碼
測試
public class Main {
public static void main(String[] args) {
HeadHunter hh = new HeadHunter();
JobSeeker lbd = new JobSeeker("lbd");
JobSeeker lbx = new JobSeeker("lbx");
JobSeeker lbn = new JobSeeker("lbn");
JobSeeker lbb = new JobSeeker("lbb");
hh.registerObserver(lbd);
hh.registerObserver(lbx);
hh.registerObserver(lbn);
hh.registerObserver(lbb);
hh.removeObserver(lbb);
hh.addJob("looking for Java engineers");
hh.addJob("looking for Python engineers");
}
}複製代碼
輸出
lbd got notified!
[looking for Java engineers]
lbx got notified!
[looking for Java engineers]
lbn got notified!
[looking for Java engineers]
lbd got notified!
[looking for Java engineers, looking for Python engineers]
lbx got notified!
[looking for Java engineers, looking for Python engineers]
lbn got notified!
[looking for Java engineers, looking for Python engineers]複製代碼
觀察者模式使主題和觀察者之間鬆耦合,鬆耦合的設計可以讓咱們創建有彈性的OO系統,可以應對變化,由於對象直接的相互依賴降到了最低。
可進入個人博客查看原文。