参考资料:
https://zhuanlan.zhihu.com/p/119308881
观察者模式,又称为发布-订阅模式
举例:我们经常使用微信,每天都能收到各种自己关注的公众号推送来的消息文章。
这就是一个典型的发布订阅模式。我们关注了某个公众号,就相当于给公众号粉丝列表添加了一个用户,当公众号推送消息时,发布的消息推送给所有的粉丝,粉丝就可以收到这些消息。
自己的理解:该设计模式就是利用多态性对子类对象进行无差别管理,添加和通知等,利用微信的公众号订阅和发布文章比较好理解!
结合这些理解,代码不难实现,如下非线程安全版本:
#pragma once
#include <iostream>
#include <list>
#include <algorithm>
namespace sub_obs
{
class observer{ // 观察者基类
private:
int state;
public:
observer(){}
virtual ~observer(){}
virtual int getState(){
return state;
}
virtual void setState(int state){
this->state = state;
}
virtual void update() = 0;
};
class obj1 : public observer{ // 观察者1
public:
void update() override{
std::cout << "obj1 update, state is " << getState() << std::endl;
}
};
class obj2 : public observer{ // 观察者2
public:
void update() override{
std::cout << "obj2 update, state is " << getState() << std::endl;
}
};
class subject{ // 该类为发布者,将所有观察者保存在一个集合中
private:
std::list<observer*> obj_list; // 用于管理订阅者
public:
void add(observer* obs){
obj_list.push_back(obs);
}
void notify(observer* obs){
auto iter = std::find(obj_list.begin(), obj_list.end(), obs);
if(iter != obj_list.end()){
(*iter)->setState(12);
(*iter)->update();
}
}
void notify(){
for(auto ite : obj_list){
ite->setState(34);
ite->update();
}
}
};
} // namespace sub_obs
进行简单测试:
#include "base.hpp"
int main(){
sub_obs::subject sub;
sub_obs::obj1 *obj1 = new sub_obs::obj1;
sub_obs::obj2 *obj2 = new sub_obs::obj2;
sub.add(obj1);
sub.add(obj2);
sub.notify(obj1);
sub.notify();
return 0;
}
结果:
obj1 update, state is 12
obj1 update, state is 34
obj2 update, state is 34