java設(shè)計模式之觀察者模式簡單解讀
前言
首先,弄明白兩組概念: 觀察者(Observer)與被觀察者(subject)、發(fā)布者(publicsher)與訂閱者(subscriber)。這是相似的兩組概念,講的時候,要對應(yīng)于各自所在的組,不要弄混了。
在對象之間定義了一對多的依賴,這樣一來,當(dāng)一個對象改變狀態(tài),依賴它的對象會收到通知并自動更新。(這和前端vue的思想相同) 觀察者模式說白了,其實就是發(fā)布訂閱模式,發(fā)布者發(fā)布信息,訂閱者獲取信息,訂閱了就能收到信息,沒訂閱就收不到信息。
思路
- 抽象出觀察者接口
- 抽象出被觀察者接口
- 觀察者類實現(xiàn)觀察者接口
- 被觀察者類實現(xiàn)被觀察者接口(被觀察者持有觀察者的一個隊列)
具體實現(xiàn)
實現(xiàn)時,可以不一步到位,在遇到問題的時候,你也許就知道該怎么做了
package com.wanmei.meishu.ms; import java.util.ArrayList; import java.util.List; //觀察者接口 interface Observable{ //觀察 void addSub(ISubject sub); //取消觀察 void removeSub(ISubject sub,String msg); //讀取消息 void watch(String msg); //獲取觀察者名稱 String getName(); } //觀察者實例 class Observer implements Observable { private String name; public Observer(String name) { this.name = name; } @Override public void addSub(ISubject sub){ sub.addObserver(this); System.out.println("Observer:用戶【"+this.name+"】 訂閱了消息"); } @Override public void removeSub(ISubject sub,String msg){ sub.removeObserver(this); System.out.println("Observer:用戶【"+this.name+"】 取消了訂閱消息," + (msg == null ? "" : ("并說:" + msg))); } @Override public void watch(String msg) { System.out.println("Observer:用戶【"+this.name+"】讀取到的訂閱消息是:" + msg); } public String getName() { return name; } } //被觀察者接口 interface ISubject{ //給觀察者們發(fā)送消息 void sendMsg(String msg); //添加一個觀察者 void addObserver(Observable user); //取消一個觀察者 void removeObserver(Observable user); } //被觀察者實現(xiàn)方式 class SubjectImpl implements ISubject{ //持有觀察者隊列 private List<Observable> observerList; //添加一個觀察者 public synchronized void addObserver(Observable user){ if(observerList == null){ observerList = new ArrayList<Observable>(); } observerList.add(user); String str = ""; for (Observable observable : observerList) { str+= observable.getName()+"、"; } System.out.println("ISubject:目前已有用戶:" + str.substring(0, str.length()-1)); } //取消一個觀察者 public void removeObserver(Observable user){ observerList.remove(user); if(!observerList.isEmpty()){ String str = ""; for (Observable observable : observerList) { str+= observable.getName()+"、"; } System.out.println("ISubject:目前剩余用戶:" + str.substring(0, str.length()- 1)); } } @Override public void sendMsg(String msg) { if(!observerList.isEmpty()){ System.out.println("ISubject:發(fā)送消息:" + msg); for (Observable observable : observerList) { observable.watch(msg); } } } } public class ObserverTest { public static void main(String[] args) { ISubject sub = new SubjectImpl(); //第一個觀察者 Observable u1 = new Observer("吳文俊"); u1.addSub(sub); Observable u2 = new Observer("吳華云"); u2.addSub(sub); Observable u3 = new Observer("李爪哇"); u3.addSub(sub); sub.sendMsg("PHP是世界上最好的語言!"); u3.removeSub(sub,"去死吧,PHP"); sub.sendMsg("PHP是世界上最好的語言!"); } }
運行結(jié)果:
ISubject:目前已有用戶:吳文俊
Observer:用戶【吳文俊】 訂閱了消息
ISubject:目前已有用戶:吳文俊、吳華云
Observer:用戶【吳華云】 訂閱了消息
ISubject:目前已有用戶:吳文俊、吳華云、李爪哇
Observer:用戶【李爪哇】 訂閱了消息
ISubject:發(fā)送消息:PHP是世界上最好的語言!
Observer:用戶【吳文俊】讀取到的訂閱消息是:PHP是世界上最好的語言!
Observer:用戶【吳華云】讀取到的訂閱消息是:PHP是世界上最好的語言!
Observer:用戶【李爪哇】讀取到的訂閱消息是:PHP是世界上最好的語言!
ISubject:目前剩余用戶:吳文俊、吳華云
Observer:用戶【李爪哇】 取消了訂閱消息并說:去死吧,PHP
ISubject:發(fā)送消息:PHP是世界上最好的語言!
Observer:用戶【吳文俊】讀取到的訂閱消息是:PHP是世界上最好的語言!
Observer:用戶【吳華云】讀取到的訂閱消息是:PHP是世界上最好的語言!
到此這篇關(guān)于java設(shè)計模式之觀察者模式簡單解讀的文章就介紹到這了,更多相關(guān)java觀察者模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot Actuator監(jiān)控端點小結(jié)
這篇文章主要介紹了Spring Boot Actuator監(jiān)控端點小結(jié),需要的朋友可以參考下2017-06-06java面試LruCache?和?LinkedHashMap及算法實現(xiàn)
這篇文章主要為大家介紹了java面試LruCache?和?LinkedHashMap及算法實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02springboot啟動時如何指定spring.profiles.active
這篇文章主要介紹了springboot啟動時如何指定spring.profiles.active問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04Mybatis中關(guān)于自定義mapper.xml時,參數(shù)傳遞的方式及寫法
這篇文章主要介紹了Mybatis中關(guān)于自定義mapper.xml時,參數(shù)傳遞的方式及寫法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12IDEA中WebService生成Java代碼并調(diào)用外部接口實現(xiàn)代碼
這篇文章主要介紹了IDEA中WebService生成Java代碼并調(diào)用外部接口實現(xiàn),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05如何在SpringBoot項目里進行統(tǒng)一異常處理
這篇文章主要介紹了如何在SpringBoot項目里進行統(tǒng)一異常處理,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值。需要的小伙伴可以參考一下2022-07-07Spring Boot延遲執(zhí)行實現(xiàn)方法
本文介紹了在Spring Boot項目中延遲執(zhí)行方法的實現(xiàn),以及延遲執(zhí)行下聲明式事務(wù)和編程式事務(wù)的使用情況,感興趣的朋友一起看看吧2020-12-12