C++设计模式之观察者模式和发布订阅模式

article/2025/10/27 0:26:23

在软件工程中,设计模式(Design Pattern)是对软件设计普遍存在(反复出现)的各种问题,锁提出的解决防范。根据模式的目的来划分的话,GoF(Gang of Four) 设计模式可以分为以下三种类型:

在这里插入图片描述

1.创建型模式:用来描述“如何创建对象”,它的主要特点是“将对象的创建和使用分离”。包括单例、原型、工厂方法、抽象工厂和建造者5种模式。

2.结构型模式:用来描述如何将类或对象按照某种布局组成更大的结构。包括代理、适配器、侨接、装饰、外观、享元和组合7种模式。

3.行为型模式:用来识别对象之间的常用交流模式以及如何分配职责。包括模版方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录和解释器11种模式。

今天介绍1种常用的设计模式。

观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使他们能够更新自己。

在观察者模式中有连个主要的角色:Subject(主题,被观察对象)和Observer(观察者)

被观察对象自身应该包含一个容器来存放观察者对象,当被观察者自身发生改变时通知容器内所有的观察者对象自动更新。

观察者对象可以注册到被观察者的中,完成注册后可以检测被观察者的变化,接收被观察者的通知。当然观察者也可以被注销换掉,停止对被观察者的监控。

/*关键代码:在目标类中增加一个ArrayList存放观察者们。
*/#include <iostream>#include <list>#include <memory>using namespace std;class View;//被观察者抽象类 数据模型class DataModel {public:virtual ~DataModel(){}virtual void addView(View *view) = 0;virtual void removeView(View* view) = 0;virtual void notif() = 0;  //通知函数};//观察者抽象类  视图
class View {public:virtual ~View() {cout << "~View()" << endl;}virtual void update() = 0;virtual void setViewName(const string& name) = 0;virtual const string& name() = 0;
}//具体的被观察类,整数模型
class IntDataModel:public DataModel {public:~IntDataModel() {m_pViewList.clear();}virtual void addView(View *view) override {shared_ptr<View> temp(view);auto iter = find(m_pViewList.begin(), m_pViewList.end(), temp);if (iter == m_pViewList.end()) {m_pViewList.push_font(temp);}else {cout << "View already exists" <<endl;}}
}void removeView(View* view) override {auto iter = m_pViewList.begin();for(;iter != m_pViewList.end(); iter++) {if((*iter).get() == view) {m_pViewList.erase(iter);cout << "remove view" << endl;return ;}}
}virtual void notify() override {auto iter = m_pViewList.begin();for(; iter != m_pViewList.end(); iter++) {(*iter).get()->update();}
}private:list<shared_ptr<View>> m_pViewList;
};//具体的观察者类 表视图
class TableView : public View {public:TableView() ; m_name("unknow"){}TableView(const string& name) : m_name(name){}~TableView(){cout << "~TableView():" << m_name.data() << endl;}void setViewName(const string& name) {m_name = name;}const string& name() {return m_name;}void update() override {cout << m_name.data() << " update" << endl;}private:string m_name;
};int main() {/*补充说明,在本次代码示例中,View一旦被注册到DataModel类之后,DataModel解析时会自动解析调内部容器中存储的View对象,因此注册后的View对象不需要在手动去delete,再去delete View对象会出错*/View *v1 = new TableView("TableView1");View *v2 = new TableView("TableView2");View *v3 = new TableView("TableView3");View *v4 = new TableView("TableView4");IntDataModel* model = new IntDataModel;model->addView(v1);model->addView(v2);model->addView(v3);model->addView(v4);model->notify();cout<<"---------------\n"<<endl;model->removeView(v1);model->notify();delete model;model = nullptr;return 0;
}

应用场景:

一个对象的行为依赖于另一个对象的状态。换一种方法,当被观察对象(目标对象)的状态发生改变时,会直接影响到观察对象的行为。


发布订阅模式

在软件架构中,发布/订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息发分为不同的类别,然后分别发送给不同的订阅者。同样的,订阅者可以表达对一个或多个类别的兴趣,只接受感兴趣的消息,无需了解哪些发布存在。

