成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
觀察者模式主要應(yīng)用于對(duì)象之間一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),多個(gè)對(duì)該對(duì)象有依賴的其他對(duì)象也會(huì)跟著做出相應(yīng)改變,這就非常適合用觀察者模式來實(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)改變,這就非常適合用觀察者模式來實(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)用程序中也非 常常見,js綁定各種事件本質(zhì)上就是觀察者模式的實(shí)現(xiàn)。
觀察者模式是一個(gè)非常有用的設(shè)計(jì)模式,它主要有兩個(gè)角色組成:
(1)目標(biāo)對(duì)象:作為一對(duì)多關(guān)系中的一,可以用來管理觀察者的增加和刪除
(2)觀察者對(duì)象:觀察目標(biāo)對(duì)象,一旦目標(biāo)發(fā)生改變則做出相應(yīng)的反應(yīng)

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

基本示例

在Web開發(fā)中,我們經(jīng)常遇到這種情況,ajax請(qǐng)求數(shù)據(jù)后,要同時(shí)更新數(shù)據(jù)到頁面的不同部分中,這種情況我們可以最直接的在ajax的回調(diào)中更新 頁面,但是如果要更新的位置很多,我們就要去修改回調(diào)函數(shù),這樣代碼的維護(hù)性和擴(kuò)張性不高,這種情況下,我們就可以用觀察者模式來實(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ì)象更新。
我們通過subscribe方法增加觀察者,保存到observers數(shù)組中,如果有需要可以通過unsubscribe方法取消訂閱,然后更新數(shù)據(jù)時(shí)調(diào)用fire方法觸發(fā),從而通知各個(gè)觀察者進(jìn)行相應(yīng)處理。
假設(shè)我們頁面有一個(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)的渲染頁面的方法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"); 

 

通過調(diào)用fire方法,傳入“test”,從而觸發(fā)兩個(gè)render函數(shù)。從這段代碼中,我們可以很輕松地通過subscribe來添加觀察者對(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中,通過on方法來綁定事件,off來移除事件,trigger來觸發(fā)事件,本質(zhì)上就是一種觀察者模式。上面代碼中,我們通過一個(gè)obj對(duì)象來保存觀察者對(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上,然后通過fire觸發(fā)render事件,這就實(shí)現(xiàn)了觀察者模式一對(duì)多依賴的特點(diǎn)。

總結(jié)

觀察者模式是一種很常用的設(shè)計(jì)模式,因?yàn)槲覀兊膽?yīng)用程序中涉及到依賴關(guān)系的非常多。常見的比如消息通知,向用戶發(fā)送一個(gè)消息需要同時(shí)通知到站內(nèi)信, 郵件,短信等多種消息,這種一對(duì)多的情況非常適合使用觀察者模式來實(shí)現(xiàn)。使用觀察者模式的關(guān)鍵是在于理清目標(biāo)對(duì)象和觀察者對(duì)象,目標(biāo)對(duì)象通過一個(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é)任編輯:王雪燕 來源: 博客園
相關(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-03 09:43:43

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

2015-11-12 09:32:03

Javascript設(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ì)模式開發(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)聽器模式觀察者
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲国产精品久久 | 欧美精品欧美精品系列 | 免费国产一区二区 | 国产美女一区二区三区 | 在线观看国产网站 | 久久www免费人成看片高清 | 国产一级毛片精品完整视频版 | 色综合色综合色综合 | 二区在线视频 | 亚洲久在线 | 成年人免费网站 | 国外成人在线视频网站 | 欧美在线一区视频 | 亚洲精选一区二区 | 超碰在线影院 | 久久91| 国产激情视频网 | 日韩a在线| 久久91精品国产 | 中文字幕在线三区 | 久久国产欧美日韩精品 | 91视频在线看 | 国产美女久久 | 亚洲精品一区二区 | 成人激情视频 | 找个黄色片| 乱一性一乱一交一视频a∨ 色爱av | 国产精品一区二区av | 欧美一区二区三区大片 | 91国产在线播放 | 毛片网站在线观看 | 天天操夜夜操免费视频 | 欧美激情在线精品一区二区三区 | 日本特黄a级高清免费大片 特黄色一级毛片 | 99国产精品久久久久久久 | 91精品国产91久久久久久吃药 | www312aⅴ欧美在线看 | 亚洲精品视频免费 | 麻豆亚洲| 在线免费观看黄a | 亚洲欧美网 |