您的位置:首页 > Web前端 > JavaScript

设计模式-观察者模式

2017-07-27 22:12 92 查看
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.优点:时间解耦和对象之间解耦;缺点:消耗一定的时间和内存,追踪问题增加难度(因为对象之间的联系深埋在背后)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息