设计模式-观察者模式

来源:互联网 发布:origin 矩阵 编辑:程序博客网 时间:2024/06/18 11:26

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.优点:时间解耦和对象之间解耦;缺点:消耗一定的时间和内存,追踪问题增加难度(因为对象之间的联系深埋在背后)

原创粉丝点击