Java设计模式-观察者模式(订阅发布模式)
Java設計模式-觀察者模式(訂閱發布模式) 一起來看
會了就當復習丫,不會來一起來看看吧。
很喜歡一句話:“八小時內謀生活,八小時外謀發展”。
如果你也喜歡,讓我們一起堅持吧!!
共勉😁
特別喜歡這張圖片,有喜歡的云,又有著滾滾紅塵
作者:用心笑*😁
一、前言
1)引入:
在現實世界中,許多對象并不是獨立存在的,其中一個對象的行為發生改變可能會導致一個或者多個其他對象的行為也發生改變。
例如,股票價格與股民、微信公眾號與微信用戶、氣象局的天氣預報與聽眾等。還有上課鈴聲響了,該進教室啦。
在軟件世界也是這樣,例如,Excel 中的數據與折線圖、餅狀圖、柱狀圖之間的關系;MVC 模式中的模型與視圖的關系;事件模型中的事件源與事件處理者。所有這些,如果用觀察者模式來實現就非常方便。
2)概述:
觀察者(Observer)模式的定義:指多個對象間存在一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。這種模式有時又稱作發布-訂閱模式、模型-視圖模式,它是對象行為型模式。
3)角色結構:
4)注意事項:
1、避免循環引用。 2、如果順序執行,某一觀察者錯誤會導致系統卡殼,一般采用異步方式。
二、案例代碼
2.1、案例:
【例】微信公眾號
在使用微信公眾號時,大家都會有這樣的體驗,當你關注的公眾號中有新內容更新的話,它就會推送給關注公眾號的微信用戶端。我們使用觀察者模式來模擬這樣的場景,微信用戶就是觀察者,微信公眾號是被觀察者,有多個的微信用戶關注了XXX這個公眾號。
類圖
2.2、實現:
定義抽象觀察者類,里面定義一個更新的方法
public interface Observer {void update(String message); }定義具體觀察者類,微信用戶是觀察者,里面實現了更新的方法
public class WeixinUser implements Observer {// 微信用戶名private String name;public WeixinUser(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + "-" + message);} }定義抽象主題類,提供了attach、detach、notify三個方法
public interface Subject {//增加訂閱者public void attach(Observer observer);//刪除訂閱者public void detach(Observer observer);//通知訂閱者更新消息public void notify(String message); }微信公眾號是具體主題(具體被觀察者),里面存儲了訂閱該公眾號的微信用戶,并實現了抽象主題中的方法
public class SubscriptionSubject implements Subject {//儲存訂閱公眾號的微信用戶private List<Observer> weixinUserlist = new ArrayList<Observer>();@Overridepublic void attach(Observer observer) {weixinUserlist.add(observer);}@Overridepublic void detach(Observer observer) {weixinUserlist.remove(observer);}@Overridepublic void notify(String message) {for (Observer observer : weixinUserlist) {observer.update(message);}} }客戶端程序
public class Client {public static void main(String[] args) {SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();//創建微信用戶WeixinUser user1=new WeixinUser("小明");WeixinUser user2=new WeixinUser("小王");WeixinUser user3=new WeixinUser("小李");//訂閱公眾號mSubscriptionSubject.attach(user1);mSubscriptionSubject.attach(user2);mSubscriptionSubject.attach(user3);//公眾號更新發出消息給訂閱的微信用戶mSubscriptionSubject.notify("寧在春的文章更新啦!!!");/*** 小明-寧在春的文章更新啦!!!* 小王-寧在春的文章更新啦!!!* 小李-寧在春的文章更新啦!!!*/} }微信公眾號一發消息,所有訂閱的用戶都能接收到。
之前寫過一篇 SpringBoot整合Redis實現發布/訂閱模式 的文章。大家感興趣可以看一看哈!!!
三、總結
優點:
缺點:
1、如果有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。
2、如果在觀察者和觀察目標之間有循環依賴的話,觀察目標會觸發它們之間進行循環調用,可能導致系統崩潰。
3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標對象是怎么發生變化的,而僅僅只是知道觀察目標發生了變化。(即沒有確認機制)
使用場景:
四、自言自語
我也不知道文章寫出來是有用還是無用,只是想做一個分享。希望大家能夠喜歡并且在這里能有收獲。
當然不可否認,我也想獲得那種別人認可的那種快樂,并且能人我繼續維之堅持。
你好啊,要天天開心哦。下篇文章再見。
此系列還在持續更新中… 我一定還會回來的。😁
希望與君共勉,我們:待別日相見時,都已有所成。
總結
以上是生活随笔為你收集整理的Java设计模式-观察者模式(订阅发布模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSON Web Token(缩写 JW
- 下一篇: VsCode 配置 C/C++ 开发环境