结合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;
}
}
};