大戰設計模式 2 觀察者模式

2022-02-13 05:49:44 字數 1405 閱讀 1409

觀察者模式使用的例子

observer—|

|—nonuse不使用觀察者模式的例子

|—use使用觀察者模式的例子

定義物件之間的一種一對多依賴關係,使得當每乙個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。

subject(抽象目標):又稱為主題,是被觀察的物件。

concretesubject(具體目標):抽象目標的子類,通常包含有經常發生改變的資料,當它的狀態發生改變時,向其各個觀察者發出通知。

observer(抽象觀察者):觀察者將對觀察目標的改變做出反應。

concreteobserver(具體觀察者):具體觀察者中維持乙個指向具體目標物件的引用,它用於儲存具體觀察者的有關狀態,這些狀態需要和具體目標地狀態保持一致。

可以實現表示層和資料邏輯層的分離,觀察者和目標是松耦合的

支援廣播通訊,觀察目標會向已註冊的觀察者物件傳送通知

增加新的觀察者無須修改原有系統**

如果乙個觀察目標有很多直接和間接的觀察者,所有觀察者收到通知會花費大量時間

如果觀察者和觀察目標之間存在迴圈依賴,可能導致系統崩潰

如果忘記刪除不必要的訂閱者,那麼容易誤傳送訊息

乙個抽象模型有兩個方面,其中乙個方面依賴於另乙個方面,封裝起來使其獨立改變和復用

乙個物件的改變將導致乙個或多個其他物件也發生改變,但並不知道具體有多少個物件將要發生改變當

乙個物件必須通知其他物件,但是你又希望這個物件與被通知的物件是松耦合的

1、通過微博的例子理解觀察者模式,如果你使用過微博,那麼觀察者模式你可以直接理解為多個粉絲關注同乙個明星的微博    

當明星傳送微博(目標傳送訊息),所有關注的人都會收到訊息(所有訂閱的觀察者都能收到訊息)   

收到的微博是一樣的。(所有觀察者收到的訊息是一樣的)   

如果取消關注,那麼就收不到訊息(觀察者取消訂閱目標之後就不能收到訊息),可以隨時關注隨時取消   

明星不需要知道有多少人關注,只要傳送微博就行(目標不需要知道有多少人訂閱)

2、觀察者模式有兩種方式    

第一種,推送模式,目標向觀察者主動推送訊息       

優點:獲取訊息及時,一有訊息變動就會被觀察者直接知道       

缺點:觀察者不需要一些訊息的時候,會被迫收到很多不必要的資訊   

第二種,獲取模式,觀察者向目標獲取訊息        

優點:需要就獲取,不需要就不獲取,靈活一些       

缺點:如果不獲取,那麼訊息就不會被知道

3、觀察者模式和別的模式有關係(之後更新)

參考部落格:

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

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

設計模式 觀察者模式2

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

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

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