21 观察者模式

观察者模式是行为模式之一,他的作用就是当一个对象的状态发生改变时,可以由这个对象自动通知其他关联对象,主动去刷新他们的状态。

优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

类图如下:

示例代码如下:

#include <iostream>
#include <string>
#include <list>

using namespace std;

class Boss;

/* 观察者类 */
class PlayserObserver
{
public:
	PlayserObserver(Boss* b)
	{
		boss = b;
	}
	void update(string action)
	{
		if("我来了" == action)
		{
			cout << "老板来了,我很害怕" << endl;
		}
		else if ("我走了" == action)
		{
			cout << "老板走了,我又可以打游戏了" << endl;
		}

	}
private:
	/* 观察对象 */
	Boss* boss;
};

/* 被观察者类 */
class Boss
{
public:
	Boss()
	{
		m_list.clear();
	}
	/* 通知其关联对象,Boss的状态已经发生改变了 */
	void Notify(string info)
	{
		for (list<PlayserObserver *>::iterator it = m_list.begin();it != m_list.end();it++)
		{
			(*it)->update(info);
		}
	}
	void addPlayserObserver(PlayserObserver* p)
	{
		m_list.push_back(p);
	}
private:
	list<PlayserObserver *> m_list;
};

int main()
{
	Boss *boss = new Boss;
	PlayserObserver * p1 = new PlayserObserver(boss);
	PlayserObserver * p2 = new PlayserObserver(boss);
	PlayserObserver * p3 = new PlayserObserver(boss);

	boss->addPlayserObserver(p1);
	boss->addPlayserObserver(p2);
	boss->addPlayserObserver(p3);

	boss->Notify("我来了");
	boss->Notify("我走了");
	delete boss;
	delete p1;
	delete p2;
	delete p3;

	system("pause");

	return 0;
}

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiang木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值