Javascript觀察者模式


  觀察者模式(Observer Pattern),也被稱為“發布/訂閱模型(publisher/subscriber model)”。在這種模式中,有兩類對象,分別是“觀察者-Observer”和“目標對象-Subject”。目標對象中保存着一份觀察者的列表,當目標對象的狀態發生改變的時候就主動向觀察者發出通知(調用觀察者提供的方法),從而建立一種發布/訂閱的關系。

1.DOM中的觀察者模式

  JavaScript是一個事件驅動型語言,觀察者模式可謂隨處可見,例如常用的一些onclick、 attachEvent 、addEventListener 都是觀察者模式的具體應用。

document.body.onclick = function(){
    alert('我是一個觀察者,你一點擊,我就知道了');
}
document.body.addEventListener('click',function(){
    alert('我也是一個觀察者,你一點擊,我就知道了');
});

  其中,body是發布者,即目標對象,當被點擊的時候,向觀察者反饋這一事件;JavaScript中函數也是一個對象,click這個事件的處理函數(alert('...'))就是觀察者,當接收到目標對象反饋來的信息時進行一定處理。

  這個例子中的發布/訂閱關系是由JavaScript語言本身實現的,DOM的每個節點都可以作為Subject,提供了很多事件處理(Event handle)的接口,你只需要給這些接口添加監聽函數(也就是Observer),就可以捕獲觸發的事件進行處理。

 

2.自定義的對象上實現觀察者模式

  對於DOM的事件操作我們直接使用實現好的就行,但是對於自己實現的對象,就需要自己實現發布/訂閱模型了。

/**
 * Created by tsy on 2015/12/25.
 */
var ObseverPattern=function(){

    var observerPattern={
        callbacks:{},

        //增加觀察者
        addObserver:function(mes,callback,observer){
            this.callbacks[mes]=this.callbacks[mes]||[];
            this.callbacks[mes].push({
                scope:observer||this,
                callback:callback
            })
        }

        //通知事件所有觀察者
        publishObserver:function(mes,datas){
            this.callbacks[msg] = this.callbacks[msg] || [];
            for (var i = 0,len = this.callbacks[msg].length; i < len; i++) {
                this.callbacks[msg][i].apply(this.callbacks[mes][scope],datas||[]);
            }
        }

        //刪除某個觀察者
        removeObserver:function(mes,observer){
            if(!this.callbacks[mes]) return;
            this.callbacks[mes]=this.callbacks[mes].filter(function(item,index,arr){
                return item!=observer;
            });
        }
    }

}

var writer = new ObseverPattern();
var reader = {
    read: function(){alert("我讀了這本新書")}
};
writer.addObserver("newbook", function(){this.read()},reader);
writer.publishObserver("newbook");  

   

  今天就先到這里吧,明天我將會使用觀察者模型來實現簡單的雙向綁定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM