觀察者模式:定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一主題物件,在它的狀態發生變化時,會通知所有的觀察者.
說直白點,觀察者模式很類似於c#中的事件,可是c++卻沒有事件機制,所以c++可以用觀察者模式代替事件。
抽象主題(subject)角色:抽象主題角色提供維護乙個觀察者物件聚集的操作方法,對聚集的增加、刪除等。案例:在教室裡老師還沒有來,同學都在幹著各的事情,小張正在打遊戲,小李正在抄作業....., 現在同學們要求班長當臥底,監視老師,當老師來了通知大家一聲。然後打遊戲的馬上停止,抄作業的也停止。具體主題(concretesubject)角色:將有關狀態存入具體的觀察者物件;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色負責實現抽象主題中聚集的管理方法。
抽象觀察者(observer)角色:為具體觀察者提供乙個更新介面。
具體觀察者(concreteobserver)角色:儲存與主題相關的自洽狀態,實現抽象觀察者提供的更新介面。
這裡班長相當於是乙個通知者, 小張、小李,以及其他同學顯然是監聽者,他們監聽了班長那的訊息,一旦老師來了馬上採取相關的行動。
首先,先把通知真的行為抽象為乙個介面(因為,子類可能監聽的東西不同,可能學習委員監聽班主任老師,班長監聽數學老師等等,但是我們這裡這個例子監聽沒有那麼仔細。)
[cpp]view plain
copy
class inotifier
;
然後班長作為乙個具體的通知者:
[cpp]view plain
copy
class techernotifier : public inotifier
virtual
void removelistenner(techerlistenner* listenner)
virtual
void notify()
} private:
listm_listenners;
};
定義乙個監聽者的介面,想要監聽老師來了這個訊息的同學必須要實現這個介面:
[cpp]view plain
copy
class techerlistenner
;
小張和小李,監聽了老師來了這個介面;
[cpp]view plain
copy
class xiaozhang : public techerlistenner
void stopcopywork()
};
class xiaoli : public techerlistenner
void stopplaygame()
};
這樣當老師來了,小張和小李就可以停止玩遊戲和抄作業,避免被老師發現。
客戶端**:
[cpp]view plain
copy
techernotifier monitor;
xiaozhang xz;
xiaoli xl;
monitor.addlistenner(&xz);
monitor.addlistenner(&xl);
xz.copyhomework();
xl.playgame();
monitor.notify();
最常用的設計模式 觀察者模式(C 實現)
觀察者模式 定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一主題物件,在它的狀態發生變化時,會通知所有的觀察者.說直白點,觀察者模式很類似於c 中的事件,可是c 卻沒有事件機制,所以c 可以用觀察者模式代替事件。抽象主題 subject 角色 抽象主題角色提供維護乙個觀察者物件聚集的操作方法...
常用設計模式 觀察者模式
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。被觀察者介面 片.public inte ce subject 被觀察者實現類 片.public inte ce anyservice publ...
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...