Javascript設計模式理論與實戰:觀察者模式

來源:互聯網
上載者:User

Javascript設計模式理論與實戰:觀察者模式

觀察者模式主要應用於對象之間一對多的依賴關係,當一個對象發生改變時,多個對該對象有依賴的其他對象也會跟著做出相應改變,這就非常適合用觀察者模式來實現。使用觀察者模式可以根據需要增加或刪除對象,解決一對多個物件間的耦合關係,使程式更易於擴充和維護。

基礎知識

觀察者模式定義了對象間的一種一對多依賴關係,每當一個對象發生改變時,其相關依賴對象皆得到通知並被進行相應的改變。觀察者模式又叫做發布-訂閱 模式。生活中有很多類似的關係,比如公眾號訂閱,多個讀者訂閱一個公眾號,一旦公眾號有更新,多個讀者都會收到更新,而這種情況在應用程式中也非 常常見,js綁定各種事件本質上就是觀察者模式的實現。
觀察者模式是一個非常有用的設計模式,它主要有兩個角色群組成:
1)目標對象:作為一對多關聯性中的一,可以用來管理觀察者的增加和刪除
2)觀察者對象:觀察目標對象,一旦目標發生改變則做出相應的反應

觀察者模式的實現

基本樣本

在Web開發中,我們經常遇到這種情況,ajax請求資料後,要同時更新資料到頁面的不同部分中,這種情況我們可以最直接的在ajax的回調中更新 頁面,但是如果要更新的位置很多,我們就要去修改回呼函數,這樣代碼的維護性和擴張性不高,這種情況下,我們就可以用觀察者模式來實現。
首先,需要一個最基本的目標對象,我們定義如下:

 
  1. function Subject() { 
  2.     this.observers = []; 
  3. Subject.prototype = { 
  4.     constructor: Subject, 
  5.     subscribe: function (fn) { 
  6.         this.observers.push(fn); 
  7.         return this; 
  8.     }, 
  9.     unsubscribe: function (fn) { 
  10.         this.observers = this.observers.filter(function (item) { 
  11.             if (item !== fn) { 
  12.                 return item; 
  13.             } 
  14.         }); 
  15.         return this; 
  16.     }, 
  17.     fire: function (data, context) { 
  18.         this.observers.forEach(function (item) { 
  19.             item.call(context, data); 
  20.         }); 
  21.         return this; 
  22.     } 
  23. }; 

目標對象Subject中有一個數組,這個數組儲存觀察者列表,而目標對象提供三個方法:觀察對象,取消觀察對象,觸發對象更新。
我們通過subscribe方法增加觀察者,儲存到observers數組中,如果有需要可以通過unsubscribe方法取消訂閱,然後更新資料時調用fire方法觸發,從而通知各個觀察者進行相應處理。
假設我們頁面有一個主視圖和一個側視圖,兩個視圖都要進行相應的修改,我們可以定義兩個對象如下:

 
  1. function SideView() { } 
  2. SideView.prototype.render = function (data) { 
  3.     console.log("Side data:" + data); 
  4. function MainView() { } 
  5. MainView.prototype.render = function (data) { 
  6.     console.log("MainView data:" + data); 

上面代碼定義了兩個對象,分別為側視圖和主視圖,兩個對象都有相應的渲染頁面的方法render,然後我們將兩個方法添加到觀察者列表中。

 
  1. var subject = new Subject(); 
  2. var sideView = new SideView(); 
  3. var mainView = new MainView(); 
  4.  
  5. subject.subscribe(sideView.render) 
  6. subject.subscribe(mainView.render); 
  7. subject.fire("test"); 

通過調用fire方法,傳入“test”,從而觸發兩個render函數。從這段代碼中,我們可以很輕鬆地通過subscribe來添加觀察者對象,而不必每次都去修改fire方法。

jQuery中的觀察者模式

jQuery中實現觀察者模式非常方便,簡短的幾句代碼就可以實現

 
  1. (function ($) { 
  2.             var obj = $({}); 
  3.             $.subscribe = function () { 
  4.                 obj.on.apply(obj, arguments); 
  5.             } 
  6.             $.unsubscribe = function () { 
  7.                 obj.off.apply(obj, arguments); 
  8.             } 
  9.             $.fire = function () { 
  10.                 obj.trigger.apply(obj, arguments); 
  11.             } 
  12.         })(jQuery); 

在jQuery中,通過on方法來綁定事件,off來移除事件,trigger來觸發事件,本質上就是一種觀察者模式。上面代碼中,我們通過一個obj對象來儲存觀察者對象,我們只要像平時綁定事件一樣使用就可以,如下:

 
  1. $.subscribe("render", function () { 
  2.     console.log("test"); 
  3. }) 
  4. $.subscribe("render", function () { 
  5.     console.log("test2"); 
  6. }) 
  7. $.fire("render"); 

這段代碼分別輸出test和test2.我們綁定了兩個處理函數到render上,然後通過fire觸發render事件,這就實現了觀察者模式一對多依賴的特點。

總結

觀察者模式是一種很常用的設計模式,因為我們的應用程式中涉及到依賴關係的非常多。常見的比如訊息通知,向使用者發送一個訊息需要同時通知到站內信, 郵件,簡訊等多種訊息,這種一對多的情況非常適合使用觀察者模式來實現。使用觀察者模式的關鍵是在於理清目標對象和觀察者對象,目標對象通過一個數組對觀 察者對象進行管理,更新資料的時候再迴圈調用觀察者對象,從而實現觀察者模式。

原文地址:http://luopq.com/2015/11/24/design-pattern-observer/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.