談談觀察者模式和發布訂閱模式

2021-09-27 08:43:10 字數 2692 閱讀 1461

在網上看到許多關於觀察者模式和發布訂閱模式的博文,發現很多人都認為觀察者模式即發布訂閱模式,經過進一步的學習和理解,我認為觀察者模式和發布訂閱模式還是有一些區別的,下面談談我對觀察者模式和發布訂閱模式的理解「ps:歡迎各路大神指正」。

觀察者模式(observer)

觀察者模式指的是乙個物件(subject)維持一系列依賴於它的物件(observer),當有關狀態發生變更時 subject 物件則通知一系列 observer 物件進行更新。

在觀察者模式中,subject 物件擁有新增、刪除和通知一系列 observer 的方法等等,而 observer 物件擁有更新方法等等。

在 subject 物件新增了一系列 observer 物件之後,subject 物件則維持著這一系列 observer 物件,當有關狀態發生變更時 subject 物件則會通知這一系列 observer 物件進行更新。

function

subject

()subject.prototype = ,

remove:function(observer)}},

notify:function

() }

}function observer(name)

observer.prototype =

}var sub = new subject();

var obs1 = new observer('ttsy1');

var obs2 = new observer('ttsy2');

sub.add(obs1);

sub.add(obs2);

sub.notify(); //my name is ttsy1、my name is ttsy2

上述**中,我們建立了 subject 物件和兩個 observer 物件,當有關狀態發生變更時則通過 subject 物件的 notify 方法通知這兩個 observer 物件,這兩個 observer 物件通過 update 方法進行更新。

在 subject 物件新增了一系列 observer 物件之後,還可以通過 remove 方法移除某個 observer 物件對它的依賴。

var sub = new subject();

var obs1 = new observer('ttsy1');

var obs2 = new observer('ttsy2');

sub.add(obs1);

sub.add(obs2);

sub.remove(obs2);

sub.notify(); //my name is ttsy1

發布訂閱模式(publisher && subscriber)

發布訂閱模式指的是希望接收通知的物件(subscriber)基於乙個主題通過自定義事件訂閱主題,被啟用事件的物件(publisher)通過發布主題事件的方式通知各個訂閱該主題的 subscriber 物件。

let pubsub = ,

subscribe:function(key,fn)

this.list[key].push(fn);

},publish:function

());

pubsub.subscribe('***', (***) => );

pubsub.publish('name', 'ttsy1'); // your name is ttsy1

pubsub.publish('***', 'male'); // your *** is male

上述**的訂閱是基於 name 和 *** 主題來自定義事件,發布是通過 name 和 *** 主題並傳入自定義事件的引數,最終觸發了特定主題的自定義事件。

可以通過 unsubscribe 方法取消特定主題的訂閱。

pubsub.subscribe('name', (name) => );

pubsub.subscribe('***', (***) => );

pubsub.unsubscribe('name');

pubsub.publish('name', 'ttsy1'); // 這個主題被取消訂閱了

pubsub.publish('***', 'male'); // your *** is male

觀察者模式 vs 發布訂閱模式

觀察者模式與發布訂閱模式都是定義了乙個一對多的依賴關係,當有關狀態發生變更時則執行相應的更新。

不同的是,在觀察者模式中依賴於 subject 物件的一系列 observer 物件在被通知之後只能執行同乙個特定的更新方法,而在發布訂閱模式中則可以基於不同的主題去執行不同的自定義事件。相對而言,發布訂閱模式比觀察者模式要更加靈活多變。

我認為,觀察者模式和發布訂閱模式本質上的思想是一樣的,而發布訂閱模式可以被看作是觀察者模式的乙個高階版。

設計模式只是一種思想,某一種設計模式都可以有很多種不同的實現方式,各種實現都有其優劣之分,具體的實現方式需要基於不同的業務場景。上述是我對觀察者模式和發布訂閱模式學習之後的一些理解,望指正。

觀察者模式和發布訂閱模式

參考 1 觀察者模式,定義物件間一種一對多的依賴關係,使得每當乙個物件改變狀態,則所有依賴於它 改變的狀態 的物件都會得到通知。2 發布訂閱模式,訂閱者把想訂閱的事件註冊到排程中心,當該事件觸發的時候,發布者發布該事件到排程中心 順帶上下文 由排程中心統一排程訂閱者曾經註冊到排程中心的處理 定義排程...

觀察者模式(發布訂閱模式)

簡介 觀察者模式 又被稱為發布 訂閱 public subscribe 模式,屬於行為型模式的一種,它定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件再狀態變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。塊 public 發布動態 button 觀察者 粉絲 ...

觀察者模式 訂閱發布模式

觀察者模式是一種物件間的一對多依賴關係,當乙個物件的狀態發生變化時,所有依賴他的物件都將得到通知。通常運用在物件之間的訊息通訊中。比如現在有一群學生,可以組成小組,可以尋求幫助 class students askforhelp subject 向大家尋求幫助 this.tasks.foreach ...