当前位置: 首页 > 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();}
}

相关文章:

  • 工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
  • spark shuffle的分区支持动态调整,而hive不支持
  • Kubernetes面试题(基础向)
  • unity星空运动
  • Linux | Shell脚本的基础知识
  • ai如何绘制mg人物的睫毛
  • 求满足target的最小窗口的长度,滑动窗口法,双指针
  • 【Ubuntu远程桌面】
  • NanoGPT的BenchMarking.py
  • 2021年江西工业互联网大赛———恶意app分析
  • VL 中间语言核心技术架构:构建全链路开发生态
  • 食材走T台?Coze+即梦应用实例:实现一键生成食材走秀视频!!(附提示词)
  • kafka学习笔记(三、消费者Consumer使用教程——使用实例及及核心流程源码讲解)
  • Docker 部署项目
  • 挡片/测试晶圆(Dummy Wafer)通俗解析
  • UI自动化测试的革新,新一代AI工具MidScene.js实测!
  • K8S集群主机网络端口不通问题排查
  • 滚珠导轨:电子制造“纳米级”精度的运动基石
  • SQLite 中文写入失败问题总结
  • SpringMVC核心原理与前后端数据交互机制详解
  • 下载的asp网站怎么打开/域名怎么注册
  • 中卫市建设网站/甘肃seo技术
  • 建设网站怎么办理/百度推广公司怎么代理到的
  • 在长沙做网站需要多少钱/数据分析网官网
  • 公司网站出现空白页/近三天的国内新闻
  • 河北建设厅网站上不去/关键词英文