浅谈发布订阅模式
/ / 点击 / 阅读耗时 4 分钟在JS设计模式里面,咱们听到的莫属与发布订阅模式。在Vue里面很重要的双向绑定,就是基于发布订阅模式来实现的。之前听的比较多,但是没有更深入的了解,通过最近学习了下,想记录下自己理解的发布订阅模式是怎样的。
什么是发布订阅模式?
发布—订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。
发布订阅模式举例说明:
小李、小明、小张同时在网上看中了一款球鞋,但是此款球鞋已经售罄。如果想要买到这双球鞋的话,需要点击网页上的“到货通知”按钮,当球鞋补货后会同时通知已经”订阅”的小李、小明、小张。
这就是现实生活中的发布订阅模式。小李、小明、小张属于订阅者,而球鞋店铺属于发布者。这个过程是属于”异步”的,谁也不知道球鞋什么时候补货,但是当球鞋补货上架的那一刻就会通知到所有人。
简单的发布订阅模式
var obj = {
}
//添加订阅者
obj.on = function (name, fn) {
//判断是否有该订阅输入,若无则创建数组容器,有则推到数组里面暂存
if (!obj.name) {
obj[name] = []
}
obj[name].push(fn)
}
//添加发布者
obj.emit = function (name, ...arg) {
var _name = name
//遍历发布的属性,依次执行函数
for (var i = 0; i < obj[_name].length; i++) {
obj[_name][i].call(this, ...arg)
}
}
obj.on('notice', function (name, size) {
console.log(name, '订阅了我')
console.log('我的鞋码是:', size + '码');
//小明订阅了我
//我的鞋码是41
//小张订阅了我
//我的鞋码是44
})
obj.emit('notice', '小明', 41)
obj.emit('notice', '小张', 44)
JS中的发布订阅
addEventListener这个函数就是一个明显的基于发布订阅模式封装的API,它里面有传两个参数,一个是事件名,另一个是函数回调。使用addEventListener很好的解决了异步事件执行,通过这个函数也让我对设计模式有了一定的理解。
全文完。