监听者—观察者模式

class Listener       //监听者的基类
{
public:
	Listener(string name):mName(name){}
	virtual void handleMessage(int iMessage) const=0;     //对感兴趣的事件进行处理
protected:
	string mName;
};

class TestListener1:public Listener
{
public:
	TestListener1(string name):Listener(name){}
	void handleMessage(int message)const
	{
		switch(message)
		{
		case 0:
			cout<<mName<<" 0 msg "<<endl;
			break;
		case 1:
			cout<<mName<<" 1 msg "<<endl;
			break;
		default:
			cout<<mName<<" unknown msg "<<endl;
		}
	}

 
};

class TestListener2:public Listener
{
public:
	TestListener2(string name):Listener(name){}
	void handleMessage(int message)const
	{
		switch(message)
		{
		case 0:
			cout<<mName<<" 1 msg "<<endl;
			break;
		case 1:
			cout<<mName<<" 2 msg "<<endl;
			break;
		default:
			cout<<mName<<" unknown msg "<<endl;
		}
	}


};

class TestListener3:public Listener
{
public:
	TestListener3(string name):Listener(name){}
	void handleMessage(int message)const
	{
		switch(message)
		{
		case 0:
			cout<<mName<<" 0 msg "<<endl;
			break;
		case 1:
			cout<<mName<<" 3 msg "<<endl;
			break;
		default:
			cout<<mName<<" unknown msg "<<endl;
		}
	}
};

class Observer      //观察者
{
public:
	typedef map<int,vector<const Listener*>> TYPE;
	typedef pair<int,vector<const Listener*>> VALUE_TYPE;
	    /*注册消息,用map表将消息类型和对该消息感兴趣的监听者保存,因为对某一		消息感兴趣的监听者不止一个,所以将他们用一个vector保存,map表的键是消		息类型,值是保存监听者的vector*/
static void registerListener(int msg,const Listener * inLinster)
	{
		
		vector<const Listener*> tmpVec;
		TYPE::iterator it = sListenerMap.find(msg);
		if(it==sListenerMap.end())
		{
			tmpVec.push_back(inLinster);
			sListenerMap.insert(VALUE_TYPE(msg,tmpVec));
		}
		else
		{
			it->second.push_back(inLinster);
		}
	}
	static void dispatchMessage(int msg)     //分发消息,
	{
		typedef vector<const Listener*> VEC_TYPE;
		TYPE::iterator it = sListenerMap.find(msg);
		if(it==sListenerMap.end())
		{
			return ;
		}
		VEC_TYPE::iterator vecit = it->second.begin();
		for(;vecit!=it->second.end();++vecit)
		{
			(*vecit)->handleMessage(msg);       //若找到该消息的监听者,调用他的处理                          												//消息的方法
		}
	}
protected:
	static map<int,vector<const Listener*>>  sListenerMap;
};


map<int,vector<const Listener*>>  Observer::sListenerMap;

int main()
{
	Observer obser;

	Listener *p1 = new TestListener1("test1");
	Listener *p2 = new TestListener2("test2");
	Listener *p3 = new TestListener3("test3");

	obser.registerListener(0, p1);
	obser.registerListener(1, p1);
	obser.registerListener(1, p2);
	obser.registerListener(2, p2);
	obser.registerListener(0, p3);
	obser.registerListener(3, p3);

	int msg;
	while(true)
	{
		cout<<"msg:";
		cin>>msg;
		if(msg==-1)
		{
			break;
		}
		obser.dispatchMessage(msg);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值