引子
還記得警匪片上,匪徒們是怎麼配合實施犯罪的嗎?乙個團夥在進行盜竊的時候,總有一兩個人在門口把風,如果有什麼風吹草動,則會立即通知裡面的同夥緊急撤退。也許放風的人並不一定認識裡面的每乙個同夥;而在裡面也許有新來的小弟不認識這個放風的。但是這沒什麼,這個影響不了他們之間的通訊,因為他們之間有早已商定好的暗號。
呵呵,上面提到的放風者、偷竊者之間的關係就是觀察者模式在現實中的活生生的例子。
二、定義與結構
觀察者(observer)模式又名發布-訂閱(publish/subscribe)模式。gof給觀察者模式如下定義:定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。
在這裡先講一下物件導向設計的乙個重要原則:單一職責原則。因此系統的每個物件應該將重點放在問題域中的離散抽象上。因此理想的情況下,乙個物件只做一件事情。這樣在開發中也就帶來了諸多的好處:提供了重用性和維護性,也是進行重構的良好的基礎。
因此幾乎所有的設計模式都是基於這個基本的設計原則來的。觀察者模式的起源我覺得應該是在gui和業務資料的處理上,因為現在絕大多數講解觀察者模式的例子都是這一題材。但是觀察者模式的應用決不僅限於此一方面。
下面我們就來看看觀察者模式的組成部分。
1)抽象目標角色(subject):目標角色知道它的觀察者,可以有任意多個觀察者觀察同乙個目標。並且提供註冊和刪除觀察者物件的介面。目標角色往往由抽象類或者介面來實現。
2)抽象觀察者角色(observer):為那些在目標發生改變時需要獲得通知的物件定義乙個更新介面。抽象觀察者角色主要由抽象類或者介面來實現。
3)具體目標角色(concrete subject):將有關狀態存入各個concrete observer物件。當它的狀態發生改變時, 向它的各個觀察者發出通知。
4)具體觀察者角色(concrete observer):儲存有關狀態,這些狀態應與目標的狀態保持一致。實現observer的更新介面以使自身狀態與目標的狀態保持一致。在本角色內也可以維護乙個指向concrete subject物件的引用。
可以看得出來,在subject這個抽象類中,提供了上面提到的功能,而且存在乙個通知方法:notify。還可以看出來subject和concretesubject之間可以說是使用了模板模式(這個模式真是簡單普遍到一不小心就用到了)。
這樣當具體目標角色的狀態發生改變,按照約定則會去呼叫通知方法,在這個方法中則會根據目標角色中註冊的觀察者名單來逐個呼叫相應的update方法來調整觀察者的狀態。這樣觀察者模式就走完了乙個流程。
四、使用情況
gof給出了以下使用觀察者模式的情況:
1)當乙個抽象模型有兩個方面, 其中乙個方面依賴於另一方面。將這二者封裝在獨立的物件中以使它們可以各自獨立地改變和復用。
2)當對乙個物件的改變需要同時改變其它物件, 而不知道具體有多少物件有待改變。
3)當乙個物件必須通知其它物件,而它又不能假定其它物件是誰。換言之, 你不希望這些物件是緊密耦合的。
其實觀察者模式同前面講過的橋梁、策略有著共同的使用環境:將變化獨立封裝起來,以達到最大的重用和解耦。觀察者與後兩者不同的地方在於,觀察者模式中的目標和觀察者的變化不是獨立的,而是有著某些聯絡。
三、我推你拉
觀察者模式在關於目標角色、觀察者角色通訊的具體實現中,有兩個版本。一種情況便是目標角色在發生變化後,僅僅告訴觀察者角色「我變化了」;觀察者角色如果想要知道具體的變化細節,則就要自己從目標角色的介面中得到。這種模式被很形象的稱為:拉模式——就是說變化的資訊是觀察者角色主動從目標角色中「拉」出來的。
還有一種方法,那就是我目標角色「服務一條龍」,通知你發生變化的同時,通過乙個引數將變化的細節傳遞到觀察者角色中去。這就是「推模式」——管你要不要,先給你啦。
這兩種模式的使用,取決於系統設計時的需要。如果目標角色比較複雜,並且觀察者角色進行更新時必須得到一些具體變化的資訊,則「推模式」比較合適。如果目標角色比較簡單,則「拉模式」就很合適啦。
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
觀察者設計模式
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓它們能夠自動更新自己。抽象主題角色 subject 把所有對觀察者物件的引用儲存在乙個集合中,每個抽象主題角色都可以有任意數量的觀察者。抽象主題提供乙個介面,可以增加...
設計模式 觀察者
1.核心 觀察者模式主要用於1 n的通知。當乙個物件 目標物件subject或者objservable 的狀態變化時,需要告知一系列物件 觀察者物件,observer 讓他們做出響應 通知觀察者的方式 推 每次都把通知以廣播的方式傳送給所有觀察者,所有觀察者只能被動接收 拉 觀察者知道有訊息,至於什...