C 設計模式新解四 觀察者模式 事件訂閱

2021-07-08 21:58:24 字數 2540 閱讀 5094

定義:定義物件間的一種一對多關係的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。

觀察者模式又被稱為發布/訂閱模式,在這種模式中,乙個目標物件(被觀察者)管理所有相依於它的相關物件(觀察者),並且在目標物件的狀態發生改變時主動發出通知。這通常通過各物件所提供的方法來實現,觀察者模式通常被用來做事件處理系統。

再舉個例子:使用者介面是觀察者,業務資料可以作為被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在使用者介面上。

至少需要兩個角色:觀察者類和被觀察者類。

在實現觀察者模式的多種形式中,比較直觀的是一種「註冊----通知----撤銷註冊」的形式。

通知:一旦被觀察物件中的狀態發生變化,則通知容器中所有的觀察者物件做出相應變化。

撤銷註冊:將被觀察者物件容器中某個要撤銷的觀察者物件刪除。

實際上這種實現方式不僅要包含被觀察者和觀察者類。因為觀察者物件要把自己註冊到被觀察者物件容器中,被觀察者不應該過問觀察者的具體型別,而應該使用觀察者提供的介面。優點是,假定還有別的觀察者,那麼只要這個觀察者也是相同的介面實現即可。基於介面而不是具體實現,為程式提供了強大的靈活性。也就是說要包含所有觀察者的基類。

以下為observedesign.h的源**

#include #include #include #include #include #include "stdafx.h"

using namespace std;

typedef enum

event_id;

//觀察的事件

struct myevent

bool operator == (const myevent & rhs)

bool operator < (const myevent & rhs) const;

};struct loginevent: public myevent

};struct logoutevent: public myevent

};struct myentity;

struct eventengine

public:

static eventengine * getinstance()

return minstance;

}};void fireevent(myevent pevent)

eventengine * eventengine::minstance = null;

//觀察者(建立該類的虛函式是為了讓繼承自它的類具體實現該虛函式,以便於在事件管理器的**編寫,事件觸發時,直接呼叫callback()函式)

struct myentity

virtual void callback() = 0;

void subscribe(myevent pevent)

void unsubscribe(myevent pevent)

int getid()

private:

int mid;

};//英雄

struct hero: public myentity

void callback()

;};//怪物

struct monster: public myentity

void callback()

;};

以下為observedesign.cpp的源**

#include "observedesign.h"

bool myevent::operator < (const myevent & rhs) const

void eventengine::attach(myevent pevent, myentity * pentity)

else }

void eventengine::detach(myevent pevent)

} }}void eventengine::detachall()

m_map.clear();

}void eventengine::fire(myevent pevent) }}

int main()

這裡做了以下幾個小改動。

1.將所有的觀察者與被觀察者放在乙個eventengine管理類統一管理。

2.全部觀察者繼承同乙個介面,便於管理。

ps,本例中觀察者為myentity以及實現該介面的全部子類,

被觀察者為myevent以及實現該介面的全部子類。

eventengine使用單例模式統一管理全部的註冊事件的物件。eventengine採用的容器是以event事件id作為key,訂閱該事件的全部觀察者物件的list作為value的map。

list是當訂閱相同事件的物件註冊事件時,直接把該物件插入list就可以了。

我們的採用eventid以及物件的id聯合的方式作為訂閱該事件的物件的訂閱標準。

既可以區分開不同的事件,也可以區分開不同的訂閱該事件的訂閱者。

全部的**就是為了 fireevent這一瞬間做準備。

如果還有什麼疑問,最好自己寫一遍**,一切清楚。

C 事件和觀察者設計模式

observer設計模式簡介 現在假設熱水器由三部分組成 熱水器 警報器 顯示器,它們來自於不同廠商並進行了組裝。那麼,應該是熱水器僅僅負責燒水,它不能發出警報也不能顯示水溫 在水燒開時由警報器發出警報 顯示器顯示提示和水溫。observer 設計模式中主要包括如下兩類物件 subject 監視物件...

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

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

C 設計模式 觀察者模式

觀察者模式 也可以稱為通知者模式,訂閱 發布模式 模型 檢視模式 大致概念 乙個主題 theme 多個觀察者 observer 收聽它。就好比 春節聯歡晚會 theme 全國觀眾 observer 現場直播。那麼我們怎樣看直播呢?沒有電視你看的成嗎?有電視,但是沒有全國直播,你看的成嗎?好了,這樣說...