在发布订阅模式中有三个主要角色:Publisher(发布者)、Channels(通道)和Subscriber(订阅者)

可以理解为发布者主动发出特定的通道,观察者接收自己想要的。


http://chatgpt.dhexx.cn/article/paWsXqnQ.shtml

相关文章

Redis发布订阅模式实现原理

前言 发布订阅系统在我们日常的工作中经常会使用到&#xff0c;这种场景大部分情况我们都是使用消息队列&#xff0c;常用的消息队列有 Kafka&#xff0c;RocketMQ&#xff0c;RabbitMQ&#xff0c;每一种消息队列都有其特性&#xff0c;很多时候我们可能不需要独立部署相应的消…

RabbitMQ入门案例之发布订阅模式

前言 本文章主要介绍RabbitMQ的发布订阅模式&#xff0c;该模式下&#xff0c;消息为广播形式&#xff0c;一经发布则会进入交换机绑定的队列中&#xff0c;详细介绍可以阅读官方文档。 官网文档地址&#xff1a;https://rabbitmq.com/getstarted.html 什么是发布与订阅模式 …

浅谈JS发布订阅模式

&#x1f3c6;分享博主自用牛客网&#x1f3c6;&#xff1a;一个非常全面的面试刷题求职网站&#xff0c;真的超级好用&#x1f36c; 文章目录 前言一、发布订阅模式是什么&#xff1f;二、使用步骤1.创建调度中心2.实际操作3. React中的应用 总结 前言 在使用前端各大框架时&…

React 中的发布订阅模式

1、react 通信 react的数据流是单向的, react 通信有以下几种方式&#xff1a; 单向数据流&#xff1a;指当前组件的 state 以 props 的形式流动时只能流向组件树中比自己层级更低的组件 父向子通信&#xff1a;父组件提供state&#xff0c;并且内部设置好数据&#xff0c;子组…

深入Vue原理_全面剖析发布订阅模式

文章目录 发布订阅模式优化优化思路思考理解发布订阅模式(自定义事件)收集更新函数触发更新函数6.5 总结 总结写在最后本期推荐 欢迎各位小伙伴们&#xff01; 为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有…

观察者模式VS发布订阅模式区别

观察者模式VS发布订阅模式区别 观察者模式&#xff1a;订阅者收集函数&#xff0c;发布者循环调用 发布订阅&#xff1a;收集发布单独给一个中介 对比 以结构来分辨模式&#xff0c;发布订阅模式相比观察者模式多了一个调度中心&#xff1b; 以意图来分辨模式&#xff0c;都…

RabbitMQ:发布订阅模式

✨ RabbitMQ:发布订阅模式 1.订阅模式基本介绍2.交换机3.发布订阅模式3.1基本介绍3.2生产者3.3消费者3.4测试 &#x1f4c3;个人主页:不断前进的皮卡丘 &#x1f31e;博客描述:梦想也许遥不可及&#xff0c;但重要的是追梦的过程&#xff0c;用博客记录自己的成长&#xff0c;记…

JavaScript设计模式:四、发布订阅模式

JavaScript设计模式&#xff1a;四、发布订阅模式 文章目录 JavaScript设计模式&#xff1a;四、发布订阅模式一、概述1. 观察者模式2. 发布订阅模式3. 观察者模式是不是发布订阅模式 一、概述 观察者模式&#xff1a; 观察者&#xff08;Observer&#xff09;直接订阅&#x…

发布订阅模式理解

发布订阅模式理解 1.发布-订阅模式 发布订阅模式是一种一对多的对象对应关系&#xff0c;多个观察者同时监听某一个对象&#xff0c;当该对象发生改变时&#xff0c;就会执行一个发布事件&#xff0c;这个发布事件会通知所有的事件订阅者&#xff0c;事件订阅者根据得到的数据…

JS观察者模式和发布订阅模式

