觀察者模式和訂閱者模式

觀察者模式

目標和觀察者是基類,目標提供維護觀察者的一系列方法,觀察者提供更新接口。具體觀察者和具體目標繼承各自的基類,而後具體觀察者把本身註冊到具體目標裏,在具體目標發生變化時候,調度觀察者的更新方法。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

相關文章
相關標籤/搜索