1. 核心定义

  • 本质:一种消息通信范式,通过引入一个“中间人”角色,使发布者 (Publisher)订阅者 (Subscriber) 彻底解耦。
  • 口诀:发布者只管发,订阅者只管听,中间人管名单和分发。

2. 三大核心角色

  • 发布者 (a方法):触发事件的角色。它不需要知道谁订阅了它,只需向中间人“呼喊”一声。
  • 订阅者 (b, c方法):接收消息的角色。它向中间人注册一个回调函数,静候通知。
  • 中间人 (Broker/Event Bus):最关键的角色。
  • 职责一:提供 subscribe 接口,维护一个**“主题 -> 回调数组”**的档案柜。
  • 职责二:提供 publish 接口,当事件发生时,翻阅档案,依次执行对应的回调列表。

3. 为什么需要它?(模式的目的)

  • 空间解耦:A 和 B 互不认识,修改 A 不影响 B。
  • 时间解耦:在高级实现中,发布者发完就走,订阅者可以异步处理(不用死等)。
  • 逻辑清晰:把“业务逻辑”和“善后逻辑”拆分。比如:订票逻辑(主) vs 发短信、扣积分(副)。

4. 实现的技术细节(底层原理)

  • 存储机制:通常在中间人内部维护一个 Map<String, Array<Function>>

  • 执行方式

  • 单机版:遍历回调函数数组,同步/异步依次执行。

  • 分布式版 (如 Kafka):基于磁盘日志追加写入,订阅者通过偏移量 (Offset) 自行拉取。

  • 健壮性设计

  • 异常隔离:使用 try...catch 包裹回调,防止一个订阅者报错导致全线崩溃。

  • 防止死循环:警惕在回调中再次发布同一事件引起的“递归套娃”。

  • 内存管理:提供 off (取消订阅) 或 once (阅后即焚) 功能,防止内存泄漏。

5. 常见应用场景

  • 前端:DOM 事件监听、Vue/React 的组件通信。
  • 后端:分布式系统中的消息队列(Kafka, RabbitMQ, Redis Pub/Sub)。
  • 生活:微信公众号订阅、报纸订购、抖音关注。

💡 核心感悟
发布订阅模式不仅是代码技巧,更是一种组织哲学——通过牺牲一点点性能(引入中间人)来换取整个系统极大的灵活性可扩展性