定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知自动更新。
被观察者:它必须能够动态地增加,取消观察者。它一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
观察者:观察者接收到消息后,即进行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;
/*
韩非子:开始吃饭了...
李斯:观察到韩非子活动,开始向老板汇报了...
李斯:报告,秦老板!韩非子有活动了--->韩非子在吃饭
李斯:汇报完毕,秦老板赏给他两个萝卜吃吃...
周斯:观察到韩非子活动,自己也开始活动了...
周斯:为因韩非子在吃饭, ————所以我悲伤呀!
周斯:真真的哭列了...
*/
}