观察者:感知事件发生。
监听者:监听事件、处理事件。将监听者感兴趣的事件注册到观察者上。由观察者进行事件统一的观察,观察到事件发生后,观察者会通知所有对该事件感兴趣的监听者,该事件发生了,让监听者处理事件。
如图所示:
代码如下:
#include
#include
#include
#include
using namespace std;
class Listener
{
public:
Listener(string name):_name(name) {}
virtual void handleMessage(int msgid)=0;
string _name;
};
class Listener1:public Listener
{
public:
Listener1(string name):Listener(name) {}
void handleMessage(int msgid)
{
cout<<_name<<"";
switch(msgid)
{
case 0:
cout<<"handle 0 msg!"<<endl;
break;
case 1:
cout<<"handle 1 msg!"<<endl;
break;
default:
cout<<"recv invalid msg!"<<endl;
break;
}
}
};
class Listener2:public Listener
{
public:
Listener2(string name):Listener(name) {}
void handleMessage(int msgid)
{
cout<<_name<<"";
switch(msgid)
{
case 0:
cout<<"handle 0 msg!"<<endl;
break;
case 2:
cout<<"handle 2 msg!"<<endl;
break;
default:
cout<<"recv invalid msg!"<<endl;
break;
}
}
};
class Listener3:public Listener
{
public:
Listener3(string name):Listener(name) {}
void handleMessage(int msgid)
{
cout<<_name<<"";
switch(msgid)
{
case 1:
cout<<"handle 1 msg!"<<endl;
break;
case 3:
cout<<"handle 3 msg!"<<endl;
break;
default:
cout<<"recv invalid msg!"<<endl;
break;
}
}
};
class Observer
{
public:
void registerMsg(Listener *plistener,int msgid)
{
map>::iterator it=_obserMap.find(msgid);
if(it==_obserMap.end())
{
vector vec;
vec.push_back(plistener);
_obserMap.insert(make_pair(msgid,vec));
}
else
{
it->second.push_back(plistener);
}
}
void dispatchMsg(int msgid)
{
map>::iterator it=_obserMap.find(msgid);
if(it!=_obserMap.end())
{
vector::iterator vit=it->second.begin();
for(; vit!=it->second.end();++vit)
{
(*vit)->handleMessage(msgid);
}
}
}
private:
map> _obserMap;
};
int main()
{
Listener *p1=new Listener1("Listener1");
Listener *p2=new Listener1("Listener2");
Listener *p3=new Listener1("Listener3");
Observer obser;
obser.registerMsg(p1,0);
obser.registerMsg(p1,1);
obser.registerMsg(p2,0);
obser.registerMsg(p2,2);
obser.registerMsg(p3,1);
obser.registerMsg(p3,3);
int msgid=0;
while(1)
{
cout<<"msgid:";
cin>>msgid;
if(msgid==5)
{
break;
}
obser.dispatchMsg(msgid);
}
}
运行结果如下: