摘要:觀察者模式涉及的角色主題一對多中的一,持有數(shù)據(jù),當數(shù)據(jù)更新時,通知已注冊的觀察者觀察者一對多中的多,接收主題數(shù)據(jù)做出響應(yīng)舉個栗子一位媽媽主題有兩個孩子,取名為小愛和小冰觀察者。
概念
觀察者模式:定義了對象之間的一對多依賴,這樣一來,當一個對象狀態(tài)改變時,他的所有依賴者都會收到通知并自動更新。
觀察者模式涉及的角色
主題(Subject):一對多中的一,持有數(shù)據(jù),當數(shù)據(jù)更新時,通知已注冊的觀察者
觀察者(Observer):一對多中的多,接收主題數(shù)據(jù)做出響應(yīng)
舉個栗子一位媽媽(主題)有兩個孩子,取名為小愛和小冰(觀察者)。一天小愛和小冰都去找她們的朋友玩,當?shù)搅顺燥埖臅r間,媽媽總會打電話通知她們回來吃飯(孩子默認在媽媽那注冊為觀察者registerObserver),但中途小冰打電話和媽媽說:“不回來吃飯了,和朋友吃”(取消觀察者這角色removeObserver)。所以最后,只有小冰收到媽媽的通知,并告訴她今天買了你喜歡吃的雞腿(notifyObserver)。
代碼Person.java,Mother和Child都繼承這個類[這步和講述觀察者模式?jīng)]什么關(guān)系]
public class Person { private String name; public Person(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Mother.java
public class Mother extends Person implements Subject{ /** * 她要通知的孩子 */ private ArrayListchildren = new ArrayList<>(); /** * 通知的內(nèi)容 */ private String message; public Mother(String name) { super(name); } @Override public void registerObserver(Observer observer) { children.add(observer); } @Override public void removeObserver(Observer observer) { children.remove(observer); } @Override public void notifyObserver() { children.forEach(observer -> observer.message(message)); } public void sendMessage(String message) { this.message = message; // 通知她們 notifyObserver(); } }
Child.java
public class Child extends Person implements Observer{ public Child(String name) { super(name); } @Override public void message(String m) { System.out.println(getName() + "收到的消息:" + m); } }
Main.java
public class Main { public static void main(String[] args) { Mother mother = new Mother("媽媽"); Child xiaoBing = new Child("小冰"); Child xiaoAi = new Child("小愛"); // 孩子都是親生的,吃飯時叫她們 mother.registerObserver(xiaoBing); mother.registerObserver(xiaoAi); mother.sendMessage("飯煮好了,回來吃飯,買了你們想吃的雞腿"); System.out.println("------------------分割線-----------------------"); // 小愛說不回來吃了,取消通知她 mother.removeObserver(xiaoAi); mother.sendMessage("飯煮好了,回來吃飯,買了你們想吃的雞腿"); } }
運行結(jié)果:
小冰收到的消息:飯煮好了,回來吃飯,買了你們想吃的雞腿 小愛收到的消息:飯煮好了,回來吃飯,買了你們想吃的雞腿 ------------------分割線----------------------- 小冰收到的消息:飯煮好了,回來吃飯,買了你們想吃的雞腿
優(yōu)點
主題與觀察者之間松耦合。有新類型的觀察者出現(xiàn)時,主題的代碼不需要修改。假如我們有一個新的具體類需要當觀察者,我們不需要為了兼容新類型而修改主題的代碼,所有要做的就是在新的類里實現(xiàn)此觀察者接口,然后注冊成觀察者即可。
就好比如上面例子,如果國家不久的將來開放三胎政策,媽媽又生了個小娜,媽媽不需要修改自身的邏輯。如果孩子要回家吃飯就實現(xiàn)Observer接口,媽媽那registerObserver就OK。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76884.html
摘要:三內(nèi)置觀察者模式了解內(nèi)置觀察者模式包內(nèi)包含最基本的類與接口,這和上面的接口與接口很類似。根據(jù)具體的需求,如果內(nèi)置的觀察者模式不能滿設(shè)計,那么我們可以像剛開始那樣自己實現(xiàn)一套觀察者模式。參考資料設(shè)計模式 一、了解觀察者模式 1.1 什么是觀察者模式 觀察者模式定義了對象之間的一對多依賴,這樣一來,當一個對象狀態(tài)改變時,它的所有依賴者都會收到通知并自動更新。 典型的問題比如報社,只要你是他...
摘要:觀察者模式的使用場景比如你微博關(guān)注了一個人,那么這個人發(fā)布的微博就會推送到你這。 Java設(shè)計模式之觀察者模式 一直想寫一篇學(xué)習(xí)觀察者模式的總結(jié)沒有契機,今天學(xué)習(xí)阻塞隊列的原理時候看到在實現(xiàn)生產(chǎn)者消費者的時候用到了通知模式,就是所謂的觀察者模式,正好順便整理一下。 1. 簡介 觀察者模式定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更...
摘要:為了幫助灰太狼擺脫被老婆平底鍋抽的悲劇,發(fā)起了解救灰太狼的行動,必須要知道觀察者模式。持有觀察者對象的集合。設(shè)計模式源碼下載 相信大家都有看過《喜洋洋與灰太狼》,說的是灰太狼和羊族的斗爭,而每次的結(jié)果都是灰太狼一飛沖天,伴隨著一句我還會回來的......。為灰太狼感到悲哀,抓不到羊,在家也被老婆平底鍋虐待?;姨菫槭裁磿@么背? 很簡單,灰太狼本身就有暴露行蹤的屬性,羊咩咩就能知曉灰太...
摘要:觀察者模式觀察者模式也可以成為發(fā)布訂閱模式,此模式是對象之間的模式,對象之間呈現(xiàn)一種一對多的關(guān)系。其中的一是被觀察者,多是觀察者,故被觀察者不能產(chǎn)生多個對象,只能有一個對象供觀察者觀察,所以在寫被觀察者的時候,需要使用到單例模式。 觀察者(Observer)模式 觀察者(Observer)模式 也可以成為發(fā)布訂閱模式,此模式是對象之間的模式,對象之間呈現(xiàn)一種一對多的關(guān)系。其中的一是被觀...
閱讀 1280·2021-10-14 09:50
閱讀 1580·2019-08-30 15:54
閱讀 1040·2019-08-30 11:22
閱讀 2934·2019-08-30 10:50
閱讀 1817·2019-08-29 18:39
閱讀 3067·2019-08-29 13:07
閱讀 2090·2019-08-28 17:54
閱讀 761·2019-08-26 17:44