程式設計模式 觀察者模式 事件通知 訊息佇列三者區別

2022-02-14 18:25:13 字數 1689 閱讀 5137

2017.01.11 19:07:09字數 1050閱讀 2016

觀察者模式、事件通知、訊息佇列三者有類似,都有**函式註冊,通知呼叫的設計,容易混淆。

觀察者模式:被觀察物件狀態改變,所有觀察它的物件得到通知。也稱訂閱模式,英文observer。

被觀察者不依賴觀察者,通過依賴注入達到控制反轉。

事件通知:事件發生後,通知所有關心這個事件的物件。

與觀察者模式對比,可理解成所有物件都只依賴事件系統。一半物件觀察事件系統,等待特定通知;一半物件狀態變化就通過事件系統發出事件。

觀察者也不依賴被觀察物件,他只關心事件,不需要到被觀察物件那兒註冊自己。

被觀察者也只是普通物件,狀態改變,通過事件系統發出事件就行了。

訊息佇列:將訊息排成佇列,逐步分發通知。

與事件通知對比,可理解成事件不是立即通知,而是儲存到佇列裡,稍後通知。

這個可以達到時間解耦的效果。windows的訊息迴圈就是乙個應用。多執行緒情況下,訊息佇列優先於事件系統。

以上課鈴聲為例子。上課鈴聲響,同學們回教室。

class 上課鈴
這樣寫有問題:

上課鈴主動通知學生回教室,依賴關係反了。

上課鈴響,老師要來上課,這個也得上課鈴通知,上課鈴管的東西太多了。

class 學生
這樣上課鈴只管按時響就行了,也有問題:

學生的update會越來越複雜,學生還有很多其他事情要做呢。

update太耗時了,學生們,要精神緊張地仔細停玲聲有沒有響起。

class 上課鈴: subject

class 學生: observer

這樣,上課鈴只要響的時候發個通知,學生們就等通知好了。老師也類似,等通知就行了。

實際就是註冊個**函式,完美的將觀察物件和被觀察物件分離。

個人理解:依賴注入,控制反轉。觀察者依賴被觀察者,而不是被觀察者依賴觀察者。

觀察者模式有兩個問題:

觀察者要獲得被觀察物件,然後才能註冊。

有時只是要知道某個事件發生了而已,類似網路初始化好了的事件,並不需要獲得網路管理物件。

觀察者和被觀察者要繼承物件的,在單繼承體系裡,這是很昂貴的一件事。

上課鈴的例子裡,學生只關心鈴聲,不關心上課鈴這個物體。

用事件模式就可以換個寫法

class 事件系統

class 上課鈴

class 學生

事件通知系統用的很廣泛的。很多**會有個eventdispatchereventcontrol之類的類。

特別是ui程式,當資料發生變化時通知相關ui更新。

觀察者模式可以做到,但是事件通知來實現會更加簡單。

訊息佇列和事件系統很像。但是訊息佇列不是立即通知,而是把訊息先放到佇列裡再通知。

上課鈴的例子

class 訊息佇列

class 上課鈴

class 學生

main

從偽**也可以看出,訊息佇列和事件系統的使用基本是一樣的。如果訊息佇列不延後處理,就是事件系統了。

訊息佇列可以用於多執行緒,接受處理訊息的handle們在主線程裡。傳送訊息的可以在其他執行緒裡。

需要分層解耦就用事件通知系統。

需要時間解耦就用訊息佇列。

程式設計模式 觀察者模式 事件通知 訊息佇列三者區別

2017.01.11 19 07 09字數 1050閱讀 2016 觀察者模式 事件通知 訊息佇列三者有類似,都有 函式註冊,通知呼叫的設計,容易混淆。觀察者模式 被觀察物件狀態改變,所有觀察它的物件得到通知。也稱訂閱模式,英文observer。被觀察者不依賴觀察者,通過依賴注入達到控制反轉。事件通...

通知中心與觀察者模式

一 通知中心是一種機制,是觀察者設計模式的一種具體實現。kvo是觀察者模式的另一種具體實現 觀察者模式的解釋 觀察者,是乙個對被觀察者的狀態變化需要做出反應的物件,所以觀察者需要被觀察者狀態變化的資訊,觀察者訂閱被觀察者的內容,即註冊。被觀察者一旦發生變化,需要通知所有被觀察者。如果不是觀察者,則不...

觀察者模式

觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...