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

设计模式---观察者模式(发布-订阅模式)

设计模式—观察者模式(发布-订阅模式)

一、简介

发布-订阅模式是一种消息传递模式,用于实现对象间的一对多依赖关系。在这种模式中:

  • 发布者(Publisher)不直接向订阅者(Subscriber)发送消息
  • 发布者和订阅者通过一个中介(通常称为事件总线或消息代理)进行通信
  • 订阅者可以订阅感兴趣的事件,发布者可以发布事件

这种模式实现了发布者和订阅者的解耦,提高了系统的灵活性和可扩展性。

二、原理

2.1核心组件

Publisher(发布者):产生事件/消息的对象

Subscriber(订阅者):接收并处理事件的对象

Event Bus/Message Broker(事件总线):管理订阅关系,负责将消息从发布者路由到订阅者

2.2工作流程

订阅者向事件总线注册对特定事件的兴趣

发布者向事件总线发布事件

事件总线将事件传递给所有注册的订阅者

三、C++实现

以下是发布-订阅模式的简单C++实现:

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <functional>
#include <memory>// 前置声明
class EventBus;// 订阅者接口
class Subscriber {
public:virtual ~Subscriber() = default;virtual void handleEvent(const std::string& event, const std::string& message) = 0;
};// 具体订阅者
class ConcreteSubscriber : public Subscriber {
public:ConcreteSubscriber(const std::string& name) : name_(name) {}void handleEvent(const std::string& event, const std::string& message) override {std::cout << name_ << " received event '" << event << "' with message: " << message << std::endl;}private:std::string name_;
};// 事件总线
class EventBus {
public:// 订阅事件void subscribe(const std::string& event, Subscriber* subscriber) {subscribers_[event].push_back(subscriber);}// 取消订阅void unsubscribe(const std::string& event, Subscriber* subscriber) {auto& subs = subscribers_[event];subs.erase(std::remove(subs.begin(), subs.end(), subscriber), subs.end());}// 发布事件void publish(const std::string& event, const std::string& message) {if (subscribers_.find(event) != subscribers_.end()) {for (auto subscriber : subscribers_[event]) {subscriber->handleEvent(event, message);}}}private:std::map<std::string, std::vector<Subscriber*>> subscribers_;
};// 发布者
class Publisher {
public:Publisher(EventBus& eventBus) : eventBus_(eventBus) {}void publish(const std::string& event, const std::string& message) {eventBus_.publish(event, message);}private:EventBus& eventBus_;
};int main() {EventBus eventBus;// 创建订阅者ConcreteSubscriber sub1("Subscriber1");ConcreteSubscriber sub2("Subscriber2");ConcreteSubscriber sub3("Subscriber3");// 订阅事件eventBus.subscribe("event1", &sub1);eventBus.subscribe("event1", &sub2);eventBus.subscribe("event2", &sub2);eventBus.subscribe("event2", &sub3);// 创建发布者Publisher publisher(eventBus);// 发布事件publisher.publish("event1", "First event message");publisher.publish("event2", "Second event message");// 取消订阅eventBus.unsubscribe("event1", &sub2);// 再次发布publisher.publish("event1", "Event after unsubscribe");return 0;
}

代码运行结果:

微信截图_20250706152914

四、应用场景

  1. GUI系统中的事件处理
  2. 分布式系统中的消息传递
  3. 微服务架构中的服务间通信
  4. 游戏开发中的事件系统
  5. 日志系统和监控系统

优点

  1. 松耦合:发布者和订阅者不需要知道对方的存在
  2. 可扩展性:可以轻松添加新的发布者或订阅者
  3. 灵活性:订阅者可以动态订阅或取消订阅事件

缺点

  1. 调试困难:由于间接性,事件流可能难以跟踪
  2. 性能开销:消息传递可能比直接调用慢
  3. 可能导致内存泄漏:如果订阅者没有正确取消订阅

发布-订阅模式是现代软件架构中非常重要的模式,特别是在需要组件间松散耦合的系统中。

参考文章:

1.“牵一发而动全身”——我用观察者模式简单模拟吃鸡

2.《推荐C++ 23种设计模式》系列第十九期:观察者模式【架构设计与实现】

http://www.xdnf.cn/news/14833.html

相关文章:

  • 【STM32】通用定时器PWM
  • Spring AI(12)——调用多模态模型识别和生成图像
  • 关于笔记本充电,使用氮化镓充电器
  • Omi录屏专家 Screen Recorder by Omi 屏幕录制Mac
  • 高效处理大体积Excel文件的Java技术方案解析
  • 云原生 Serverless 架构下的智能弹性伸缩与成本优化实践
  • SNAT DNAT实验
  • 探索实现C++ STL容器适配器:优先队列priority_queue
  • MySQL CDC与Kafka整合指南:构建实时数据管道的完整方案
  • 前端常见 HTTP 状态码
  • DPDK 网卡驱动
  • WPF学习笔记(25)MVVM框架与项目实例
  • Stlink v2调试器采用SWD模式连接stm32f103c8t6核心板的接线方式
  • AI小智项目全解析:软硬件架构与开发环境配置
  • 信号与槽的总结
  • Linux内核深度解析:IPv4策略路由的核心实现与fib_rules.c源码剖析
  • bean注入的过程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘
  • 从“电话催维修“到“手机看进度“——售后服务系统开发如何重构客户体验
  • 历史数据分析——中证医药
  • 《数据维度的视觉重构:打造交互式高维数据可视化的黄金法则》
  • 如何解决Spring Boot中@Valid对List校验失效问题
  • Python小工具之PDF合并
  • Linux应用基础
  • [netty5: HttpObjectEncoder HttpObjectDecoder]-源码解析
  • 传输层 udptcp
  • 【力扣 简单 C】746. 使用最小花费爬楼梯
  • 国产 OFD 标准公文软件数科 OFD 阅读器:OFD/PDF 双格式支持,公务办公必备
  • LongT5: 针对长序列的高效文本到文本Transformer
  • Linux NFS终极指南:安装、配置与性能优化
  • 【解决“此扩展可能损坏”】Edge浏览器(chrome系列通杀))扩展损坏?一招保留数据快速修复