javascript 設計模式之觀察者模式

觀察者模式又叫發佈——訂閱模式,顧名思義pub——sub就是被動觸發的,:不要給我......,我會給你.......就是一個發佈訂閱的解釋,實質就是對程序中的某個對象狀態進行監聽觀察,而且在該對象發生改變時能獲得通知,下面我經過一個通用的Observer來方便對象實現發佈訂閱,this

var Observer = {
  addSub: function(callback){
    this._subList.push(callback);
  },
  removeSub: function(callback){
    for(var i=0; i<this._subList.length; i++){
      if(this._subList[i] === callback){
        delete this._subList[i];
      }
    }
  },
  publish: function(what){
      for(var i=0; i<this._subList.length; i++){
        if(typeof this._subList[i] === "function"){
          this._subList[i](what);
        }
      }
  },server

      //使object是發佈訂閱對象
  makeObserver: function(obj){
      for(var key in this){
        obj[key] = this[key];
        obj._subList = [];
      }
    }
  };
//-----------------------------------------------------------------發佈對象對象

var person1 = {
  recommend: function(str){
    var msg = "person1 發佈的數據 " + str;
    this.publish(msg);
  }
};
var person2 = {
  recommend: function(str){
    var msg = "person2 發佈的數據 " + str;
    this.publish(msg);
  }
};rem

Observer.makeObserver(person1);//實現person1對象的發佈
Observer.makeObserver(person2);//實現person2對象的發佈
//-----------------------------------------------------------------訂閱對象io

var tom = {
  read: function(what){//訂閱方法
    console.log("Tom看到了以下信息:" + what);
  }
};
var jack = {
  show: function(what){
    console.log('jack看到了以下信息:' + what)
  }
}console

person1.addSub(tom.read);
person1.addSub(jack.show);
person1.recommend("123");function

console.log("........移除jack的訂閱..............");
person1.removeSub(jack.show);
person1.recommend("678");
console.log(".............................");object

person2.addSub(jack.show);
person2.recommend("456");List

相關文章
相關標籤/搜索