如何快速记住手写发布/订阅模式的代码

82 阅读2分钟

作为大龄失业青年,在这个就业率低的时代,我也很无奈。

但是!!!!

八股文,该背还得背

那么

对于面试中的遇到的需要手写发布订阅模式,我们应该如何快速记住呢~~~~

特别提示⚠️:小菜鸟自嗨中,大佬可以麻烦退出,不浪费时间

首先,浅浅了解一下啥叫发布/订阅模式。

很多人在微博上关注了A,那么当A发布微博动态的时候微博就会为我们推送这个动态。在这个例子中,A就是发布者,我们是订阅者,微博就是调度中心,我们和A之间是没有直接信息来往的,都是通过微博平台来协调的,这就是发布-订阅模式。

ok,理论说完了,实践开始。


前面我们提到调度中心,所以这里我们需要创建一个调度中心。

class Publisher {
  constructor() {
    this._subsMap = {}
  }
}

对,就是一个对象,是的。

消息订阅

判断是否这种类型订阅是否存在,不存在,加一个。存在这种类型且不存在这种订阅,那就塞进去。

subscribe(type, cb) {
  if (this._subMap[type]) {
    if (!this._subMap[type].includes(cb)) {
      this._subMap[type].push(cb)
    }
  } else {
    this._subMap[type] = [cb]
  }
}

消息退订

存在这种类型的订阅的时候,把这个订阅删掉

unsubscribe(type, cb) {
  if (!this._subMap[type] || !this._subMap[type].includes(cb)) {
    return
  }
  const index = this._subMap[type].indexOf(cb)
  this._subMap[type].splice(index, 1)
}

消息发布

找到这种类型的订阅,都执行一遍。

notify(type, ...payload) {
  if (!this._subMap[type]) return
  this._subMap[type].forEach(cb => cb(...payload))
}

只执行一次订阅事件

订阅一下,然后再删除

once(type, cb) {
  function cb() {
    cb()
    this.unsubscribe(type, cb)
  }
  this.subscribe(type, cb)
}

okk,是不是很简单好记

好的,我们来执行测试一下

const publiser = new Publisher()
publiser.subscribe('运动鞋', message => console.log('152xxx' + message))    // 订阅运动鞋
publiser.subscribe('运动鞋', message => console.log('138yyy' + message))
publiser.subscribe('帆布鞋', message => console.log('139zzz' + message))    // 订阅帆布鞋
publiser.notify('运动鞋', ' 运动鞋到货了 ')   // 打电话通知买家运动鞋消息
publiser.notify('帆布鞋', ' 帆布鞋售罄了 ') // 打电话通知买家帆布鞋消息

更多文章,请看👉️:

如何快速记住手写数组方法的那些代码

如何快速记住手写Promise方法的那些代码