定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。
var server = {
client:[],
addClient(fn){
this.client.push(fn);
},
trigger(){
for(var i = 0;i < this.client.length;i++){
this.client[i].apply(this,arguments);
}
}
};
server.addClient(function(price,square){ // 订阅者A
console.log(`面积${square}平方,价格${price}`);
});
server.addClient(function(price,square){ // 订阅者B
console.log(`面积${square}平方,价格${price}`);
});
server.trigger(1000000,100);
server.trigger(2000000,200);
// 输出:
// 面积100平方,价格1000000
// 面积100平方,价格1000000
// 面积200平方,价格2000000
// 面积200平方,价格2000000
- 我们发现,售楼处每发布一条信息,每一个订阅者都收到了,但是,并不是每个订阅者对所有的信息都感兴趣,每个人关心的只是自己想看的楼盘,无关的信息是不应该推送的。所以,将上面的例子修改一下,增加分类,根据不同订阅者的爱好存放不同的client回调。
var server = {
client:{},
addClient(key,fn){
if(!this.client[key]){
this.client[key] = [];
}
this.client[key].push(fn);
},
trigger(){
var type = Array.prototype.shift.call(arguments);
var set = this.client[type];
if(!set || set.length === 0){
return false;
}
for(var i = 0;i < set.length;i++){
set[i].apply(this,arguments);
}
}
};
server.addClient('big',function(price,square){
console.log(`面积${square}平方,价格${price}`);
});
server.addClient('middle',function(price,square){
console.log(`面积${square}平方,价格${price}`);
});
server.trigger('middle',1000000,100);
server.trigger('big',2000000,200);
// 输出:
// 面积100平方,价格1000000
// 面积200平方,价格2000000
- 删除订阅,只要根据类型找到回调函数并从订阅列表删除就行了
var server = {
client:{},
addClient(key,fn){
if(!this.client[key]){
this.client[key] = [];
}
this.client[key].push(fn);
},
trigger(){
var type = Array.prototype.shift.call(arguments);
var set = this.client[type];
if(!set || set.length === 0){
return false;
}
for(var i = 0;i < set.length;i++){
set[i].apply(this,arguments);
}
},
remove(key,fn){
if(!this.client[key]){ // 没有该类型订阅
return false;
}
if(!fn){ // 没有传入回调函数,清空所有该类型订阅
this.client[key] = [];
}else{
// 遍历并删除订阅
for(var i = 0;i < this.client[key].length;i++){
if(this.client[key][i] === fn){
this.client[key].splice(i,1);
}
}
}
}
};
function fn(price,square){
console.log(`面积${square}平方,价格${price}`);
}
server.addClient('big',fn)
server.addClient('middle',fn);
server.addClient('small',fn);
server.remove('middle');// 移除所有middle类型的订阅
server.trigger('small',500000,50);
server.trigger('middle',1000000,100);
server.trigger('big',2000000,200);
// 输出
// 面积50平方,价格500000
// 面积200平方,价格2000000