C 11實現觀察者模式

2021-07-30 04:40:22 字數 1039 閱讀 8720

c++11中的std::function可以接受函式指標、std::bind、lambda表示式等函式,可以達到很鬆的耦合,簡直就是為事件機制設計的。但是不能簡單判斷兩個std::function是不是同一函式,所以下面我用id來標識listener

我模仿c#的委託實現了觀察者模式:

#pragma once

#include

#include

#include

template

class event final

; std::map

m_listeners;

int m_nextlistenerid = 0;

public:

// 返回listener id

int addlistener(functiontype callback)

void deletelistener(int listenerid)

void

operator () (argtypes... args)

catch (std::bad_function_call&)

if (m_listeners._isnil(it._mynode()))}}

};// 先監聽先被呼叫

template

using preevent = event, argtypes...>;

// 先監聽後被呼叫

template

using postevent = event, argtypes...>;

使用方法:

preeventstd::string&> g_someevent;

int _tmain(int argc, _tchar* argv)

); // 觸發事件

g_someevent(123, "test");

// 刪除***

g_someevent.deletelistener(id);

return

0;}

11 觀察者模式

觀察者模式 observer 是一種行為性模型,行為型模式關注的是系統中物件之間的相互互動,解決系統在執行時物件之間的相互通訊和協作,進一步明確物件的職責。相比來說,建立型模式關注物件的建立過程,結構型模式關注物件和類的組合關係。觀察者模式主要用於1對n的通知。當乙個物件的狀態變化時,他需要及時告知...

C 實現觀察者模式

定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。完美的將觀察者和被觀察的物件分離開。有時又被稱為 模型 檢視 view 模式 源 收聽者 listener 模式 或為發布 訂閱模式 目標就是通知的發布者,觀察者是通知的訂閱者 接受通知 obse...

C 實現觀察者模式

舉乙個例子 報社發行報紙 你訂閱報紙,一旦有新一期的報紙發行,新報紙就會送到你家裡,只要你一直訂閱,你就一直會收到新報紙 你不再訂閱報紙的時候,就收不到以後的新報紙了 報社運營的時候,一直會有人去訂閱或者取消訂閱報紙.發布者 訂閱者 觀察者模式 publishers subscribers obse...