我正在设计一个应该以这种方式工作的观察者模式:观察者调用AddEventListener
方法EventDispatcher
并传递一个字符串,该字符串是event
、PointerToItself和PointerToItsMemberMethod的名称
之后event
发生在EventDispatcher
; 它查看订阅列表,如果有的话,分配给这个事件的action
方法调用observer
.
我来到了这个EventDispatcher.h
。CAUTION包含一些伪代码。
有两个问题:
- 如何定义
action
in的类型struct Subscription
? - 我走对了吗?
PS:不,我不会使用boost
或任何其他库。
#pragma once
#include <vector>
#include <string>
using namespace std;
struct Subscription
{
void* observer;
string event;
/* u_u */ action;
};
class EventDispatcher
{
private:
vector<Subscription> subscriptions;
protected:
void DispatchEvent ( string event );
public:
void AddEventListener ( Observer* observer , string event , /* u_u */ action );
void RemoveEventListener ( Observer* observer , string event , /* u_u */ action );
};
这个头文件是这样实现的EventDispatcher.cpp
#include "EventDispatcher.h"
void EventDispatcher::DispatchEvent ( string event )
{
int key = 0;
while ( key < this->subscriptions.size() )
{
Subscription subscription = this->subscriptions[key];
if ( subscription.event == event )
{
subscription.observer->subscription.action;
};
};
};
void EventDispatcher::AddEventListener ( Observer* observer , string event , /* */ action )
{
Subscription subscription = { observer , event , action );
this->subscriptions.push_back ( subscription );
};
void EventDispatcher::RemoveEventListener ( Observer* observer , string event , /* */ action )
{
int key = 0;
while ( key < this->subscriptions.size() )
{
Subscription subscription = this->subscriptions[key];
if ( subscription.observer == observer && subscription.event == event && subscription.action == action )
{
this->subscriptions.erase ( this->subscriptions.begin() + key );
};
};
};