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