作为大龄失业青年,在这个就业率低的时代,我也很无奈。
但是!!!!
八股文,该背还得背
那么
对于面试中的遇到的需要手写发布订阅模式,我们应该如何快速记住呢~~~~
特别提示⚠️:小菜鸟自嗨中,大佬可以麻烦退出,不浪费时间
首先,浅浅了解一下啥叫发布/订阅模式。
很多人在微博上关注了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('帆布鞋', ' 帆布鞋售罄了 ') // 打电话通知买家帆布鞋消息
更多文章,请看👉️: