观察者监听者模式

观察者:感知事件发生。

监听者:监听事件、处理事件。将监听者感兴趣的事件注册到观察者上。由观察者进行事件统一的观察,观察到事件发生后,观察者会通知所有对该事件感兴趣的监听者,该事件发生了,让监听者处理事件。

如图所示:

观察者监听者模式

代码如下:

#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);

 

}

}

运行结果如下:

观察者监听者模式









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值