观察者设计模式:定义对象之间的一种“一对多”的依赖关系,当一个对象状态发生改变的时候,所有依赖这个对象的观察者都会得到通知并且被自动更新。
这种模式也称为“发布-订阅”模式。目标就是发布者,他不知道订阅者是谁,这个对象可以有任意多个订阅者可以接受发布者发送的消息。
通过抽象接口就把目标和观察者进行了解耦,可以单独的修改目标或者对象,也可以随意的增加或者删除观察者。
观察者模式主要依赖于对象维护了一个观察者列表,当对象发出消息后,通过观察者的循环列表依次调用每一个观察者的接口实现消息的传递。
下面是C++代码的实现方式:
#include <stdio.h>
#include <vector>
using namespace std;
class Subject;
//观察者接口
class Observer {
public:
virtual void updateSelf(Subject* obj) = 0;
protected:
Subject* subject;
};
//对象接口
class Subject {
public:
virtual void attach(Observer* obs) {
obsList.push_back(obs);
}
virtual void notify() {
vector<Observer*>::iterator it = obsList.begin();
for (it; it != obsList.end();it++){
(*it)->updateSelf(this);
}
}
virtual void setData(int d) {
data = d;
}
virtual int getData() {
return data;
}
protected:
int data = 0;
vector<Observer*> obsList;
};
//具体的对象
class OneSubject :public Subject {
public:
OneSubject ();
~OneSubject ();
};
OneSubject::OneSubject() {
}
OneSubject ::~OneSubject() {
}
//第一个观察者
class FirstObserver :public Observer {
public:
virtual void updateSelf(Subject* obj) {
printf("第一个观察者更新数据:%d\n",obj->getData());
}
};
//第二个观察者
class SecondObserver :public Observer {
public:
virtual void updateSelf(Subject* obj) {
printf("第二个观察者更新数据:%d\n", obj->getData());
}
};
int main() {
//创建一个对象
OneSubject* oneSub = new OneSubject;
//创建观察者
FirstObserver* first = new FirstObserver;
SecondObserver* second = new SecondObserver;
//添加观察者
oneSub->attach(first);
//添加观察者
oneSub->attach(second);
//设置数据
oneSub->setData(102);
//发出通知
oneSub->notify();
return 0;
}
运行结果: