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...