当前位置: 首页 > 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 发布了一篇关于观察者模式的博客文章。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024-08-05升级问题:Android中ScrollView嵌套listview并解决listview显示问题
  • 在Ubuntu 16.04上安装Jenkins的方法
  • 第N8周:使用Word2vec实现文本分类
  • [000-01-018].第3节:Linux环境下ElasticSearch环境搭建
  • C语言:for、while、do-while循环语句
  • Android系统架构
  • Spring 声明式事务 @Transactional
  • 【STM32单片机_(HAL库)】3-2-3【中断EXTI】【电动车报警器项目】433M无线收发模块实验
  • 【LeetCode热题100】滑动窗口
  • Spring MVC中获取请求参数的方式
  • leetcode_55. 跳跃游戏
  • 【杂乱算法】七种常见的排序
  • 如何使用unittest和pytest进行python脚本的单元测试
  • 计算机储存单位换算:1KB等于多少GB
  • MS8561/8562精密、低噪、CMOS、轨到轨输入输出运算放大器
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 2017届校招提前批面试回顾
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • KMP算法及优化
  • nfs客户端进程变D,延伸linux的lock
  • python 装饰器(一)
  • Python十分钟制作属于你自己的个性logo
  • ReactNative开发常用的三方模块
  • Redis字符串类型内部编码剖析
  • Vue 2.3、2.4 知识点小结
  • vue学习系列(二)vue-cli
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 你不可错过的前端面试题(一)
  • 配置 PM2 实现代码自动发布
  • 如何利用MongoDB打造TOP榜小程序
  • 世界上最简单的无等待算法(getAndIncrement)
  • 通信类
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • #{} 和 ${}区别
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $L^p$ 调和函数恒为零
  • (1)Hilt的基本概念和使用
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .gitignore文件使用
  • .htaccess 强制https 单独排除某个目录
  • .NET Core跨平台微服务学习资源
  • .Net Remoting常用部署结构
  • .NET简谈设计模式之(单件模式)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET性能优化(文摘)
  • .sh 的运行
  • :“Failed to access IIS metabase”解决方法