观察者模式和订阅者模式

观察者模式

目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,而后具体观察者把本身注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。javascript

function Observer(){
  this.list = {};//保存全部观察者方法的引用
}
//添加观察者
Observer.prototype.addWatcher = function(type,func){
  if(!(this.list[type] instanceof Array)){
    this.list[type] = [];
  }
  this.list[type].push(func);
}
//发布
Observer.prototype.fire = function(type){
  var typeFunc = this.list[type];
  var len = typeFunc.length;
  for(var i = 0;i < len; i++){
    typeFunc[i](event);
  }
}
//移除观察者
Observer.prototype.removeWatcher = function(type,func){
  var typeFunc = this.list[type];
  if(!(typeFunc instanceof Array)){
    return;
  }
  var len = typeFunc.length;
  for(var i = 0;i < len; i++){
    if(typeFunc[i] == func){
      typeFunc.splice(i,1);
    }
  }
}   

复制代码

发布/订阅模式

订阅者把本身想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代java

function Publisher(){
        this.subers = {};//存储各种订阅者
      }
	  //添加发布者
      Publisher.prototype.addSub = function(type,func){
        if(!(subers[type] instanceof Array)){
          subers[type] = [];
        }
        subers[type].push(func);
      }
	  //移除发布者
      Publisher.prototype.removeSub = function(type,func){
        var typeFunc = subers[type];
        if(!(typeFunc instanceof Array)){
          return;
        }
        var len = typeFunc.length;
        for(var i = ;i < len; i++){
          if(typeFunc[i] == func){
            typeFunc.splice(i,1);
          }
        }
      }
	  //发布
      Publisher.prototype.fire = function(type){
        var typeFunc = subers[type];
        var len = typeFunc.length;
        for(var i = ;i < len; i++){
          typeFunc[i](event);
        }
      }
      function Subscriber(){
        this.Publisher = new Publisher();
      }
      Subscriber.prototype.fire = function(type){
        this.Publisher.fire(type);
      } 
复制代码

上文能够看出发布/订阅模式相对观察者模式多了一个中间过分把发布和订阅分开,若是从这点代码量看来好像发布订阅彻底画蛇添足,可是在大型项目中的团队合做来讲,彻底解耦是十分有必要的。ui

相关文章
相关标签/搜索