适用于:定义对象间一对多的依赖关系,使得每一个对象改变状态,则所有以来于他们的对象都会得到通知
#include<list>
class Secretary;
//观察者
class PlayerObserver {
public:
PlayerObserver(Secretary *secretary) {
this->m_secretary = secretary;
}
void update(string action) {
cout << "actiong:" << action << endl;
}
private:
Secretary *m_secretary;
};
class Secretary {
public:
Secretary() {
this->m_list.clear();
}
void Notify(string info) {
for (list<PlayerObserver*>::iterator it = m_list.begin(); it != m_list.end(); it++)
{
(*it)->update(info);
}
}
void setPlayerObserver(PlayerObserver *o)
{
m_list.push_back(o);
}
private:
list<PlayerObserver*>m_list;
};
void main() {
Secretary *secretary = NULL;
PlayerObserver *po1 = NULL;
PlayerObserver *po2 = NULL;
secretary = new Secretary;
po1 = new PlayerObserver(secretary);
po2 = new PlayerObserver(secretary);
secretary->setPlayerObserver(po1);
secretary->setPlayerObserver(po2);
secretary->Notify("老板来了");
secretary->Notify("老板走了");
delete secretary;
delete po1;
delete po2;
system("pause");
}
观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。