1、发布-订阅模式又叫观察者模式,它定义对象之间一种一对多的依赖关系。
2、如何实现发布-订阅模式
2-1、首先指定好发布者
2-2、给发布者添加一个缓冲列表,用户存放回调函数以便通知订阅者
2-3、最后发布消息时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数
例子:
var salesOffice = {};
salesOffice.clientList = [];
salesOffice.listen = function(key,fn){
if(!this.clientList[key]){
this.clientList[key] = [];
}
this.clientList[key].push(fn);
}
salesOffice.trigger = function(){
var key = Array.prototype.shift.call(arguments),
fns = this.clientList[key];
if(!fns || fns.length == 0){
return false;
}
for(var i=0,fn; fn = fns[i++];){
fn.apply(this,arguments);
}
}
salesOffice.listen('s88',function(p){
console.log("价格+" + p)
})
salesOffice.listen('s300',function(p){
console.log("价格+" + p)
})
salesOffice.trigger('s88',20000);
salesOffice.trigger('s300',3000);
发布订阅的通用实现:
var event = {
clientList : [],
listener :function(key,fn){
if(!this.clientList[key]){
this.clientList[key] = [];
}
this.clientList[key].push(fn); //订阅消息添加进缓存列表
},
trigger:function(){
var key = Array.prototype.shift.call(arguments),
fns = this.clientList[key];
if(!fns || fns.length === 0){
return false;
}
for(var i=0,fn; fn=fns[i++];){
fn.apply(this,arguments);
}
}
};
var installEvent = function(obj){
for(var i in event){
obj[i] = event[i];
}
}
通用订阅发布模式
//通用发布订阅模式 //var evt = (evt) ? evt: window.event; var Event = (function(){ var clientList = {}, listen, trigger, remove; listen = function(key,fn){ //订阅 if(!clientList[key]){ clientList[key] = []; } clientList[key].push(fn); }; trigger = function(){ //发布 var key = Array.prototype.shift.call(arguments), fns = clientList[key]; if(!fns || fns.length === 0){ return false; } for(var i=0,fn; fn=fns[i++];){ fn.apply(this,arguments); } }; /*remove = function(){ //删除 }*/ return { listen:listen, trigger:trigger, remove:remove } })(); /* Event.listen("sales100",function(p){ console.log("总价 :"+ (p * 70)); }); Event.trigger("sales100",8000); */ var a = (function(){ var count = 0; document.getElementById("btn").onclick = function(){ Event.trigger("add",count++); } })(); var b = (function(){ var div = document.getElementById("show"); Event.listen('add',function(p){ div.innerHTML = p; }) })();