3.观察者模式

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知自动更新。

被观察者:它必须能够动态地增加,取消观察者。它一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
观察者:观察者接收到消息后,即进行update,对接收的消息进行处理
具体的被观察者:定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知
具体的观察者:每个观察者在接收到消息后的处理反应是不同的,各个观察者有自己的处理逻辑。
参考文章

#include <iostream>
#include<string>
#include<vector>
using namespace std;
//*************************************************************
//两个观察者:李斯和周斯,只要韩非子吃早饭或者娱乐都会调用各自的update函数
//被观察者要能自己增加删除观察者,并且在自己吃早饭或者娱乐时通知所有的观察者(相当于被安插了间谍)

class IObserver		//观察者
{
public:
	IObserver(string _name):m_name(_name) {}
	virtual ~IObserver(void) {}
	virtual void Update(string context) = 0;
	virtual string GetName() = 0;
protected:
	string m_name;
};

class CLiSiObserver :public IObserver		//李斯  继承自观察者类
{
public:
	CLiSiObserver(void) :IObserver("李斯") {}
	~CLiSiObserver(void) {}
	void Update(string context) {
		cout << "李斯:观察到韩非子活动,开始向老板汇报了..." << endl;
		this->ReportToQinShiHuang(context);
		cout << "李斯:汇报完毕,秦老板赏给他两个萝卜吃吃..." << endl;
	}
	string GetName() {
		return m_name;
	}
private:
	void ReportToQinShiHuang(string report) {
		cout << "李斯:报告,秦老板!韩非子有活动了--->" << report.c_str() << endl;
	}
};


class CZhouSiObserver :	public IObserver			//周斯  继承自观察者类
{
public:
	CZhouSiObserver(void):IObserver("周斯"){}
	~CZhouSiObserver(void) {}
	void Update(string context) {
		cout << "周斯:观察到韩非子活动,自己也开始活动了..." << endl;
		this->Cry(context);
		cout << "周斯:真真的哭列了..." << endl;
	}
	string GetName() {
		return m_name;
	}
private:
	void Cry(string report) {
		cout << "周斯:为因" << report.c_str() << ", ————所以我悲伤呀!" << endl;
	}
};

//*************************************************************


class IObservable		//被观察者(被监控的人)
{
public:
	IObservable(void) {}
	virtual ~IObservable(void) {}
	virtual void AddObserver(IObserver *pObserver) = 0;		//增加观察者
	virtual void DeleteObserver(IObserver *pObserver) = 0;  //删除观察者
	virtual void NotifyObservers(string context) = 0;		//通知所有的观察者
};
class CHanFeiziObservable :public IObservable	//韩非子 继承自被观察类(被监控的)
{
public:
	CHanFeiziObservable(void) {}
	~CHanFeiziObservable(void) {}
	void AddObserver(IObserver *pObserver) {
		m_observerList.push_back(pObserver);
	}
	void DeleteObserver(IObserver *pObserver) {
		ObserverList_C_iterator it = m_observerList.begin();
		for (; it != m_observerList.end(); it++)
		{
			string name = (*it)->GetName();
			if (name.compare(pObserver->GetName()) == 0)
			{
				//找到了删除。
			}
		}
	}
	void NotifyObservers(string context) {		//通知所有观察者
		ObserverList_C_iterator it = m_observerList.begin();
		for (; it != m_observerList.end(); it++)
		{
			(*it)->Update(context);
		}
	}
	void HaveBreakfast() {
		cout << "韩非子:开始吃饭了..." << endl;
		this->NotifyObservers("韩非子在吃饭");//通知所有观察者
	}
	void HaveFun() {
		cout << "韩非子:开始娱乐了..." << endl;
		this->NotifyObservers("韩非子在娱乐");//通知所有观察者
	}
private:
	vector<IObserver*> m_observerList;
	typedef vector<IObserver*>::const_iterator ObserverList_C_iterator;
};


int main()
{
	IObserver *pLiSi = new CLiSiObserver();		//多态指针
	IObserver *pZhouSi = new CZhouSiObserver();

	CHanFeiziObservable *pHanFeiZi = new CHanFeiziObservable();

	pHanFeiZi->AddObserver(pLiSi);
	pHanFeiZi->AddObserver(pZhouSi);
	pHanFeiZi->HaveBreakfast();

	delete pLiSi;
	pLiSi = NULL;
	delete pHanFeiZi;
	pHanFeiZi = NULL;
	return 0;

	/*

		韩非子:开始吃饭了...
		李斯:观察到韩非子活动,开始向老板汇报了...
		李斯:报告,秦老板!韩非子有活动了--->韩非子在吃饭
		李斯:汇报完毕,秦老板赏给他两个萝卜吃吃...
		周斯:观察到韩非子活动,自己也开始活动了...
		周斯:为因韩非子在吃饭, ————所以我悲伤呀!
		周斯:真真的哭列了...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值