設計模式真解 觀察者模式篇

2021-08-19 13:23:45 字數 1232 閱讀 2116

觀察者模式

典型應用:客戶端的mvc架構中m和v的關係,服務端資料更新存檔機制,遊戲中任務,成就,預警的事件監聽,都適合用觀察者模式

模式描述:觀察者模式主要用於處理」一「對」多「的關係,當「1」發生變化的時候,「多」需要分別發生變化,而且這個「多」的內容會進行動態增減,於是」多「就去」1「處訂閱,當」1「發現自己變化了,就會遍歷所有訂閱他的「多」,並且對這些「多」一一告知(通過「多」訂閱時候留下的對外介面),當「多」中的某個或者某些個體不需要再關心「1」的變化時,他們就會從「多」中脫離,離開這個「觀察者系統」

現實案例:就像是訂閱報紙,當乙個客戶想要訂閱報紙,就會去郵局留下自己的住址和簡要資訊,報社和看報紙的人就是一對多的關係,報社是「1」,看報者是「多」,也就是觀察者,當世界上發生大事件的時候,」報社「監聽到了變化,用報紙作為媒介,傳送到「看報者」留下的「位址」(**裡就是呼叫觀察者留下的介面,傳送改變的資料過去,介面就是位址),至於看報人收到報紙之後,會根據報紙上的資訊做什麼,報社就不用關心了,看報人也不需要關心報社是怎麼獲取到這些資訊的,當某個看報人不想再接收報紙的時候,就會取消訂閱,報社將這個人的位址從發報列表中清除即可

在地下組織裡,安插入敵方的間諜每次會將訊息傳送給需要知道的人,間諜和接收者是單向聯絡,接收者不知道間諜是誰,怎麼獲取到這些資訊的,他只需要根據資訊的內容做出相應的安排即可,間諜也不用知道接收者是誰,他只要確保自己收到資訊之後能準確地發給接收者即可,減少不必要的資訊交流,避免暴露

in my opinion:觀察者模式主要是為了松耦合,將主體和觀察者的關係只侷限於觀察,而杜絕其他一切不必要的關聯,減少維護成本

觀察者模式變種:並不是所有觀察者都需要一切訊息的,於是主體可以對觀察者分類,就像報社會發布不同型別的報紙,面向的看報者也是不一樣的,可以設計多個觀察者池,不同的變化通知不同池中的觀察者,同時可以設計乙個訊息過濾介面,過濾不必要的變化訊息,防止觀察者被頻繁地無意義地通知

另外的觀察者模式:通知中不附帶具體訊息,在資料發生變化後,將資料公開出來放在看板上,然後通知所有觀察者:有新資料了!觀察者根據自己的需求,從主體的看板上「拉」自己感興趣的資料,這種設計不同於以往的主體「推」資料給觀察者,變成了觀察者收到通知自己「拉」資料,耦合度較之傳統觀察者模式高一些(違背了好萊塢原則),但是用起來比較靈活,減少了主體的複雜度

存疑:觀察者模式中,主體為什麼不能依賴通知觀察者的順序?

學習篇 設計模式 觀察者模式

觀察者模式定義了物件間的一種一對多依賴關係,使得每當乙個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新。它將觀察者和被觀察者的物件分離開。提高了應用程式的可維護性和重用性。觀察者模式又稱為發布 訂閱 publish subscribe 模式。使用場景 1 對乙個物件狀態的更新,需要其他物...

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

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

設計模式 觀察者模式

觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...