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

设计模式-发布订阅

文章目录

  • 发布订阅概念
    • 发布订阅 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.xdnf.cn/news/711973.html

相关文章:

  • Docker安装
  • SpringCloud基础知识
  • Unity 中 Update、FixedUpdate 和 LateUpdate 的区别及使用场景
  • AMBA-AHB仲裁机制
  • RabbitMQ备份与恢复技术详解:策略、工具与最佳实践
  • 如何在WSL的Ubuntu里面启动腾讯微搭
  • excel表格记账 : 操作单元格进行加减乘除 | Excel中Evaluate函数
  • 关于DDOS
  • SQL Server 中创建链接服务器
  • android无root抓包(PCAPdroid)
  • Spring框架学习day1--基础概念
  • 深度解析UniApp盲盒系统开发:从源码架构到多端部署全流程
  • 基于STM32F10X的BMP280程序
  • 滚珠导轨:电子制造“纳米级”精度的运动基石
  • 如何用命令行将 PDF 表格转换为 HTML 表格
  • 责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)
  • ZYNQ移植FreeRTOS和固化和openAMP双核
  • 设备制造行业项目管理难点解析,如何有效解决?
  • 塔能科技:为多行业工厂量身定制精准节能方案
  • Kotlin 活动事件通讯跳转深度讲解
  • 职业本科院校无人机专业人才培养解决方案
  • KeePass安装与KeePass设置中文教程
  • springboot多模块父pom打包正常,单模块报错
  • clickhouse如何查看操作记录,从日志来查看写入是否成功
  • 湖北理元理律师事务所债务优化实践:在还款与生活间寻找平衡支点
  • [NOIP 2001 普及组] 数的计算 Java
  • 高防IP能抗住500G攻击吗?
  • PostgreSQL的聚集函数
  • Nest全栈到失业(三):半小时图书管理系统-User
  • Ubuntu 22.04 上安装 PostgreSQL(使用官方 APT 源)