设计模式 --- 观察者模式( Observer 模式 )

监听者
处理事件
观察者
观察事件
通知感兴趣的监听者取处理事件

从定义上看:观察者模式 是当对象间存在一对多关系时,则使用观察者模式 ,比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式 属于 行为型模式。
其实,我所理解的 观察者模式 ,就是观察和被观察对象之间的关系,好比说,在拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。在这里面,拍卖师是观察者,而那些竞价者,是被观察者,文字不太好理解是吧,那我们画个图看一下:

在这里插入图片描述
从图中我们可以看到,拍卖师观察竞价者1的标价,拿到了最高标价,然后在通知其他竞价者,这就是一个简单的观察者模式图示,仔细看一下这个图,我们会发现,最基础的观察者模式中,涉及以下几种角色:

被观察者:竞价者们;
观察者:拍卖师;
具体的被观察者:竞价者们的出价动作;
具体的观察者:拍卖师观察竞价者的动作;

class Listener
{
public:
	Listener(std::string nm) :name(nm){}
	virtual void hanlemessege(int message)const = 0 ;
protected:
	std::string name;
};
class Listener1 : public Listener
{
public:
	Listener1(std::string name) :Listener(name){}
	void hanlemessege(int message)const
	{
		switch (message)
		{
		case 1:
			std::cout << name << " has been handle this " << message << "message" << std::endl;
			break;
		case 2:
			std::cout << name << " has been handle this " << message << "message" << std::endl;
			break;
		default:
			std::cout << " no interst this " << message << "message" << std::endl;
			break;
		}
	}
};
class Listener2 : public Listener
{
public:
	Listener2(std::string name) :Listener(name){}
	void hanlemessege(int message)const
	{
		switch (message)
		{
		case 2:
			std::cout << name << " has been handle this " << message << "message" << std::endl;
			break;
		case 3:
			std::cout << name << " has been handle this " << message << "message" << std::endl;
			break;
		default:
			std::cout << " no interst this " << message << "message" << std::endl;
			break;
		}
	}
};
class Listener3 : public Listener
{
public:
	Listener3(std::string name) :Listener(name){}
	void hanlemessege(int message)const
	{
		switch (message)
		{
		case 1:
			std::cout << name << " has been handle this " << message << "message" << std::endl;
			break;
		case 3:
			std::cout << name << " has been handle this " << message << "message" << std::endl;
			break;
		default:
			std::cout << " no interst this " << message << "message" << std::endl;
			break;
		}
	}
};

class Oberse
{
public:
	typedef std::map<int, std::vector<const Listener*>> MMAP;
	void registermessege(int message, const Listener* pl)
	{
		MMAP::iterator fit = mymap.find(message);
		if (fit != mymap.end())
		{
			fit->second.push_back(pl);
		}
		else
		{
			std::vector<const Listener*> vec;
			vec.push_back(pl);
			mymap.insert(std::pair<int, std::vector<const Listener*>>(message, vec));
		}
	}
	void notify(int message)
	{
		MMAP::iterator fit = mymap.find(message);
		if (fit != mymap.end())
		{
			std::vector<const Listener*>::iterator it = fit->second.begin();
			while (it != fit->second.end())
			{
				(*it)->hanlemessege(message);
				it++;
			}
		}
	}
public:
	std::map<int, std::vector<const Listener*>> mymap;
};
int main()
{
	Listener1 l1("listener1");
	Listener2 l2("listener2");
	Listener3 l3("listener3");

	Oberse ob;
	ob.registermessege(1, &l1);
	ob.registermessege(2, &l1);
	ob.registermessege(2, &l2);
	ob.registermessege(3, &l2);
	ob.registermessege(1, &l3);
	ob.registermessege(3, &l3);

	ob.notify(2);
	return 0;
}

总结一下:

从表面上看:
观察者模式里,只有两个角色 —— 观察者+被观察者
而发布订阅模式,却不仅仅只有发布者和订阅者两个角色,还有第三个角色-经纪人Broker存在。

往更深层次讲:
观察者和被观察者,是松耦合的关系;
发布者和订阅者,则完全不存在耦合。
其实我们在学习设计模式的时候,很多模式的实现,都是有一定依据的,首先离不开的就是面向对象三大特性,其次是面向对象七大原则,而设计模式则是对面向对象更具体的实现,我们学习这些模式的时候,还是要多去写代码实践一下,这些能有效的帮助我们优化代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值