最常用的設計模式 觀察者模式(C 實現)

2021-07-24 08:56:39 字數 2036 閱讀 4356

觀察者模式:定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一主題物件,在它的狀態發生變化時,會通知所有的觀察者.

說直白點,觀察者模式很類似於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 ...