设计模式——> 观察者模式

观察者模式又被称为模型(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;
		}
	}
};

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值