Aha!設計模式 97 觀察者模式 2)

2021-09-24 18:28:12 字數 884 閱讀 9929

效果

現面向不特定型別物件的通知

一般來講通知也是一種呼叫,也就是說,當目標通知觀察者的時候,通常的做法需要目標類了解觀察者類的資訊。觀察者模式定義了觀察者抽象介面,只要具體的觀察者實現了觀察者介面就可以加入到觀察者佇列中並接收目標的通知。也就是說作為通知者的目標類不需要了解具象觀察者類的細節,從而實現了解耦。

實現面向不特定多數物件的通知

觀察者物件都被登入到目標類的觀察者列表中,目標類發出通知方法只是簡單的依次呼叫列表中觀察者物件的通知介面。無論這個列表中的觀察者物件是多還是少,通知的方式都完全相同。觀察者模式就是通過這種方式實現了面向不特定多數觀察者的通知。

實現

拉模型還是推模型

所謂拉模型就是目標物件僅通知觀察者有變化這件事,而詳細內容由觀察者自己從目標物件處取得;而推模型則是將變化的內容,盡量詳細地隨通知一起傳送。拉模型擴充套件靈活,但效率偏低;而推模型效率雖高,但靈活性不足。兩種方法各有利弊,需要根據實際情況進行取捨。作為乙個折中的方案,在通知的時候同時帶上變化的物件和變化的型別,很多時候都會是乙個足夠好的選擇。

避免無效引用

觀察者模式中的觀察者接收通知的前提條件就是在目標物件中進行登入。當觀察者不再需要接收目標物件的通知時就需要及時地取消登入。這一點一般不會發生嚴重的問題。初學者經常容易發生的問題是,當觀察者物件被銷毀時有可能會遺漏取消登入這件事,其結果就是通知時訪問無效物件。另一種情況是,當觀察者保持著目標物件的參照時,如果目標物件在觀察者之前被銷毀,也同樣可能出現訪問無效物件的情況。但是無論哪種問題,只要認真設計、保持良好的退出機制應該都不難解決。

設計模式 觀察者模式(2)

被觀察物件向觀察者推送主題的詳情資訊時候,不管觀察者是否需要,這些資訊一般是觀察目標物件的全部或者部分資訊。一般這種模型實現通過update object obj 將觀察目標物件傳入進去。被觀察物件通知觀察者時候,只傳送少量的資訊,如果需要詳情資訊時候,被觀察物件也就是觀察目標物件主動到觀察者當中,...

設計模式 觀察者模式2

觀察者模式 一.概念 傳統理解 觀察者模式 有時又被稱為發布 publish 觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的...

python 設計模式 觀察者 觀察者設計模式

在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...