c++学习笔记(9):观察者模式

结合map实现观察者模式
1.观察者:观察事件并分发(给这个事件感兴趣的监听者)
2.监听者:处理事件
在这里插入图片描述
一个事件可能存在有一个监听者集合对它感兴趣。所以用到map、与vector容器。

//观察者
class Observe
{
public:
	typedef std::map<int,std::vector<const Listener*> > MMAP;//类型重定义,因为每个事件可能有多个监听者对它感兴趣,键值对中的值是一个vector容器
	void registermessage(int message,const Listener* plist)//注册事件
	{
		MMAP::iterator fit=mp.find(message);
		if(fit!=mp.end())//事件已被注册了
		{
			fit->second.push_back(plist);//把感兴趣的监听者插入vector之后
		}
		else
		{
			std::vector<const Listener*> vec;
			vec.push_back(plist);
			mp[message]=vec;
		}
	}
	void notify(int message)//分发事件
	{
		MMAP::iterator fit=mp.find(message);
		if(fit==mp.end())
		{
			throw std::exception("没有监听到这个事件");
		}
		else
		{
			MMAP::mapped_type::iterator it=fit->second.begin();
			for(it;it!=fit->second.end();it++)
			{
				(*it)->handlemessage(message);
			}
		}
	}
private:
	MMAP mp;
};
//监听者:一个监听者可能对多个事件感兴趣
class Listener
{
public:
	Listener(std::string name):mname(name){}
	virtual void handlemessage(int message)const=0;//每个监听者会根据事件作出不同的处理
public:
	std::string mname;
};
//具体处理事件
class TestListener:public Listener
{
public:
	TestListener(std::string name):Listener(name){}
	void handlemessage(int message)const
	{
		switch(message)
		{
		case 1:
			std::cout<<mname<<" 1已经被处理了"<<std::endl;
			break;
		case 2:
			std::cout<<mname<<" 2已经被处理了"<<std::endl;
		   break;
		case 3:
			std::cout<<mname<<" 3已经被处理了"<<std::endl;
		   break;
		default:
			std::cout<<message<<" message 不是我所感兴趣的!"<<std::endl;
			break;
		}
	}
};

猜你喜欢

转载自blog.csdn.net/qq_42111463/article/details/86584539