- 观察者模式:创建了对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。
- 主要角色:
- 抽象被观察者
- 抽象观察者
- 具体被观察者
- 具体观察者
#include <iostream>
#include <list>
using namespace std;
/*
* 观察者模式
* 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
* */
class Publisher;
// 订阅者/观察者
class Subscriber {
public:
virtual void onNotify(Publisher* publisher) = 0;
virtual void update(string state) = 0;
};
// 发布者/被观察目标
class Publisher {
public:
virtual void addObserver(Subscriber* subscriber) = 0;
virtual void notify() = 0;
// 状态
virtual string getState() = 0;
virtual void setState(string state) = 0;
};
class EmployeeSubscriber: public Subscriber {
public:
void onNotify(Publisher* publisher)
{
string state = publisher->getState();
update(state);
}
void update(string state) {
cout << "employee: " << state << endl;
}
};
class SecretaryPublisher: public Publisher {
public:
void addObserver(Subscriber* player) {
subscriberList.push_back(player);
}
void notify() {
for (list<Subscriber*>::iterator it = subscriberList.begin(); it != subscriberList.end(); ++it) {
(*it)->onNotify(this);
}
}
string getState()
{
return m_state;
}
void setState(string state)
{
m_state = state;
notify();
}
private:
string m_state;
list<Subscriber*>subscriberList;
};
int main() {
SecretaryPublisher* sec = new SecretaryPublisher;
EmployeeSubscriber* em1 = new EmployeeSubscriber();
EmployeeSubscriber* em2 = new EmployeeSubscriber();
sec->addObserver(em1);
sec->addObserver(em2);
sec->setState("work");
sec->setState("holiday");
delete em2;
delete em1;
delete sec;
return 0;
}
GOF设计模式C++实例: