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

2021-08-20 19:21:48 字數 2604 閱讀 3670

最近在學習設計模式,本文就同乙個例子對觀察者和發布訂閱進行**。

觀察者模式

比較概念的解釋是,目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新介面。具體觀察者和具體目標繼承各自的基類,然後具體觀察者把自己註冊到具體目標裡,在具體目標發生變化時候,排程觀察者的更新方法。

舉個例子

比如有個「天氣中心」的具體目標a,專門監聽天氣變化,而有個顯示天氣的介面的觀察者b,b就把自己註冊到a裡,當a觸發天氣變化,就排程b的更新方法,並帶上自己的上下文。

//觀察者列表

function observerlist()

observerlist.prototype.add = function( obj );

observerlist.prototype.count = function();

observerlist.prototype.get = function( index )

};observerlist.prototype.indexof = function( obj, startindex )

i++;

} return -1;

};observerlist.prototype.removeat = function( index );

//目標

function subject()

subject.prototype.addobserver = function( observer );

subject.prototype.removeobserver = function( observer );

subject.prototype.notify = function( context )

};//觀察者

function observer();

}

發布訂閱模式

訂閱者把自己想訂閱的事件註冊到排程中心,當該事件觸發時候,發布者發布該事件到排程中心(順帶上下文),由排程中心統一排程訂閱者註冊到排程中心的處理**。

舉個例子

比如有個介面是實時顯示天氣,它就訂閱天氣事件(註冊到排程中心,包括處理程式),當天氣變化時(定時獲取資料),就作為發布者發布天氣資訊到排程中心,排程中心就排程訂閱者的天氣處理程式。

總結:

發布/訂閱模式有乙個排程中心

,所有的事件經過排程中心,直接到了訂閱者(類似微博發布和粉絲訂閱)

觀察者模式則是拆分出目標(subject )和觀察者(observerlist)兩個類,分別做管理(有依賴關係)

另外,沒必要糾結發布/訂閱模式觀察者模式的區別,事實上,這兩個模式非常相似,甚至可以相互替換,至於是否需要將 subject 和 observerlist 抽象成兩個類來處理,答案也不是必須的,軟體工程很重要的一點就是**要怎麼拆分,要拆分到什麼粒度都是沒有標準答案的。

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

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

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

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

觀察者模式 訂閱發布模式

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