跳至主要內容

发布订阅模式

wzCoding小于 1 分钟综合知识发布订阅模式

发布订阅模式

发布订阅模式与观察者模式在功能上类似,都是在对象之间简历联系,当一个被依赖(被观察)的对象状态发生变化后,会通知到其他对象(依赖对象),但发布订阅模式与观察者模式不同之处在于它通知依赖对象的方式是通过自定义事件,而不直接通知观察者。

具体实现

发布订阅模式代码实现:

//定义 PubSub 类
class PubSub {
   constructor() {

      //定义事件中心,用来存放自定义事件
      this.subscribers = {}
   }

   //使用自定义事件进行订阅
   subscribe(eventName, callback) {
      if (!Array.isArray(this.subscribers[eventName])) {
            this.subscribers[eventName] = []
      }
      this.subscribers[eventName].push(callback)
   }

   //发布自定义事件
   publish(eventName, data) {
      if (!Array.isArray(this.subscribers[eventName])) return
      this.subscribers[eventName].forEach((callback) => {
            callback && callback(data)
      })
   }

   //取消订阅
   unsubscribe(eventName, callback) {
      let callbackList = this.subscribers[eventName]
      if (!callbackList) return

      if (!callback) {
            callbackList && (callbackList.length = 0)
      } else {
            let index = callbackList.indexOf(callback)
            callbackList.splice(index, 1)
      }
   }
}

// 使用示例
const myPubSub = new PubSub();

myPubSub.subscribe('event1', (data) => {
   console.log('Event1 received data:', data);
});

myPubSub.publish('event1', 'Hello World!'); // 输出: Event1 received data: Hello World!

myPubSub.unsubscribe('event1'); // 取消 event1 的发布订阅