官方定义:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象,同时监听某一个对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己。
自己理解:
当一个类的改变会引起其他多个类的改变时,为了维护一致性会使各个类紧密耦合。观测者模式就是让耦合的双方都依赖于抽象,而不是依赖于具体,达到解耦合的目的。(依赖倒装原则)
UML图:
代码实现:
#include<vector>
using namespace std;
//Step1 抽象主题
class Subject {
private:
//观察者数组
vector<Observer*> oVector;
public:
//增加观察者
void addObserver(Observer* s) {
oVector.push_back(s);
}
//删除观察者
void deleteObserver(Observer* s) {
vector<Observer*>::iterator ptr = oVector.begin();
for (; ptr != oVector.end(); ptr++) {
if (*ptr == s) {
oVector.erase(ptr);
break;
}
}
}
//通知所有的观察者
void notifyObserver() {
for (auto temp : oVector)
temp->update();
}
};
//Step2 抽象观察者
class Observer {
public:
virtual void update() = 0;
virtual ~Observer() {}
};
//Step3 具体主题
class ConcreteSubject : public Subject {
public:
void doSomething() {
//...
notifyObserver();
//...
}
};
//Step4 具体观察者1
class ConcreteObserver1 : public Observer {
public:
void update() {
//...
}
};
class ConcreteObserver2 :public Observer {
public:
void update() {
//...
}
};
//Step5 客户端函数
void main() {
//创建主题
ConcreteSubject* subject = new ConcreteSubject;
//创建观察者
Observer* observer1 = new ConcreteObserver1;
Observer* observer2 = new ConcreteObserver2;
//观察
subject->addObserver(observer1);
subject->addObserver(observer2);
//活动
subject->doSomething();
}