自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Javascript設(shè)計(jì)模式理論與實(shí)戰(zhàn):觀察者模式

開(kāi)發(fā) 前端
觀察者模式主要應(yīng)用于對(duì)象之間一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),多個(gè)對(duì)該對(duì)象有依賴的其他對(duì)象也會(huì)跟著做出相應(yīng)改變,這就非常適合用觀察者模式來(lái)實(shí)現(xiàn)。使用觀察者模式可以根據(jù)需要增加或刪除對(duì)象,解決一對(duì)多對(duì)象間的耦合關(guān)系,使程序更易于擴(kuò)展和維護(hù)。

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

基礎(chǔ)知識(shí)

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

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

基本示例

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

  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. }; 

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

 

  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); 

 

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

 

  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"); 

 

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

jQuery中的觀察者模式

jQuery中實(shí)現(xiàn)觀察者模式非常方便,簡(jiǎn)短的幾句代碼就可以實(shí)現(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中,通過(guò)on方法來(lái)綁定事件,off來(lái)移除事件,trigger來(lái)觸發(fā)事件,本質(zhì)上就是一種觀察者模式。上面代碼中,我們通過(guò)一個(gè)obj對(duì)象來(lái)保存觀察者對(duì)象,我們只要像平時(shí)綁定事件一樣使用就可以,如下:

 

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

 

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

總結(jié)

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

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

責(zé)任編輯:王雪燕 來(lái)源: 博客園
相關(guān)推薦

2020-10-26 08:45:39

觀察者模式

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2021-07-08 11:28:43

觀察者模式設(shè)計(jì)

2022-01-29 22:12:35

前端模式觀察者

2015-11-12 09:32:03

Javascript設(shè)計(jì)模式

2015-11-03 09:43:43

avascript設(shè)計(jì)模式工廠模式

2024-02-18 12:36:09

2021-09-06 10:04:47

觀察者模式應(yīng)用

2009-03-30 09:39:04

觀察者思想換位設(shè)計(jì)模式

2024-06-04 13:11:52

Python行為設(shè)計(jì)模式開(kāi)發(fā)

2011-04-29 09:22:22

2012-08-27 10:52:20

.NET架構(gòu)觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2021-01-25 05:38:04

設(shè)計(jì)原理VueSubject

2024-12-03 09:34:35

觀察者模 式編程Javav

2022-05-09 10:50:13

觀察者模式設(shè)計(jì)模式

2021-09-29 19:45:24

觀察者模式Observable

2021-06-03 12:26:28

觀察者模式面試阿里P6

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2021-06-07 20:03:04

監(jiān)聽(tīng)器模式觀察者
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)