#include <iostream>
#include <vector>
#include <string>
using namespace std;
// ========== 观察者接口 ==========
class Observer { // Observer就是观察者的意思
public:
// 每个观察者模式都要有一个update
// 每个观察者收到通知后执行的动作
virtual void update(const string& msg) = 0;
};
// ========== 被观察者(主题) ==========
// 就是修改值的那个
class Subject {
vector<Observer*> observers; // 观察者列表,可以理解为一个容器(数组)
public:
void addObserver(Observer* obs) {
observers.push_back(obs); // 往数组里添加观察者
}
void notify(const string& msg) { // 当状态变化的时候通知每位观察者
for (auto obs : observers) // 对当前这个观察者(obs),调用它的 update() 函数,并把 msg 当作参数传进去。
obs->update(msg); // 通知每个观察者
}
};
// ========== 具体观察者 ==========
// 知道值被修改了
class User : public Observer { //user继承observer
string name;
public:
User(string n) : name(n) {} // 构造函数,进行初始化
void update(const string& msg) override { // 重写update接口
cout << name << " 收到消息:" << msg << endl;
}
};
// ========== 测试 ==========
int main() {
Subject topic; // 创建被观察者对象
User a("Alice"), b("Bob"); // 初始化两个观察者对象
topic.addObserver(&a);
topic.addObserver(&b);
topic.notify("新视频发布啦!"); // 通知所有观察者
return 0;
}
执行结果:

2329

被折叠的 条评论
为什么被折叠?



