1.定义:观察者模式又被称为发布-订阅模式,它描述对象间一对多的依赖关系,即当一个对象的状态发生改变时,所有依赖它的对象都将得到通知。
2.实例,背景:买房者对于某售房处房屋信息的关注,通过观察者模式实现及时获得房屋信息。
//通用观察者模式功能
var event = {
clientList:{},//买房者关注的房屋信息列表
listen: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);//arguments是trigger时带上的参数
}
},
remove:function(key,fn){//取消关注的房屋信息
var fns = this.clientList[key];
if(!fns){
return false;
}
if(!fn){
fns && (fns.length = 0);
}else{
for(var l = fns.length-1;l >=0;l--){
var _fn = fns[l];
if(_fn === fn){
fns.splice(l,1);
}
}
}
}
};
//定义给对象安装观察者模式功能的方法
var installEvent = function(obj){
for(var i in event){
obj[i] = event[i];
}
};
//使用观察者功能
var salesOffices = {};//售楼处对象
installEvent(salesOffices);
salesOffices.listen('squareMeter88',function(price){
console.log('价格='+price);
});
salesOffices.trigger('squareMeter88',20000000);
salesOffices.remove('squareMeter88');//删除关于88平方的房屋信息
3.优点:时间解耦和对象之间解耦;缺点:消耗一定的时间和内存,追踪问题增加难度(因为对象之间的联系深埋在背后)