重學設計模式 - Observer模式

1、Observer模式

  《設計模式》一書中對Observer模式的意圖是這樣敘述的:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都將得到通知並自動更新。

  Observer模式並不是只要在對象間存在依賴關係時就要使用。例如,假設在一個票據處理系統中,有一個Tax對象處理繳稅問題,顯然當票據的項目增加時,Tax對象必須得到通知以便重新計算稅額。但這並不適合Observer模式,因爲這種通知事先已經知道,而且不可能再添加其他觀察者。當依賴關係固定(或實際上固定)時,引入Observer模式可能只會增加複雜性。

  如果需要得到某時間通知的對象列表是變化的,或者是有條件的,那麼Observer模式更具有價值。這些變化可能是由於需求的改變,或者由於需要通知的對象列表的變化而引起的。如果系統在不同的情況下運行,或由不同的用戶運行,需要的觀察者列表都會不同,這是Observer模式也很有用。

  一個觀察者可能只需要處理事件的某些情況。在這種情況下,觀察者必須將額外的通知篩選掉。

  將篩選通知的責任轉給Subject對象,可以避免額外的通知。最好的實現方式是Subject對象使用一個Strategy模式測試通知使用應該發出。每個觀察者在註冊時都將正確的Strategy對象提供給Subject對象。

  有時候,Subject會調用觀察者的Update方法,傳遞信息,這可以避免觀察者回調Subject,但是,經常是不同的觀察者有不同的信息需求。這這種情況下,可以再次使用Strategy模式,這時,用Strategy對象調用觀察者的Update方法。同樣,觀察者必須將正確的Strategy對象提供給Subject對象使用。

 

2、Observer模式關鍵特徵

 

意圖

在對象之間定義一種一對多的依賴關係,這樣當一個對象的狀態改變時,所有依賴者都將得到通知並自動更新。

問題

當某個事件發生時,需要向一系列變化着的對象發出通知。

解決方案

Observer將監視某個事件的責任委託給中心對象:Subject

參與者與協作者

Subject知道自己的Observer,因爲Observer要向它註冊。Subject必須在所監視的事件發生時通知ObserverObserver負責向Subject註冊,以及在得到通知時從Subject處獲取信息。

效果

如果某些Observer只對事件的一個子集感興趣,那麼Subject可能會告訴它們不需要知道的事件。如果Subject通知ObserverObserver還返回請求更多信息,則可能需要額外的通信。

實現

讓某個事件發生時需要知道的對象(Observer)將自己註冊到另一個監視事件發生或自己觸發事件的對象(Subject)上。

事件發生時,Subject告訴Observer事件已經發生。

爲了對所有Observer類型的對象實現Observer接口,有時候需要使用Adapter模式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章