生产消费者应该是一个非常容易使用的设计模式,这个是我在一个网络教材上看到的一个示例代码,使用了模板和聚合,我转载分享下,源代码如下:
#include <iostream>
#include <vector>
using namespace std;
//空类,用于指代响应者对象
class Empty {};
//事件响应者类模板,保存特定事件的响应者与响应行为
template< typename EventAction > class EventResponsor
{
public:
EventResponsor() : actor(NULL), action(NULL) { }
EventResponsor(Empty * actor, EventAction * action) : actor(actor), action(action) { }
friend bool operator==(const EventResponsor & lhs, const EventResponsor & rhs)
{
return lhs.actor == rhs.actor && *lhs.action == *rhs.action;
}
public: // 公开的数据成员,以方便使用者
Empty * actor;
EventAction * action;
}; //template<typename EventAction> class EventResponsor
//事件类模板,用于管理特定事件的所有响应者
template< typename EventAction > class Event
{
public:
typedef vector<EventResponsor<EventAction>> EventResponsors;
typedef typename vector<EventResponsor<EventAction>>::iterator EventIterator;
public:
virtual ~Event()
{
for (EventIterator it = this->_ers.begin(); it != this->_ers.end(); ++it)
{
delete it->action, it->action = NULL;
}
}
EventResponsors & GetResponsors() { return this->_ers; }
//事件绑定,将实际响应者和响应行为挂接到事件响应者对象上
template< typename Responsor, typename Action >
void Bind(Responsor * actor, Action action)
{
Action * act = new Action(action);
EventResponsor<EventAction> er((Empty*)actor, (EventAction*)act);
bool unbound = true;
for (EventIterator it = this->_ers.begin(); it != this->_ers.end(); ++it)
{
if (*it == er) // 发现重复的事件响应者,说明已绑定
{
unbound = false; break;
}
}
if (unbound)
this->_ers.push_back(er);
else
delete er.action, er.action = NULL;
}
//解除事件绑定,删除事件响应者对象
template< typename Responsor, typename Action >
void Unbind(Responsor * actor, Action action)
{
Action * act = new Action(action);
EventResponsor<EventAction> er((Empty*)actor, (EventAction*)act);
for (EventIterator it = this->_ers.begin(); it != this->_ers.end(); ++it)
{
if (*it == er) // 找到待删除的事件响应者对象
{
delete it->action, this->_ers.erase(it); break;
}
}
delete er.action, er.action = NULL;
}
private:
EventResponsors _ers;
}; // template<typename EventAction> class Event
// 定义事件委托模型、指向类成员函数的指针
typedef Empty EventDelegator;
typedef void (EventDelegator::*ValueChanged)(int value, void * tag);
// 触发者
class Trigger
{
public:
Trigger() : _value(0) { }
void SetValue(int value, void * tag);
int GetValue() { return _value; }
public:
// 值变化事件,公开属性,方便在类外设定
Event<ValueChanged> value_changed;
private:
int _value;
};
// 设定值,遍历特定事件的响应对象列表,逐一触发值变更事件
void Trigger::SetValue(int value, void * tag)
{
if (_value == value)
return;
_value = value;
Event<ValueChanged>::EventResponsors ers;
ers = this->value_changed.GetResponsors();
if (!ers.empty())
{
Event<ValueChanged>::EventIterator it;
for (it = ers.begin(); it != ers.end(); ++it)
{
((it->actor)->*(*(it->action)))(value, tag); // 响应事件
}
}
}
// 行动者
class Actor
{
public:
// 侦听事件,绑定本对象的事件响应函数到侦听的事件
void Listen(Trigger * trigger)
{
trigger->value_changed.Bind(this, &Actor::OnValueChanged);
}
// 停止侦听,从侦听的事件中取消绑定本对象的事件响应活动
void Unlisten(Trigger * trigger)
{
trigger->value_changed.Unbind(this, &Actor::OnValueChanged);
}
// 值变更事件的响应函数
void OnValueChanged(int value, void * tag)
{
cout << reinterpret_cast<char*>(tag) << value << "." << endl;
}
};
class Actor1
{
public:
// 侦听事件,绑定本对象的事件响应函数到侦听的事件
void Listen(Trigger * trigger)
{
trigger->value_changed.Bind(this, &Actor1::OnValueChanged1);
}
// 停止侦听,从侦听的事件中取消绑定本对象的事件响应活动
void Unlisten(Trigger * trigger)
{
trigger->value_changed.Unbind(this, &Actor1::OnValueChanged1);
}
// 值变更事件的响应函数
void OnValueChanged1(int value, void * tag)
{
cout << reinterpret_cast<char*>(tag) << value << "." << endl;
}
};
int main()
{
const char* s = "Now the value is ";
Trigger t;
Actor a1;
Actor1 a2;
a1.Listen(&t);
a2.Listen(&t);
cout << "Listening..." << endl;
t.SetValue(10, reinterpret_cast<void*>(const_cast<char*>(s)));
a2.Unlisten(&t);
cout << "Listening again..." << endl;
t.SetValue(20, reinterpret_cast<void*>(const_cast<char*>(s)));
return 0;
}