概念
发布-订阅模式还可称为观察者模式,它定义对象之间一对多的依赖关系,当一个属性发生改变时,所有依赖它的地方都会得到通知变化。
示例
let event = {
list: [], // 缓存
addEvent: function( key, fn) { // 添加订阅者
if( !this.list[key] ){
this.list[key] = [];
}
this.list[key].push(fn)
},
addtrgger: function() { // 添加发布者
let key = Array.prototype.shift.call(arguments),
fns = this.list[key];
if( !fns || fns.length == 0){
return false
}
for(let i=0,fn;fn = fns[i++];){
fn.apply( this, arguments)
}
}
}
let ins = function(obj) { // 安装订阅者发布模式函数
for(let i in event) {
obj[i] = event[i]
}
}
let s = {}
ins(s) // 安装到s对象上
s.addEvent('a',fn1 = function(){
console.log('小明订阅了')
console.log(arguments)
})
s.addEvent('a',fn2 = function(){
console.log('小红订阅了')
console.log(arguments)
})
s.addtrgger('a',1)
这是一段通用简单的发布者订阅代码,在 event 对象中分别创建了 订阅者缓存列表,添加订阅者函数,发布者函数 ,在声明一个安装函数,可以安装到所有对象上。
取消订阅
event.remove = function( key, fn) {
let fns = this.clientList[ key ];
if(!fns) return false;
if( !fn ) {
fns && (fns.length = 0)
}else {
for (let i = fns.length - 1;i>=0;i--;) {
let _+fn = fns[i]
if (_fn === fn) {
fns.splice(i,1)
}
}
}
}
s.remove('a', fn1)