简介
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在主题对象的状态发生变化时,所有依赖于它的对象都得到主题对象的通知并被自动更新。
角色与职责
Subject(目标)
- 目标知道它的观察者。可以有任意多个观察者观察同一个目标;
- 提供注册和删除观察者对象的接口。
Observer(观察者)
- 为那些在目标发生改变时需获得通知的对象定义一个更新接口。
ConcreteSubject(具体目标)
- 将有关状态存入各ConcreteObserver对象;
- 当它的状态发生改变时,向它的各个观察者发出通知。
ConcreteObserver(具体观察者)
- 维护一个指向ConcreteSubject对象的引用;
- 存储有关状态,这些状态应与目标的状态保持一致;
- 实现Observer的更新接口以使自身状态与目标的状态保持一致。
实现
#include <iostream>
#include <string>
#include <list>
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
using namespace std;
class Secretary;
// 观察者
class PlayerObserver {
public:
PlayerObserver(Secretary* secretary) :m_secretary(secretary) {}
void update(string action) {
cout << "action : " << action << endl;
}
private:
Secretary* m_secretary;
};
// 主题对象,被观察者
class Secretary {
public:
Secretary() {
m_list.clear();
}
void nodify(string action) {
for (list<PlayerObserver*>::iterator it = m_list.begin(); it != m_list.end(); it++) {
(*it)->update(action);
}
}
void setPlayerObserver(PlayerObserver* o) {
m_list.push_back(o);
}
private:
list<PlayerObserver*> m_list;
};
int 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->nodify("请注意,老板来了");
secretary->nodify("请放心,老板走了");
SAFE_DELETE(po1);
SAFE_DELETE(po2);
SAFE_DELETE(secretary);
std::cin.get();
return 0;
}