設計模式 Observer

2022-03-29 13:56:46 字數 1502 閱讀 3765

定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時, 所有依賴於它的物件都得到通知並被自動更新。

dependents, publish-subscribe

適用性:

結構

允許你獨立的改變subject和observer。

優缺點:

1. 建立subject到其observer之間的對映

最簡單的方法:顯式地在subject中儲存對observer的引用

時間換空間:用乙個關聯查詢機制(如hash表)來維護subject到observer的對映

2. 觀察多個subject

必須擴充套件update介面以使observer知道是哪乙個subject送來的通知

subject物件可以簡單地將自己作為update操作的乙個引數

3. 誰觸發更新

a 由subject物件的狀態設定操作在改變subject物件的狀態後自動呼叫notify

b 讓使用者負責在適當的時候呼叫notify

4. 對已刪除subject的懸掛引用

當乙個subject被刪除時,讓它通知它的observer將對該subject的引用復位

5. 在發出通知前確保subject的狀態自身是一致的

抽象的subject類中的模板方法傳送通知:定義那些子類可以重定義的原語操作, 並將notify作為模板方法中的最後乙個操作

6. 避免特定於observer的更新協議—推/拉模型

推(push)模型:subject向observer傳送關於改變的詳細資訊, 而不管它們需要與否

拉(pull)模型:subject除最小通知外什麼也不送出,而在此之後由observer顯式地向subject詢問細節

7. 顯式地指定感興趣的改變

擴充套件subject的註冊介面,讓各observer註冊為僅對特定事件感興趣,以提高更新的效率

aspect:

void subject::attach(observer*, aspect&interest);

void observer::update(subject*, aspect& interest);

8. 封裝複雜的更新語義

當目標和觀察者間的依賴關係特別複雜時, 可能需要乙個維護這些關係的物件,即更改管理器(changemanager)

目的是儘量減少observer反映其subject的狀態變化所需的工作量

責任:9. 結合subject類和observer類

用不支援多重繼承的語言書寫的類庫通常不單獨定義subject和observer類, 而是將它們的介面結合到乙個類中

設計模式Observer

observer設計模式的定義 定義了物件之間的一對多的依賴,這樣以來,當乙個物件改變狀態時,它的所有依賴者都會受到通知並自動更新。ifndef subjec h define subjec h include observer.h class subject subject subject sub...

Observer設計模式

observer設計模式是針對 乙個物件對多個物件中,乙個物件發生狀態改變,其他附屬物件發生相應的更新。是一種松耦合的設計模式。例子 假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候 1 揚聲器會開始發出語音,告訴你水的溫度 2 液晶屏也會改變水溫的顯示,來提示水已經快燒開了。現在我...

設計模式 Observer模式

目錄 具體實現總結 觀察者模式 發布 訂閱模式 是一種行為型模式,定義一系列物件之間的一對多關係,當乙個物件改變 更新狀態時,依賴它的都會收到通知改變或者更新。在此種模式中,乙個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種...