角色
subject(被观察者)
被观察的对象。当被观察对象的状态发生变化时,需要通知队列中所有观察者对象。
ConcreteSubjec
被观察者的具体实现。包含一些基本的属性以及操作。
Observer(观察者)
接口或抽象类。当subject的状态发生变化时,Observer对象通过一个callback函数得到通知。
ConcreteObserver
观察者的实现。
应用场景
侦听事件驱动程序设计中的外部事件
侦听/监视某个对象的状态变化
发布者/订阅者模型中,当一个外部事件被触发时,通知邮件列表郑工的订阅者。
定义对象间一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。
代码实现:
#include<iostream>
#include<string>
#include<list>
using namespace std;
class Monitor;
class Observer
{
public:
Observer(Monitor* mMonitor)
{
this->mMonitor = mMonitor;
}
void update()
{
cout << "update too scary" << endl;
}
private:
Monitor* mMonitor;
};
class Monitor
{
public:
void setObserver(Observer* Ob)
{
m_list.push_back(Ob);
}
void Update()
{
for (list< Observer*>::iterator it = m_list.begin(); it != m_list.end(); ++it)
{
(*it)->update();
}
}
private:
list< Observer*> m_list;
};
int main()
{
Monitor* cpMonitor = nullptr;
Observer* cpObserver1 = nullptr;
Observer* cpObserver2 = nullptr;
cpMonitor = new Monitor;
cpObserver1 = new Observer(cpMonitor);
cpObserver2 = new Observer(cpMonitor);
cpMonitor->setObserver(cpObserver1);
cpMonitor->setObserver(cpObserver2);
cpMonitor->Update();
delete cpMonitor;
delete cpObserver1;
delete cpObserver2;
return system("pause");
}