[设计模式] ------ 观察者模式和他的升级版发布订阅模式
概念
觀察者模式,原理很簡單,把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 實現單機版的消息發布訂閱
總結
以上是生活随笔為你收集整理的[设计模式] ------ 观察者模式和他的升级版发布订阅模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 上传文件注意事项
- 下一篇: php重复点击按钮无效,完美解决UIBu