观察者模式又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式
观察者模式(MVC模式)
MVC
M model 数据 观察者
V view 界面/视图 监听者
c control 逻辑处理
观察者模式的三要素:观察者,被观察者,事件
观察者:观察事件并分发(将事件给对事件感兴趣的监听者)
监听者:监听事件 处理事件
三者关系如下:
监听者将将感兴趣的事件注册到观察者上,由观察者进行统一的观察,观察到事件发生后,观察者会通知所有对该事件感兴趣的监听者事件发生,让监听者去处理事件
一个事件可能有很多监听者感兴趣即一对多的关系,所以用一个监听者集合,用map,vector容器
参考代码如下
#include<iostream>
#include<vector>
#include<map>
#include<iterator>
#include<functional>
#include<algorithm>
#include<stack>
#include<queue>
#include<string>
class Observe //观察者
{
public:
typedef std::map<int, std::vector<const Listener*>> MMAP;
void registermessage(int message, const Listener* plist) //注册事件
{
MMAP::iterator fit = mp.find(message); //查找事件
if (fit != mp.end() ) //事件已被注册
{
fit->second.push_back(plist);
}
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("no listen this thing!"); //没有这个事件发生
}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;
protected:
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 message has been handle" << std::endl;
break;
case 2:
std::cout << mname << " 2 message has been handle" << std::endl;
break;
case 3:
std::cout << mname << " 3 message has been handle" << std::endl;
break;
default:
std::cout << message << " message is not instersting!" << std::endl; //没有监听者对这个事件感兴趣
break;
}
}
};