定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時, 所有依賴於它的物件都得到通知並被自動更新。
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);8. 封裝複雜的更新語義void observer::update(subject*, aspect& interest);
當目標和觀察者間的依賴關係特別複雜時, 可能需要乙個維護這些關係的物件,即更改管理器(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模式
目錄 具體實現總結 觀察者模式 發布 訂閱模式 是一種行為型模式,定義一系列物件之間的一對多關係,當乙個物件改變 更新狀態時,依賴它的都會收到通知改變或者更新。在此種模式中,乙個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種...