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

优点: 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;
}

运行结果如下: