《javascript 设计模式》 第15章 观察者模式 -- 学习笔记

 

        定义:            

在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者 “publisher-subscriber" 模式) 是一种管理人与其任务之间的关系(确切的讲,是其对象及其行为和状态之间的关系

)的得力工具。用javascript的 话来说,这种模式的实质 就是你可以程序中某个对象的状态进行观察并且在其发生改变时能够得到通知。

 

 


 

 

观察者API:

 

var Publisher=function(){
this.subscribers=[];
}
//推送方法
Publisher.prototype.deliver=function(data){
          this.subscribers.forEach(function(fn){
                                       fn(data);
                                                })
                         return this;   
                   };

 

订阅方法:

 

Function.prototype.subscribe=function(publisher){
                            
             var self=this;

             var alreadyExists=publisher.subscribers.some(function(value){
                                   return  value ===self;
                                                     }
                                               );
          if(!alreadyExists){            
                 publisher.subscribers.push(this);
            }
            return this ;
};

 

这有个小插曲,译者在这段代码中加了译注 :

                      ”因为任何函数都是 Function的实例,所以在Function.prototype中添加的新方法会被所有函数继承。当然这里把subscribe添加到Function.prototype中只是为了省事,在实际项目中不应该这样做。“

那应该怎么做呢? 我情不自禁的问道。

 

var   subscribe=function(publisher){ 
   var alreadyExists=publisher.subscribers.some(function(value){
                return  value ===self;
             }
          );
          if(!alreadyExists){            
              publisher.subscribers.push(this);
            }

}
                                         (1)
function c(a){ alert(a+3)}

 
var publisher= new Publisher
subscribe.call(c,publisher)                 (2)

哇 完全可以这么做.. 巧了!!

 

退订方法:

 

Function.prototype.unsubscribe=function(publisher){
                            
             var self=this;

publisher.subscribers=publisher.subscribers.filter(function(value){
                                   return  value !==self;
                                             }
                                        );
                            return this ;
                           };

当然 这个也可以成为上面函数(1)(2)那种形式:

 

var   unsubscribe=function(publisher){ 
var self = this
  publisher.subscribers= publisher.subscribers.filter(function(value){
                return  value !== self;
                                               }
                                         );
        
                 } 
                                                (3function c(a) { alert(a+3)}      
 
var publisher= new Publisher    
unsubscribe.call(c,publisher)                   (4)

 

OK 观察者模式大致就是这个样子了...。。。

posted @ 2015-06-12 22:28  Soso222  阅读(193)  评论(0)    收藏  举报