手写续——发布订阅

122 阅读2分钟

发布/订阅(Publish/Subscribe)是一种消息传递模式,其中消息发布者(Publisher)将消息发送到一个消息队列或主题(Topic),而订阅者(Subscriber)则从这个队列或主题中订阅消息。当新的消息被发布到队列或主题中时,所有订阅者都会收到这个消息。

on/ emit / off是较为常见的几种订阅模式

注意这种设计模式有几点特征:

  1. 发布者和订阅者之间是松耦合的,发布者不需要知道谁订阅了消息,订阅者也不需要知道消息来自哪个发布者。
  2. 这种模式使得系统中的组件之间可以相互独立,降低了系统的复杂性,同时也提高了系统的可扩展性和可维护性。
  3. 发布/订阅模式在许多场景中都有广泛的应用,比如消息队列、事件驱动架构、分布式系统等。

实现手写的示例代码:

 const EvenHub = {
                 queueMap : {},
                 on: function(name, fn) {
                       EvenHub.queueMap[name] = EvenHub.queueMap[name] || []
                       EvenHub.queueMap.push(fn)
                 },
                 emit: function(name, fn) {
                  const q = EvenHub.queueMap[name]
                  if(!q){ return }
                  q.map(fn => fn.call(null, data))
                  return undefined
                 },
                 off: function(name, fn) {
                  //alias别名
                  const q = EvenHub.queueMap[name]
                  if(!q){return}
                 const index =q.indexOf(fn)
                 if(q <= 0) {return }
                 q.splice(index, 1)
                 }
            }

使用方式:

EvenHub.on('click', console.log('hi'))
setTimeout(()=>{
   EvenHub.emit('click', console.log('我是trigger'))
}, 3000)

概念解析Tips:

  1. 消息代理(Message Broker):负责将消息从发布者发送到订阅者,通常使用消息队列实现。
  2. 主题(Topic):消息发布者发布消息的地址或通道,订阅者可以订阅一个或多个主题。
  3. 订阅者(Subscriber):接收并处理来自主题的消息的组件或服务。
  4. 发布者(Publisher):将消息发布到主题的组件或服务。
  5. 事件(Event):指系统中发生的某些状态或动作,可以作为消息发布到主题中。
  6. 观察者模式(Observer Pattern):一种与发布/订阅模式类似的设计模式,其中主题维护一个观察者列表,当主题状态发生变化时,通知所有观察者。
  7. 可靠性保证:在发布/订阅模式中,需要确保消息能够可靠地传递到订阅者,通常使用ACK机制和持久化存储来保证可靠性。