设计模式:观察者模式(Observer)
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/design_pattern/observer/
定義對象見的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
觀察者模式的角色
舉個簡單案例:
1 抽象觀察者角色(Observer):
2 抽象主題角色(Subject)
public abstract class Subject {private List<Observer> list = new ArrayList<>();public void attach(Observer observer){list.add(observer);}public void detach(Observer observer){list.remove(observer);}public void notifyObservers(String str){int len = list.size();for(int i=0;i<len;i++){list.get(i).update(str);}} }3 具體主題角色(ConcreteSubject)
public class ConcreteSubject extends Subject {private String subjectState;public String getState(){return subjectState;}public void setState(String newState){this.subjectState = newState;System.out.println("主題狀態為: "+subjectState);this.notifyObservers(subjectState);} }4 具體觀察者角色(ConcreteObserver)
public class ConcreteObserver implements Observer {private String observerState;@Overridepublic void update(String state){observerState = state;System.out.println("狀態為: "+observerState);} }輸出結果:
主題狀態為: new State 狀態為: new State推模型和拉模型
在觀察者模式中,又分為推模型和拉模型兩種方式。
將上面的代碼修改一下,變為拉模型案例:
1 抽象觀察者角色Observer2,通常是把主題對象當做參數傳遞
2 具體觀察者角色
public class ConcreteObserver2 implements Observer2 {private String observerState;@Overridepublic void update(Subject2 subject){observerState = ((ConcreteSubject2)subject).getState();System.out.println("狀態為: "+observerState);} }3 抽象主題角色
public abstract class Subject2 {private List<Observer2> list = new ArrayList<>();public void attach(Observer2 observer){list.add(observer);}public void detach(Observer2 observer){list.remove(observer);}public void notifyObservers(){int len = list.size();for(int i=0;i<len;i++){list.get(i).update(this);}} }4 具體主題角色
public class ConcreteSubject2 extends Subject2 {private String subjectState;public String getState(){return subjectState;}public void setState(String newState){this.subjectState = newState;System.out.println("主題狀態為: "+subjectState);this.notifyObservers();} }測試代碼:
ConcreteSubject2 subject = new ConcreteSubject2();Observer2 observer = new ConcreteObserver2();subject.attach(observer);subject.setState("new State");輸出結果:(同上一個案例)
兩種模式比較:
優缺點
優點:
缺點:
適用場景
JDK中的觀察者模式:
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
歡迎跳轉到本文的原文鏈接:https://honeypps.com/design_pattern/observer/
參考資料
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的设计模式:观察者模式(Observer)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式:备忘录模式(Memento)
- 下一篇: 设计模式:状态模式(State)