摘要:觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。所有的觀察者只需要保有一個對象的引用,便可以在各自的構造器中實現對自身的注冊。
觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知并自動更新。
這就好比一個辦在線教育的老師(OnlineTeacher)和線下的若干學生(localStudent1, localStudent2, localStudent3 ...)之間的關系。
當這個老師在線上發布了一條消息之后,他所有的學生都會收到通知,并可以根據這條消息的內容來實現對應的更新。
觀察者模式類圖為了實現松耦合設計,OnlineTeacher對象只需要實現Subject接口,并實現其中規定的三個方法即可:
registerObserver(); //注冊觀察者
removeObserver(); //取消注冊觀察者
notifyObserver(); //通知觀察者
Subject接口:public interface Subject { //Subject接口中的三個方法,用于注冊、移除和通知observers void registerObserver(Observer observer); void removeObserver(Observer observer); //以上兩個方法都需要一個observer對象作為變量,以實現注冊或被刪除 void notifyObservers(); }
同時,OnlineTeacher對象還需要一個數據結構,來存儲已經注冊的學生對象。
OnlineTeacher類public class OnlineTeacher implements Subject { //建立一個數據結構來存儲注冊過的observer對象 private ArrayListobserverArrayList; //用message來模擬老師講課 private String message; //OnlineTeacher類的構造器,生成該對象時,會初始化一個observerArrayList public OnlineTeacher() { observerArrayList = new ArrayList<>(); } @Override public void registerObserver(Observer observer) { observerArrayList.add(observer); } @Override public void removeObserver(Observer observer) { int i = observerArrayList.indexOf(observer); if (i > 0) { observerArrayList.remove(i); } } //實現notifyObservers(),實質上就是遍歷observerArrayList,讓其中的每一個observer對象調用他們的update()方法 @Override public void notifyObservers() { for (int i = 0; i < observerArrayList.size(); i++) { observerArrayList.get(i).updates(message); } } //OnlineTeacher有一個方法,setMessage() public void setMessage(String newMessage) { this.message = newMessage; messageChanged(); //message賦值之后,調用messageChanged()方法 } //還有一個方法,messageChanged,在此方法中調用notifyObservers() public void messageChanged() { notifyObservers(); } }
而所有的學生對象只需要實現Observer接口即可成為“觀察者”。
所有的觀察者只需要保有一個OnlineTeacher對象的引用,便可以在各自的構造器中實現對自身的注冊。
public interface Observer { void updates(String message); }用來模擬的localStudent對象們
localStudent1類:
public class LocalStudent1 implements Observer { private Subject onlineTeacher; //構造器需要OnlineTeacher對象(也就是subject),用來注冊自己 public LocalStudent1(Subject onlineTeacher) { this.onlineTeacher = onlineTeacher; onlineTeacher.registerObserver(this); } @Override public void updates(String message) { System.out.println("localStudent1從onlineTeacher那兒得到的message是:" + message +","+ "我領悟到的是:女子和小人一樣"); } }
localStudent2類:
public class LocalStudent2 implements Observer { private Subject onlineTeacher; public LocalStudent2(Subject onlineTeacher) { this.onlineTeacher = onlineTeacher; onlineTeacher.registerObserver(this); } @Override public void updates(String message) { System.out.println("localStudent2從onlineTeacher那兒得到的message是:" + message +","+ "我領悟到的是:這話還有后半句——近之則不遜,遠之則怨"); } }
localStudent3類:
public class LocalStudent3 implements Observer{ private Subject onlineTeacher; public LocalStudent3(Subject onlineTeacher) { this.onlineTeacher = onlineTeacher; onlineTeacher.registerObserver(this); } @Override public void updates(String message) { System.out.println("localStudent3從onlineTeacher那兒得到的message是:" + message +","+ "我領悟到的是:一個人對他親近了,他對你不尊重,疏遠了卻又有怨言!"); } }運行ObserverPatternRunDemo.java
public class ObserverPatternRunDemo { public static void main (String [] args){ OnlineTeacher onlineTeacher = new OnlineTeacher(); LocalStudent1 localStudent1 = new LocalStudent1(onlineTeacher); LocalStudent2 localStudent2 = new LocalStudent2(onlineTeacher); LocalStudent3 localStudent3 = new LocalStudent3(onlineTeacher); onlineTeacher.setMessage("子曰:唯女子與小人難養也"); } }
運行時,以localStudent1對象為例。生成該對象時,會調用onlineTeacher對象的registerObserver()方法,將其自身加入到onlineTeacher對象的observerArrayList當中。
當onlineTeacher對象調用setMessage("子曰:唯女子與小人難養也");時,相當于message的值為子曰:唯女子與小人難養也。
//OnlineTeacher.java中定義的setMessage()和messageChanged()方法 ... //OnlineTeacher有一個方法,setMessage() public void setMessage(String newMessage) { this.message = newMessage; messageChanged(); //message賦值之后,調用messageChanged()方法 } //還有一個方法,messageChanged,在此方法中調用notifyObservers() public void messageChanged() { notifyObservers(); } } ...
根據onlineTeacher類中定義的方法,應有:
先調用messageChanged()方法,然后會調用notifyObservers()方法,而notifyObservers()方法會遍歷所有的Observer對象,并調用他們的update()方法:
//實現notifyObservers(),實質上就是遍歷observerArrayList,讓其中的每一個observer對象調用他們的update()方法 @Override public void notifyObservers() { for (int i = 0; i < observerArrayList.size(); i++) { observerArrayList.get(i).updates(message); } }
3個localStudent對象的update()方法:
localStudent1.update();
@Override public void updates(String message) { System.out.println("localStudent1從onlineTeacher那兒得到的message是:" + message +","+ "我領悟到的是:女子和小人一樣"); } }
localStudent2.update();
@Override public void updates(String message) { System.out.println("localStudent2從onlineTeacher那兒得到的message是:" + message +","+ "我領悟到的是:這話還有后半句——近之則不遜,遠之則怨"); }
**localStudent3.update();**
@Override public void updates(String message) { System.out.println("localStudent3從onlineTeacher那兒得到的message是:" + message +","+ "我領悟到的是:一個人對他親近了,他對你不尊重,疏遠了卻又有怨言!"); }Demo運行的結果
localStudent1從onlineTeacher那兒得到的message是:子曰:唯女子與小人難養也,我領悟到的是:女子和小人一樣 localStudent2從onlineTeacher那兒得到的message是:子曰:唯女子與小人難養也,我領悟到的是:這話還有后半句——近之則不遜,遠之則怨 localStudent3從onlineTeacher那兒得到的message是:子曰:唯女子與小人難養也,我領悟到的是:一個人對他親近了,他對你不尊重,疏遠了卻又有怨言!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74743.html
摘要:關鍵概念理解觀察者設計模式中主要區分兩個概念觀察者指觀察者對象,也就是消息的訂閱者被觀察者指要觀察的目標對象,也就是消息的發布者。 原文首發于微信公眾號:jzman-blog,歡迎關注交流! 最近補一下設計模式相關的知識,關于觀察者設計模式主要從以下幾個方面來學習,具體如下: 什么是觀察者設計模式 關鍵概念理解 通知觀察者的方式 觀察者模式的實現 觀察者模式的優缺點 使用場景 下面...
摘要:觀察者模式與發布訂閱的區別在模式中,知道,同時還保留了的記錄。發布者訂閱者在大多情況下是異步方式使用消息隊列。圖片源于網絡侵權必刪如果以結構來分辨模式,發布訂閱模式相比觀察者模式多了一個中間件訂閱器,所以發布訂閱模式是不同于觀察者模式的。 學習了一段時間設計模式,當學到觀察者模式和發布訂閱模式的時候遇到了很大的問題,這兩個模式有點類似,有點傻傻分不清楚,博客起因如此,開始對觀察者和發布...
摘要:總結一下從表面上看觀察者模式里,只有兩個角色觀察者被觀察者而發布訂閱模式,卻不僅僅只有發布者和訂閱者兩個角色,還有第三個角色經紀人存在。參考鏈接觀察者模式發布訂閱模式 做了這么長時間的 菜鳥程序員 ,我好像還沒有寫過一篇關于設計模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設計模式在從頭學習一遍,不然都對不起我這 菜鳥 的身份。那這次,就從觀察者模式開始好啦...
摘要:總結一下從表面上看觀察者模式里,只有兩個角色觀察者被觀察者而發布訂閱模式,卻不僅僅只有發布者和訂閱者兩個角色,還有第三個角色經紀人存在。參考鏈接觀察者模式發布訂閱模式 做了這么長時間的 菜鳥程序員 ,我好像還沒有寫過一篇關于設計模式的博客...咳咳...意外,純屬意外。所以,我決定,從這一刻起,我要把設計模式在從頭學習一遍,不然都對不起我這 菜鳥 的身份。那這次,就從觀察者模式開始好啦...
摘要:或許以前認為訂閱發布模式是觀察者模式的一種別稱,但是發展至今,概念已經有了不少區別。參考文章訂閱發布模式和觀察者模式真的不一樣 首選我們需要先了解兩者的定義和實現的方式,才能更好的區分兩者的不同點。 或許以前認為訂閱發布模式是觀察者模式的一種別稱,但是發展至今,概念已經有了不少區別。 訂閱發布模式 在軟件架構中,發布-訂閱是一種消息范式,消息的發送者(稱為發布者)不會將消息直接發送給特...
摘要:為了幫助灰太狼擺脫被老婆平底鍋抽的悲劇,發起了解救灰太狼的行動,必須要知道觀察者模式。持有觀察者對象的集合。設計模式源碼下載 相信大家都有看過《喜洋洋與灰太狼》,說的是灰太狼和羊族的斗爭,而每次的結果都是灰太狼一飛沖天,伴隨著一句我還會回來的......。為灰太狼感到悲哀,抓不到羊,在家也被老婆平底鍋虐待。灰太狼為什么會這么背? 很簡單,灰太狼本身就有暴露行蹤的屬性,羊咩咩就能知曉灰太...
閱讀 657·2021-11-23 09:51
閱讀 3604·2021-11-15 11:38
閱讀 936·2021-10-14 09:42
閱讀 3177·2021-09-29 09:35
閱讀 2118·2021-09-03 10:33
閱讀 776·2021-07-30 16:33
閱讀 1563·2019-08-30 15:55
閱讀 1848·2019-08-30 14:04