下面的代码实现了一个observer模式,添加observer以后可以很方便的跟踪变量的改变
/*
obs.hpp
实现observer类
抽象出一个接口
*/
#include<list>
class observer{
public:
//观察者接口,我们只用定义一个我们想要用户实现的虚函数
//在实现了下面的publisher以后,只需要继承observer类并且重写update函数就可以实现observer模式
//这样就可以在不同平台上实现不同的update接口
virtual void update(int val)=0;
virtual ~observer(){}
};
class publisher{ //发布者,需要添加不同的observer进去,在pubisher更新,即可实现所有observer的更新
public:
std::list<observer*> users; //保存不同的观察者,可能有100个
void add(observer* ptr){ //添加新的观察者
users.push_front(ptr);
}
void remove(observer* ptr){
//删除逻辑...我就不实现了
}
void update(int val){
auto it=users.begin();
for(;it!=users.end();it++){
(*it)->update(val); //当我们调用update时,我们依次唤醒所有observer,发送值
}
}
~publisher(){
}
};
/*
观察者模式 main.cpp
Observer / Event
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知 并 被自动更新。
最典型的一个例子就是:
如何监听一个值的变化?
比如现在有一个进度条,我需要在进度改变的时候更新进度条,我该如何设计这个observer类?
*/
#include<iostream>
#include"obs.hpp"
using namespace std;
//我们为了实现不同的观察者,我们编写两个类,继承自 observer,一个在控制台上打. 一个自己的数值+1
class coutPoint : public observer{
public:
virtual void update(int val){
//实现这个更新的接口:在控制台上打点
for(int i=0;i<val;i++){
cout<<'.';
}
cout<<endl;
}
};
//再实现一个观察者,当值更新时,我们内部的某个成员变量+1
class numberPlus : public observer{
public:
int num=0;
virtual void update(int val){
num++;
}
};
int main(){
publisher pub; //publisher类,他连接所有观察者
coutPoint cp; //在值变动时,在屏幕上打印.的类
numberPlus np; //在值变动时,自己内部成员变量+1的类
pub.add(&cp);
pub.add(&np); //添加观察者进去
for(int i=0;i<77;i++){
pub.update(i); //更新值
}
cout<<np.num<<endl;
return 0;
}