av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

Javascript設計模式理論與實戰(zhàn):觀察者模式

觀察者模式主要應用于對象之間一對多的依賴關(guān)系,當一個對象發(fā)生改變時,多個對該對象有依賴的其他對象也會跟著做出相應改變,這就非常適合用觀察者模式來實現(xiàn)。使用觀察者模式可以根據(jù)需要增加或刪除對象,解決一對多對象間的耦合關(guān)系,使程序更易于擴展和維護。

雨花臺ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

基礎(chǔ)知識

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

觀察者模式的實現(xiàn)

基本示例

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

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

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

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

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

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

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

jQuery中的觀察者模式

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

 
 
  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來觸發(fā)事件,本質(zhì)上就是一種觀察者模式。上面代碼中,我們通過一個obj對象來保存觀察者對象,我們只要像平時綁定事件一樣使用就可以,如下:

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

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

總結(jié)

觀察者模式是一種很常用的設計模式,因為我們的應用程序中涉及到依賴關(guān)系的非常多。常見的比如消息通知,向用戶發(fā)送一個消息需要同時通知到站內(nèi)信, 郵件,短信等多種消息,這種一對多的情況非常適合使用觀察者模式來實現(xiàn)。使用觀察者模式的關(guān)鍵是在于理清目標對象和觀察者對象,目標對象通過一個數(shù)組對觀 察者對象進行管理,更新數(shù)據(jù)的時候再循環(huán)調(diào)用觀察者對象,從而實現(xiàn)觀察者模式。

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


網(wǎng)站題目:Javascript設計模式理論與實戰(zhàn):觀察者模式
轉(zhuǎn)載源于:http://uogjgqi.cn/article/djsehdh.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流