C 設計模式 二十六 觀察者模式

2021-10-08 20:16:59 字數 2718 閱讀 9864

基於map的觀察者模式:定義物件之間的一對多依賴關係,使得每當乙個物件狀態發生改變時,其相關依賴物件皆得到通知並被自動更新。又稱為依賴,發布-訂閱。

存在兩個部分:

觀察者觀察事件是否發生,發生通知監聽者(具體觀察者)。監聽者(具體觀察者):處理事件。

【1. 優點:】

【2. 缺點:】

【3. 使用場景:】

觀察者的設計類圖如下所示:

subject:抽象主題,又稱為抽象觀察者。把所有觀察物件(監聽者)儲存到乙個集合中,可以使用容器儲存。提供註冊,刪除,通知三個介面。

concretesubject:具體主體,又稱為觀察者,繼承抽象主題得到,實現三個介面。

obsever:抽象觀察物件,又稱為監聽者。提供了處理事件的介面。

concreteobsever:具體觀察物件,又稱為監聽者,繼承obsever得到,實現處理事件具體功能

在觀察者中儲存監聽者,採用map鍵值儲存《事件,感興趣的監聽者》,是1-多的關係,可以將其轉換為<1,乙個監聽者集合(可以使用vector儲存)>,變為了1-1的關係,表示了哪些監聽者對事件感興趣。

觀察者監聽三個監聽者,監聽者1對事件1,2感興趣;監聽者2對事件2,3感興趣;監聽者3對事件1,3感興趣。對類之間的設計如下:

觀察者類需要提供成員函式:

【1. 註冊事件函式:】將《事件-監聽者》進行註冊,採用容器vector儲存監聽者集合。假如現在註冊1號事件的監聽者,那麼有兩種情況:1號事件被註冊,1號事件未註冊;

【通知監聽者處理事件】

先查詢是否在map中存在對它感興趣的事件,存在,提供迭代器遍歷監聽者集合,呼叫監聽者處理事件函式。

不存在,列印錯誤資訊。

提供私有成員變數:map,將事件-監聽者集合放入map中,集合用vector儲存,儲存監聽者抽象類指標,可以用基類指標指向派生類物件,訪問任意監聽者。

監聽者類:提供處理函式即可:對自己感興趣的事件進行處理,進行乙個簡單的列印。

那麼**如下:

# include

# include

# include

# include

# include

# include

# include

# include

# include

//觀察者模式

class

listen

//監聽者抽象類

virtual

void

deal

(int message)=0

;protected

: std:: string name;};

class

listen1

:public listen//監聽者1,對1,2事件感興趣

void

deal

(int message)

//對自己感興趣的事件進行處理}}

;class

listen2

:public listen//監聽者2,對2,3事件感興趣

void

deal

(int message)

//對自己感興趣的事件進行處理}}

;class

listen3

:public listen//監聽者3,對1,3事件感興趣

void

deal

(int message)

//對自己感興趣的事件進行處理}}

;class

observe

else

//不存在,將集合放入map中,使用map[鍵值]=集合插入即可

}void

notify

(int message)

//事件發生,通知監聽者

}else

//沒有監聽者對此事件感興趣

}private

://將事件-監聽者集合放入map中,集合用vector儲存,儲存監聽者抽象類指標,可以訪問任意監聽者,基類指標指向派生類物件

1號事件觸發,監聽者1,3處理;3號2,3處理;4號沒有監聽者處理;和我們的邏輯一樣。

加油哦!?。

設計模式 二十 觀察者模式

observer pattern 觀察者模式的別名包括發布 訂閱 publish subscribe 模式 模型 檢視 model view 模式 源 source listener 模式或從屬者 dependents 模式。觀察者模式是一種物件行為型模式。觀察者模式描述了如何建立物件與物件之間的依...

設計模式(二十) 觀察者模式

定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴它的物件都得到通知並更新。觀察者模式又叫發布 訂閱模式,主要描述了一種目標與觀察者之間的相互關係。目標物件一旦發生變化,它所有的觀察者都得到通知並作出相應的更新操作。下圖恰好描述了這種場景,目標物件拿出煙,觀察者紛紛掏出火柴幫忙點...

python 設計模式 觀察者 觀察者設計模式

在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...