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

设计模式-发布订阅

文章目录

  • 发布订阅概念
    • 发布订阅 vs 监听者
    • 例子代码

发布订阅概念

在这里插入图片描述

发布/订阅者模式最大的特点就是实现了松耦合,也就是说你可以让发布者发布消息、订阅者接受消息,而不是寻找一种方式把两个分离 的系统连接在一起。当然这种松耦合也是发布/订阅者模式最大的缺点,因为需要中间的代理,增加了系统的复杂度。而且发布者无法实时知道发布的消息是否被每个订阅者接收到了,增加了系统的不确定性。

在这里插入图片描述

发布订阅 vs 监听者

参考文章:https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c, 理解发布订阅模式和观察者模式的区别

Let’s list out the differences as a quick Summary:

  • In the Observer pattern, the Observers are aware of the Subject, also the Subject maintains a record of the Observers. Whereas, in Publisher/Subscriber, publishers and subscribers don’t need to know each other. They simply communicate with the help of message queues or broker.

  • In Publisher/Subscriber pattern, components are loosely coupled as opposed to Observer pattern.

  • Observer pattern is mostly implemented in a synchronous way, i.e. the Subject calls the appropriate method of all its observers when some event occurs. The Publisher/Subscriber pattern is mostly implemented in an asynchronous way (using message queue).

  • Observer pattern needs to be implemented in a single application address space. On the other hand, the Publisher/Subscriber pattern is more of a cross-application pattern.

发布订阅解偶,通常使用消息中间件,能实现跨平台、异步通信

例子代码

  • 发布者发布消息
public interface Publisher {// 发布消息void publishMessage(String msg);}
  • 订阅者订阅并响应消息
public interface Subscriber {// 进行订阅void subscribe();// 响应消息void onMessage(String message);
}
  • 第三方中间件做消息中转并通知订阅者
public class Broker {List<Subscriber> subscriberList = new ArrayList<>();List<Publisher> publishList = new ArrayList<>();List<String> messageList = new ArrayList<>();public void notifySubscribers(){while(!messageList.isEmpty()){String message = messageList.remove(0);for(Subscriber subscriber :subscriberList){subscriber.onMessage(message);}}}public void publishMessage(String message){messageList.add(message);}public void subscribt(Subscriber subscriber){subscriberList.add(subscriber);}public void publish(Publisher publisher){publishList.add(publisher);}public static void main(String[] args) {// 发布订阅中心, 消息中间件一样Broker broker = new Broker();// 发布者注册Publisher1 publisher = new Publisher1();publisher.setBroker(broker);// 订阅者注册Subscriber1 subscriber = new Subscriber1();subscriber.setBroker(broker);subscriber.subscribe();// 发布者发布消息publisher.publishMessage("hello");// 中间间会通知所有订阅者broker.notifySubscribers();}
}
http://www.lryc.cn/news/2393750.html

相关文章:

  • C#学习26天:内存优化的几种方法
  • 功能测试向量是个什么概念
  • C++之string的模拟实现
  • Python打卡第38天
  • 【网络安全】轻量敏感路径扫描工具
  • K8S查看pod资源占用和物理机器IP对应关系
  • Java Spring 之拦截器HandlerInterceptor详解与实战
  • 开源第三方库发展现状
  • JavaSE核心知识点04工具04-02(IDEA)
  • NodeMediaEdge通道管理
  • 25、web场景-【源码分析】-静态资源原理
  • qt结构化绑定的重大缺陷:只能创建局部变量
  • 历年中南大学计算机保研上机真题
  • 端口映射不通的原因有哪些?路由器设置后公网访问本地内网失败分析
  • Vue3 封装el-table组件
  • Python爬虫实战:研究Requests-HTML库相关技术
  • Azure Devops pipeline 技巧和最佳实践
  • 云原生应用架构设计原则与落地实践:从理念到方法论
  • 一起学数据结构和算法(三)| 字符串(线性结构)
  • udp 传输实时性测量
  • 超级对话:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之一
  • 【ArcGIS微课1000例】0147:Geographic Imager6.2下载安装教程
  • Android 之 kotlin 语言学习笔记二(编码标准)
  • 华为OD机试真题——Boss的收入(分销网络提成计算)(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 微软云如何申请使用
  • 历年西北工业大学计算机保研上机真题
  • 使用pnpm、vite搭建Phaserjs的开发环境
  • intra-mart执行java方法笔记
  • 在 Vue 2中使用 dhtmlxGantt 7.1.13组件,并解决使用时遇到的问题汇总.“dhtmlx-gantt“: “^7.1.13“,
  • 【C++高级主题】命令空间(三):未命名的命名空间