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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[设计模式] ------ 观察者模式和他的升级版发布订阅模式

發布時間:2024/7/23 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [设计模式] ------ 观察者模式和他的升级版发布订阅模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概念

觀察者模式,原理很簡單,把A類的子類分別注入到B類中,通過用B類調用方法,循環調用A類的方法,就是所謂觀察者模式

偽代碼如下,最快的速度理解觀察者模式:

接口 A{// 觀察者接口notify(); } Class A1 extend A{// 等待被調的接口notify(){// A1類特有的實現println(A1被通知);} } Class A2 extend A{notify(){println(A2被通知);} } Class B{List<A> alist;addA(A a){//將觀察者注入到B中alist.add(a);}void notify(){for(A a : alist){// 循環通知每一個A的實現對象a.notify();}} } Class Test{main方法(){// 定義通知者BB b = new B();// 將兩個觀察者A1,A2注冊到B中b.addA(new A1());b.addA(new A2());// 當B發出通知后,就會循環調用那些曾經在自己這里注冊過的觀察者b.notify();} }

觀察者使用場景

上面的偽代碼,是最簡單的觀察者模式的原型。
觀察者模式一般用于一個變化(B的notify方法)要引起多個變化(A的notify方法)的場景。比如我執行完一個操作后,需要同時執行好幾個方法。

舉個例子:消息通知

當系統生成一條消息后,需要同時發送系統消息,郵件消息,短信消息,甚至以后還會有其他類型的消息。
那就可以搞個消息的父類A,定義好發送接口notify。
后面每種消息都是A的子類,然后有著自己的發消息的不同實現。
然后搞個發消息的類B,提前將A的這些子類注冊給B,當系統產生消息的時候,只需要調用B的發送,就可以將消息發給各個地方了。

再舉個例子:地主剝削

地主就是那個通知者
所有長工都是觀察者
每個長工,都要觀察地主的命令。比如地主說打掃衛生,然后在地主那里注冊的所有長工,都開始打掃衛生。如果新來了長工,那就在地主那里注冊下,下次地主再發命令,新來的長工也就和之前的長工一樣了。

觀察者的優缺點

優點:解耦了觀察者,可以很容易的新增多個觀察者。
缺點:觀察者和通知者耦合,就是上面偽代碼中,A和B是耦合的。

為了解決這個缺點,于是有了觀察者模式的升級版:發布訂閱模式

發布訂閱模式

發布訂閱模式,一聽都比較熟悉,因為我們用的mq就是基于發布訂閱模式
發布訂閱模式,就是觀察者模式的增強版。
哪里增強了呢?我們知道觀察者模式中,觀察者和通知者是耦合的,是不能隨意更換的。那發布訂閱模式就是解了這種耦合。
將以前的通知者,叫發布者
將以前的觀察者,叫訂閱者
然后發布者和訂閱者中間有個第三方,記錄發布者和訂閱者的關系,即誰訂閱了誰
那么從此發布者和調用者,就不用互相耦合了。

除了mq,簡單的還可以研究下google的eventbus,可以參考我之前的一篇文章,有現成的能運行的例子,可以去感受一下。
spring boot 整合 谷歌guava的EventBus 實現單機版的消息發布訂閱

總結

以上是生活随笔為你收集整理的[设计模式] ------ 观察者模式和他的升级版发布订阅模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。