监听者对大家来说可能并不陌生,所谓监听者就是用来监听自已感兴趣的事件的,当收到自已感兴趣的事件时会做出相应的反映。
它的应用是非常广的,比如win32的消息机制,它跟监听者模式就异曲同工,操作系统将产生的各种事件包装成消息(MSG),该消息结构包装了发生的事件 的描述信息,比如消息值,屏幕坐标等,然后将它投递到相应的进程中,当该进程收到该消息时会查看该MSG结构中的信息,也就知道了发生了什么事件,并对自 已感兴趣的事件进行响应。
监听器模式是观察者模式的一种实现,也可以说是一种特殊称呼,比"观察者"更直观易理解.
#include <iostream>
#include <list>
using namespace std;
class IListener
{
public:
IListener(){};
virtual ~IListener(){};
virtual void ActionPerformed(int state) = 0;
};
//Listener实现类(它类似于操作系统中的进程)
class StateListener : public IListener
{
public:
StateListener(){};
virtual ~StateListener(){};
virtual void ActionPerformed(int state);
};
void StateListener::ActionPerformed(int state)
{
//这里就是对自已感兴趣的事件的相应处理
if(state == 1)
{
cout<<"event 1 is fired."<<endl;
}
else if(state == 2)
{
cout<<"event 2 is fired."<<endl;
}
else
{
cout<<"other event is fired."<<endl;
}
}
//Listener Center(类似于操作系统(OS))
class ListenerCenter
{
private:
list<IListener*> m_lstListener;
public:
ListenerCenter(){};
virtual ~ListenerCenter(){};
int GetCount();
void AddListener(IListener* listener);//如果用SetListener,则相当于桥模式
void DeleteListener(IListener* listener);
void Fire(int state);
};
int ListenerCenter::GetCount()
{
return (int)m_lstListener.size();
}
void ListenerCenter::AddListener(IListener* listener)
{
m_lstListener.push_back(listener);
}
void ListenerCenter::DeleteListener(IListener *listener)
{
m_lstListener.remove(listener);
}
void ListenerCenter::Fire(int state)
{
for(list<IListener*>::iterator iter = m_lstListener.begin(); iter != m_lstListener.end(); ++iter)
{
(*iter)->ActionPerformed(state);
}
}
int main(int argc, char* argv[])
{
ListenerCenter listenerCenter;
IListener* lis1 = new StateListener;
IListener* lis2 = new StateListener;
listenerCenter.AddListener(lis1);
listenerCenter.AddListener(lis2);
listenerCenter.Fire(1);
listenerCenter.Fire(2);
listenerCenter.Fire(3);
delete lis1;
delete lis2;
return 0;
}