观察者模式 观察者模式在前端工程中是很常见的设计模式&#xff0c;因为前端交互中充斥着大量多控件联动的交互&#xff0c;当参与联动的组件数量比较多或者组件数量可能变化的时候&#xff0c;代码就会变得难以维护。但是如果我们写代码时遵循了观察者模式的设计&#xff0c;…

redis发布订阅模式详解

文章目录 写在前面发布订阅的使用SUBSCRIBE命令PUBLISH命令注意发布、订阅客户端启动顺序&#xff01; PUBSUB命令PUNSUBSCRIBE命令UNSUBSCRIBE命令PSUBSCRIBE命令 总结 写在前面 Redis 发布订阅 (pub/sub) 是一种消息通信模式&#xff1a;发送者 (pub) 发送消息&#xff0c;订…

Vue发布订阅模式

简单的来说一下在别人问你这个问题的时候怎么来回答它 前端新人&#xff0c;如有错误求大佬指出~求教&#x1f49d; 情景复现 大佬提问&#xff1a;“你知道Vue发布订阅模式是什么吗&#xff1f;" 我的回答&#xff1a;“发布订阅模式其实是一种对象间一对多的依赖关系&…

观察者模式和发布订阅模式

一、概念 观察者(Observer)&#xff0c;又称发布-订阅&#xff08;Publish-Subscrice&#xff09;&#xff0c;属于23中设计模式之一。 发布订阅模式定义了一种一对多的依赖关系&#xff0c;让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时&#xff0c…

C++发布订阅模式

C发布订阅模式 发布订阅模式主要包含三个部分&#xff1a;消息发布、消息订阅者、消息处理中心。与观察者模式相比多出了消息处理中心模块&#xff0c;这样在结构上可以解耦订阅者与发布者&#xff0c;功能上更加的丰富。 观察者模式 结构设计 有一个消息list&#xff0c;主…

Java实现发布订阅模式

什么是发布订阅模式 发布订阅模式是软件开发者很常见的一种设计模式&#xff0c;很多开源库都使用了发布订阅模式&#xff0c;例如RxJava、EventBus、Vue等&#xff0c;所以学习该模式还是很有必要的。 该模式中存在一个或多个发布者&#xff0c;一个或多个订阅者&#xff0c…

设计模式 —— 发布订阅模式

设计模式 —— 发布订阅模式 《工欲善其事&#xff0c;必先利其器》 我在之前有写过一篇关于 《观察者模式》 的文章&#xff0c;大家有兴趣的可以去看看&#xff0c;个人认为那个例子还是挺生动的。&#xff08;狗头&#xff09; 不过今天我们要学习的是&#xff0c;发布订阅…

小侃设计模式(十八)-发布订阅模式

1.概述 发布订阅模式又叫观察者模式&#xff08;Observer Pattern&#xff09;&#xff0c;它是指对象之间一对多的依赖关系&#xff0c;每当那个特定对象改变状态时&#xff0c;所有依赖于它的对象都会得到通知并被自动更新&#xff0c;它是行为型模式的一种。观察者模式内部…

发布-订阅模式

发布-订阅模式 学习知识要善于思考&#xff0c;思考&#xff0c;再思考。 —— 爱因斯在众多设计模式中&#xff0c;可能最常见、最有名的就是发布 - 订阅模式了&#xff0c;本篇我们一起来学习这个模式。 发布 - 订阅模式 &#xff08;Publish-Subscribe Pattern, pub-sub&a…

什么是发布订阅模式?

发布-订阅模式&#xff08;Publish-Subscribe pattern&#xff09;是一种软件架构模式&#xff0c;用于实现组件之间的解耦和消息传递。在这种模式中&#xff0c;组件&#xff08;发布者&#xff09;将消息发送到一个中心&#xff08;消息代理或主题&#xff09;&#xff0c;然…

发布订阅模式

零、目录 应用场景实现原理代码实现全局模式下的订阅发布模式&#xff08;泛化的订阅发布模式&#xff09;总结 一、应用场景 ​ 发布订阅模式&#xff0c;广泛的存在于在我们的生活之中。 ​ 举个一个简单的例子来说&#xff0c;当我们在浏览视频或者博客论坛之类的网…