当前位置: 首页 > news >正文

C++观察者模式:订阅博主~

目录

    • 观察者模式
    • 步骤
    • 例子:订阅博主
      • UML图
      • 1:定义观察者接口
      • 2:定义被观察者接口
      • 3:创建具体观察者类
      • 4:创建具体被观察者类
      • 5:使用
      • 执行结果

观察者模式

观察者模式允许我们定义一种订阅机制,可在对象事件发生时通知所有的观察者对象,使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。

步骤

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:定义观察者接口

// 订阅者
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:定义被观察者接口

// 博主
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:创建具体观察者类

class Subscriber : public Observer {
public:using Observer::Observer;void update(string msg) override {cout << m_name << " 收到博客更新: " << msg << endl;}
};

4:创建具体被观察者类

// 博主 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:使用

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 发布了一篇关于观察者模式的博客文章。

http://www.lryc.cn/news/427812.html

相关文章:

  • 1-安装Elasticsearch
  • EmguCV学习笔记 VB.Net 4.2 二值化
  • Spark大数据分析案例
  • 【数据结构】关于Java对象比较,以及优先级队列的大小堆创建你了解多少???
  • HQChart使用教程101-创建内置键盘精灵
  • nginx基础配置
  • 怿星科技与您相约——2024 Testing Expo
  • mac本地搭建docker+k8s步骤
  • JS DOM、点击事件
  • 长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现
  • C语言——操作符详解
  • 【Linux】内核全量函数添加日志打印摸索
  • 24/8/17算法笔记 CQL算法离线学习
  • C++第十一弹 -- STL之List的剖析与使用
  • 物流快递外卖管理平台系统-计算机毕设Java|springboot实战项目
  • 开源BaaS 平台介绍
  • 分享一个基于python爬虫的“今日头条”新闻数据分析可视化系统(源码、调试、LW、开题、PPT)
  • QT自定义信号槽
  • one-shot 序列图像红外小目标分割
  • JavaScript 单线程防阻塞的原理
  • Shell脚本发送邮件的详细步骤与配置方法?
  • 如何把Phalcon 集成到PhpStorm里面
  • python从入门到精通:循环语句
  • Codeforces Round 965 (Div. 2)
  • Win10下载安装Mysql服务
  • MVVM(Model-View-ViewModel)架构模式
  • C#MVC返回DataTable到前端展示。
  • HttpUtils工具类(二)Apache HttpClient 5 使用详细教程
  • Vue3.0生命周期钩子(包含:Vue 2.0 和 Vue 3.0)
  • 遥感之常用各种指数总结大全