Skip to content

发布订阅模式

什么叫发布订阅模式

用微信公众号订阅的类比来理解“发布-订阅”模式非常直观。这种模式的核心要素是发布者订阅者订阅中心,你订阅的公众号(发布者)发布文章时,微信平台(订阅中心)会推送给每个关注它的用户(订阅者)。

核心思想

发布-订阅模式的核心思想之一就是通过引入一个订阅中心,使得发布者和订阅者之间不直接依赖,从而提高程序的灵活性和可维护性,同时也可以动态的添加或删除订阅者,满足各自业务的需求。

发布-订阅模式的概念图

alt text

代码实现

具备三个因素

  • 发布者 Publisher
  • 订阅者 Subscriber
  • 订阅中心(事件中心) Pattern

tips:

  • 订阅中心用于跟踪和维护发布者与订阅者之间的关联。例如,假设有公众号 A、B、C,其中 A 的订阅者包括 a-1、a-2,B 的订阅者包括 b-1、b-2。订阅中心会将这些公众号及其对应的订阅者进行注册。当用户订阅某个公众号时,该用户会被添加到相应公众号的订阅者队列中。 实现:
javascript
class Pattern {
  constructor() {
    this.events = {};
  }

  // 订阅事件, 将发布者 和 订阅者关联   一对多的关系
  subscribe(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
  }

  // 取消订阅事件
  unsubscribe(eventName, callback) {
    if (!this.events[eventName]) return;

    this.events[eventName] = this.events[eventName].filter(
      (cb) => cb !== callback
    );
  }

  // 发布事件  发布者向订阅中心发送消息,订阅中心找到,订阅该消息的人群,通知它,然后将消息消费掉
  publish(eventName, data) {
    if (!this.events[eventName]) return;

    this.events[eventName].forEach((callback) => callback(data)); // 这里的callback(data) 就是notify的过程
  }
}

使用示例

js

const eventCenter = new Pattern();

// 定义订阅者(消费者)
const subscriber1 = (data) => {
    console.log('Subscriber 1 received:', data);
};

const subscriber2 = (data) => {
    console.log('Subscriber 2 received:', data);
};

// 订阅事件
eventCenter.subscribe('event1', subscriber1);
eventCenter.subscribe('event1', subscriber2);
eventCenter.subscribe('event2', subscriber2);

// 发布事件
eventCenter.publish('event1', { message: 'Hello, World!' });

// 取消订阅
eventCenter.unsubscribe('event1', subscriber1);

// 再次发布事件
eventCenter.publish('event1', { message: 'Hello again!' });

应用场景

  1. 消息队列系统
  2. 事件驱动架构,例如node
  3. 实时数据更新
  4. 日志收集系统
  5. 插件架构 ...