观察者模式:在对象之间定义一个一对多的依赖,这样在一个对象状态发生改变时其他对象都会收到通知,并自动更新。
原则:为交互对象之间的松耦合度设计而努力。
类图:
- 主题维护者一个观察者列表,任何一个继承了 Observer 的类都可以将自己注册成为观察者,当主题的状态改变时,会用方法调用的方式(调用 update 方法)来通知观察者,各个观察者再实现自己的 update 方法。
- 每一个观察者在初始化时都会传入一个主题,并且将自己注册在这个主题上,运行时也可以动态的从主题中移除或者注册自己。
- 主题 has-a 多个观察者,观察者 has-a 主题,它们之间通过这种“组合”来交互,从而降低了耦合度。而注册、移除、发送通知都遵循同样的接口,从而实现了面向接口编程。
CPP 代码
主题:
class SubjectInterface {
public:
virtual void registerObserver(Observer *observer) = 0;
virtual void removeObserver(Observer *observer) = 0;
virtual void notifyObservers() = 0;
};
class Subject : public SubjectInterface{
public:
Subject();
void registerObserver(Observer *observer) override;
void removeObserver(Observer *observer) override;
void notifyObservers() override;
private:
std::vector<Observer *> observers;
};
观察者:
class Subject;
class Observer{
public:
virtual void update() = 0;
Subject *subject;
};
class ConcreteObserver1 : public Observer{
public:
ConcreteObserver1(Subject *sub);
void update() override;
void setSubject(Subject *subj) {subject = subj;};
};
class ConcreteObserver2 : public Observer{
public:
ConcreteObserver2(Subject *sub);
void update() override;
void setSubject(Subject *subj) {subject = subj;};
};