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