觀察者模式:定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。
觀察者模式所涉及的角色有:
抽象主題(subject)角色
public
abstract
class
subject
// 避免同乙個觀察者註冊多次
if (!observers.contains(o))
}/**
* 刪除觀察者物件
*@param observer 觀察者物件
*/public
void
detach(observer o)
/*** 通知所有的觀者者物件
*/public
void
notifyobservers(string newstate)
}}
具體主題(concretesubject)角色
public
class
concretesubject
extends
subject
public
void
change(string newstate)
}
抽象觀察者(observer)角色
public
inte***ce
observer
具體觀察者(concreteobserver)角色
public
class
concreteobserver
implements
observer
}
客戶端
public
class client
}
執行結果
主題狀態為:new state
觀察者狀態為:new state
觀察者模式的優點:
觀察者模式在被觀察者和觀察者之間建立乙個抽象的耦合。被觀察者角色所知道的只是乙個具體觀察者列表,每乙個具體觀察者都符合乙個抽象觀察者的介面。被觀察者並不認識任何乙個具體觀察者,它只知道它們都有乙個共同的介面。由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個物件必然跨越抽象化和具體化層次。
觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知
觀察者模式的缺點:
如果乙個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。
如果在被觀察者之間有迴圈依賴的話,被觀察者會觸發它們之間進行迴圈呼叫,導致系統崩潰。在使用觀察者模式是要特別注意這一點。
如果對觀察者的通知是通過另外的執行緒進行非同步投遞的話,系統必須保證投遞是以自恰的方式進行的。
雖然觀察者模式可以隨時使觀察者知道所觀察的物件發生了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的物件是怎麼發生變化的。
大話設計模式之觀察者模式
本節主要內容 1 觀察者模式意圖 2 觀察者模式uml圖描述 3 舉例說明 一 觀察者模式意圖 定義了一種一對多得依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。define a one to many dependenc...
大話設計模式之觀察者模式
大話設計模式之觀察者模式 為了了解觀察者模式,我們首先看下報紙的訂閱是怎麼回事 1 報社的業務是出版報紙。2 向某家報社訂閱報紙,只要他們有新報紙出版,就會給你送來。只要你是他們的客戶,你就會一直收到報紙。3 當你不想再看報紙的時候,取消訂閱,他們就不會再送新報紙來。4 只要報社還在運營,就會一直有...
大話設計模式觀察者模式c 實現
其他二十三種設計模式 include include using namespace std 觀察者模式 抽象觀察者類 class abstractobserver 抽象通知者類 class abstractsubject 具體通知者類 class concretesubject public ab...