在許多設計中,經常涉及多個物件都對乙個特殊物件中的資料變化感興趣,而且這多個物件都希望跟蹤那個特殊物件中的資料變化,也就是說當物件間存在一對多關係時,在這樣的情況下就可以使用觀察者模式。當乙個物件被修改時,則會自動通知它的依賴物件。
主要解決:乙個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作
廣播鏈問題
例如上下級關係,你請假,要告訴你的主管,主管再告訴副經理,副經理再告訴總經理。觀察者模式也有這個問題,乙個觀察者可以有雙重身份,即使觀察者,也是被觀察者,這沒什麼問題呀,但是鏈一旦建立,這個邏輯就比較複雜,可維護性非常差。一般在乙個觀察者模式中最多出現乙個物件既是觀察者也是被觀察者。
具體主題和具體觀察者是松耦合關係。由於主題介面僅僅依賴於觀察者介面,因此具體主題只是知道它的觀察者是實現觀察者介面的某個類的例項,但不需要知道具體是哪個類。同樣,由於觀察者僅僅依賴於主題介面,因此具體觀察者只是知道它依賴的主題是實現主題介面的某個類的例項,但不需要知道具體是哪個類。
觀察者模式滿足「開-閉原則」。主題介面僅僅依賴於觀察者介面,這樣,就可以讓建立具體主題的類也僅僅是依賴於觀察者介面,因此,如果增加新的實現觀察者介面的類,不必修改建立具體主題的類的**。。同樣,建立具體觀察者的類僅僅依賴於主題介面,如果增加新的實現主題介面的類,也不必修改建立具體觀察者類的**
例如:珠寶商運送一批鑽石,有**強盜準備搶劫,珠寶商僱傭了私人保鏢,警察局也派人護送,於是當運輸車上路的時候,強盜保鏢警察都要觀察運輸車一舉一動。
抽象的觀察者
public
inte***ce
watcher
抽象的主題
public
inte***ce
subject
具體的觀察者
//保鏢
public
class
security
implements
watcher
}
//強盜
public
class
thief
implements
watcher
}
//警察
public
class
police
implements
watcher
}
具體的主題
//運輸車
public
class
transporter
implements
subject
@override
public
void
removewatcher
(watcher watcher)
@override
public
void
notifywatchers
(string str)
}}
測試類
public
class
test
}
實現觀察者模式的時候要注意,觀察者和被觀察物件之間的互動關係不能體現成類之間的直接呼叫,否則就將使觀察者和被觀察物件之間緊密的耦合起來,從根本上違反物件導向的設計的原則。無論是觀察者「觀察」觀察物件,還是被觀察者將自己的改變「通知」觀察者,都不應該直接呼叫。 python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
設計模式 觀察者模式
觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...
設計模式 觀察者模式
核心思想 註冊 通知 撤銷註冊 observer 將自己註冊到被觀察物件 subject 中,被觀察物件將觀察者存放在乙個容器 container 裡。被觀察物件發生了某種變化 如圖中的somechange 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...