目录
观察者模式
观察者模式允许我们定义一种订阅机制,可在对象事件发生时通知所有的观察者对象,使它们能够自动更新。观察者模式还有另外一个名字叫做"发布-订阅"模式。
步骤
1:定义观察者接口
2:定义被观察者接口
3:创建具体观察者类
4:创建具体被观察者类
5:使用
例子:订阅博主
UML图
Inheritance Inheritance Composition 1 * Association 1 1 Blogger - list attach_list +void attach(Observer* ob) +void detach(Observer* ob) +void notify(string msg) Observer - string m_name - Blogger* m_blog +Observer(string name, Blogger* blog) +void unsubscribe() +void update(string msg) Zhanyun +void notify(string msg) Subscriber +Subscriber(string name, Blogger* blog) +void update(string msg)
1:定义观察者接口
cpp
// 订阅者
class Observer {
public:
Observer(string name, Blogger* blog) : m_name(name), m_blog(blog) {
m_blog->attach(this);
}
void unsubscribe() {
m_blog->detach(this);
}
virtual void update(string msg) = 0;
virtual ~Observer() {}
protected:
string m_name;
Blogger* m_blog;
};
2:定义被观察者接口
cpp
// 博主
class Blogger {
public:
void attach(Observer* ob) {
attach_list.push_back(ob);
}
void detach(Observer* ob) {
attach_list.remove(ob);
}
virtual void notify(string msg) = 0;
virtual ~Blogger() {}
protected:
// 订阅者列表
list<Observer*> attach_list;
};
3:创建具体观察者类
cpp
class Subscriber : public Observer {
public:
using Observer::Observer;
void update(string msg) override {
cout << m_name << " 收到博客更新: " << msg << endl;
}
};
4:创建具体被观察者类
cpp
// 博主 zhanyun
class Zhanyun : public Blogger {
public:
void notify(string msg) override {
cout << "博主 zhanyun 更新了博客,订阅者一共有<" << attach_list.size() << ">人" << endl;
for (const auto& item : attach_list) {
item->update(msg);
}
}
};
5:使用
cpp
int main() {
Zhanyun* zhanyun = new Zhanyun;
Subscriber* A = new Subscriber("A", zhanyun);
Subscriber* B = new Subscriber("B", zhanyun);
zhanyun->notify("zhanyun 发布了一篇关于观察者模式的博客文章。");
delete A;
delete B;
delete zhanyun;
return 0;
}
执行结果
博主 zhanyun 更新了博客,订阅者一共有<2>人
A 收到博客更新: zhanyun 发布了一篇关于观察者模式的博客文章。
B 收到博客更新: zhanyun 发布了一篇关于观察者模式的博客文章。
C++学习资源
匠心精作C++从0到1入门编程-学习编程不再难
链接: https://pan.baidu.com/s/1q7NG28V8IKMDGD7CMTn2Lg?pwd=ZYNB 提取码: ZYNB
第二套、侯捷老师全系列八部曲 - 手把手教你进阶系列
链接: https://pan.baidu.com/s/1AYzdguXzbaVZFw1tY6rYJQ?pwd=ZYNB 提取码: ZYNB