日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java设计模式-观察者模式(订阅发布模式)

發(fā)布時(shí)間:2025/3/19 java 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式-观察者模式(订阅发布模式) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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):

  • Subject:抽象主題(抽象被觀察者),抽象主題角色把所有觀察者對(duì)象保存在一個(gè)集合里,每個(gè)主題都可以有任意數(shù)量的觀察者,抽象主題提供一個(gè)接口,可以增加和刪除觀察者對(duì)象。
  • ConcreteSubject:具體主題(具體被觀察者),該角色將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題的內(nèi)部狀態(tài)發(fā)生改變時(shí),給所有注冊(cè)過的觀察者發(fā)送通知。
  • Observer:抽象觀察者,是觀察者的抽象類,它定義了一個(gè)更新接口,使得在得到主題更改通知時(shí)更新自己。
  • ConcrereObserver:具體觀察者,實(shí)現(xiàn)抽象觀察者定義的更新接口,以便在得到主題更改通知時(shí)更新自身的狀態(tài)。
  • 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):

  • 降低了目標(biāo)與觀察者之間的耦合關(guān)系,兩者之間是抽象耦合關(guān)系。符合依賴倒置原則。
  • 目標(biāo)與觀察者之間建立了一套觸發(fā)機(jī)制。
  • 缺點(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)景:

  • 對(duì)象間存在一對(duì)多關(guān)系,一個(gè)對(duì)象的狀態(tài)發(fā)生改變會(huì)影響其他對(duì)象。
  • 當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一方面時(shí),可將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù)用。
  • 實(shí)現(xiàn)類似廣播機(jī)制的功能,不需要知道具體收聽者,只需分發(fā)廣播,系統(tǒng)中感興趣的對(duì)象會(huì)自動(dòng)接收該廣播。
  • 多層級(jí)嵌套使用,形成一種鏈?zhǔn)接|發(fā)機(jī)制,使得事件具備跨域(跨越兩種觀察者類型)通知
  • 四、自言自語

    我也不知道文章寫出來是有用還是無用,只是想做一個(gè)分享。希望大家能夠喜歡并且在這里能有收獲。

    當(dāng)然不可否認(rèn),我也想獲得那種別人認(rèn)可的那種快樂,并且能人我繼續(xù)維之堅(jiān)持。

    你好啊,要天天開心哦。下篇文章再見。

    此系列還在持續(xù)更新中… 我一定還會(huì)回來的。😁

    希望與君共勉,我們:待別日相見時(shí),都已有所成。

    總結(jié)

    以上是生活随笔為你收集整理的Java设计模式-观察者模式(订阅发布模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。