1. 程式人生 > >JS實現監聽模式和觀察者模式

JS實現監聽模式和觀察者模式

[b]引子:[/b]

最近看阮一峰先生的[url=http://www.ruanyifeng.com/blog/2012/12/asynchronous_javascript.html]這篇[/url]文章,文章涉及到觀察模式,監聽模式相關的設計模式的內容,正好,我最近也用swt做個一個視訊批量上傳的桌面應用,在這個桌面應用的sdk中,有大量的監聽器介面,用來監聽該應用的很多元件上的事件,比如按鈕的點選事件、樹形元件節點的選中事件,等等。我為了實現該應用,也大量應用了監聽模式,譬如:檔案上傳進度的監聽,上傳列表選中行的事件監聽,軟體啟動時log4j初始化的監聽事件,等等。
[img]http://dl.iteye.com/upload/attachment/0078/5511/9bcdefec-7190-39d4-9758-05e99e70ef56.png[/img]
[img]http://dl.iteye.com/upload/attachment/0078/5513/a261a023-e2a1-3627-998c-975567481822.png[/img]
在該應用開發的過程中,我曾經思考過用觀察者模式,但最後為了應用程式碼維護的簡單性,所有的事件處理,都統一使用了監聽模式。實際上面提到的檔案上傳進度的監聽,上傳列表選中行的事件監聽,軟體啟動時log4j初始化的監聽事件,只有上傳列表選中行的事件監聽可以改為觀察者模式,原因是因為選中多行時,確實要同時去更新工具欄狀態和狀態列顯示的資訊。

為了對監聽模式和觀察者模式有一個複習,我回復了阮先生的部落格,參考:[url]http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html#comment-267332[/url],回覆是通過js實現一個監聽模式的例子。實際上,我後來發現這個例子有一些命名上的瑕疵。本想再寫一個觀察者模式的例子進行回覆,無奈阮先生的部落格的評論功能實在是太弱了,我監聽模式的例子就貼亂了,還煩勞他修改了一次。因此,我才決心寫兩篇部落格交代一下這兩個設計模式。當然了,這篇部落格我只打算寫兩個沒有什麼實際場景的小例子,下篇部落格,舉例一個真實的場景,用java和js分別給出實現程式碼。

請看監聽模式的程式碼示例:

[code]
// 事件物件
var Event = function(obj) {
this.obj = obj;
this.getSource = function() {
return this.obj;
}
}

// 監聽物件
var F2 = function() {
this.hander = function(event) {
var f1 = event.getSource();
console.log("f2 do something!");
f1.callback();
}
}

// 被監聽物件
var F1 = function() {
this.abc = function() {
console.log("f1 do something one!");
// 建立事件物件
var e = new Event(this);
// 釋出事件
this.f2.hander(e);
console.log("f1 do something two!");
}

this.on = function(f2) {
this.f2 = f2;
}

this.callback = function() {
console.log("f1 callback invoke!");
}
}

// 主函式
function main() {
var f1 = new F1();
var f2 = new F2();
// 加入監聽
f1.on(f2);
f1.abc();
}

// 執行主函式
main();
[/code]

監聽模式示例執行結果:
[quote]
f1 do something one!
f2 do something!
f1 callback invoke!
f1 do something two!
[/quote]


觀察者模式的程式碼示例:

[code]
// 觀察者物件1
var F2 = function() {
this.update = function(observable, obj) {
console.log("f2 do something!");
for (var i=0, len=obj.length; i<len; i++) {
console.log(obj[i]);
}
observable.callback();
}
}

// 觀察者物件2
var F3 = function() {
this.update = function(observable, obj) {
console.log("f3 do something!");
for (var i=0, len=obj.length; i<len; i++) {
console.log(obj[i]);
}
observable.callback();
}
}

// 被觀察物件
var F1 = function() {
// 儲存所有觀察者
var observers = [];

this.abc = function() {
console.log("f1 do something one!");
var datas = ["蘋果", "桃子", "香蕉"];
// 通知所有觀察者
this.notifyObservers(datas);
console.log("f1 do something two!");
}

this.addObserver = function(observer) {
observers.push(observer)
}

this.callback = function() {
console.log("f1 callback invoke!");
}

this.notifyObservers = function(arg){
if (observers.length == 0) {
return;
};
for (var i = 0, len = observers.length; i < len; i++) {
observers[i].update(this, arg);
}
}
}

// 主函式
function main() {
var f1 = new F1();
var f2 = new F2();
var f3 = new F3();
// 加入觀察者
f1.addObserver(f2);
f1.addObserver(f3);
f1.abc();
}

// 執行主函式
main();
[/code]

觀察者模式示例執行結果:
[quote]
f1 do something one!
f2 do something!
蘋果
桃子
香蕉
f1 callback invoke!
f3 do something!
蘋果
桃子
香蕉
f1 callback invoke!
f1 do something two!
[/quote]

總結:
1、在觀察者模式示例中,被觀察的物件有兩個觀察者,因此兩個觀察者的邏輯被各自呼叫了;在監聽模式示例中,被監聽的物件只有一個監聽者,因此只有一個監聽者邏輯被呼叫了。監聽模式示例中的監聽者也可以有多個,但通知的時候需要逐一通知,比較麻煩,而觀察者就方便多了,所以,當一個物件只有一個需要通知的物件時,使用監聽者模式比較簡單,而當需要通知的物件比較多時,採用觀察者模式比較簡單明瞭,這些要結合相應的業務場景,譬如,郵件列表的訂閱就適合用觀察者模式。

2、這兩種模式都使用了回撥的機制,唯一區別不同的是,監聽模式使用一個Event物件來保留回撥的鉤子(事件源處傳入的物件,一般是被監聽者本身),而觀察者模式沒有抽象Event事件物件,使用引數的方式將鉤子傳到觀察者,並附帶傳入了一些其他的資訊。因此,觀察者模式和監聽者模式都是使用回撥機制,其設計思想異曲同工。

3、這兩種模式都是採用了物件之間組合的方式進行職責解耦,這是軟體設計的指導性思想,無論我們是否很精確的實現這兩種設計模式,只要在設計中把握儘量採用組合方式,我們的軟體結構就會相對比較清晰,耦合度就相對比較低了,這是這兩種設計模式給我們的啟示!

下篇我們通過實際的例子,使用Js和Java複習一下這兩種設計模式!

[color=gray]如果您覺得本文對您有益,請點選博文後的google廣告,對作者表示支援,謝謝![/color]

相關推薦

JS實現模式觀察模式

[b]引子:[/b]最近看阮一峰先生的[url=http://www.ruanyifeng.com/blog/2012/12/asynchronous_javascript.html]這篇[/url]文章,文章涉及到觀察模式,監聽模式相關的設計模式的內容,正好,我最近也用sw

SpringBoot事件機制及觀察模式/釋出訂閱模式

[toc] ## 本篇要點 - 介紹觀察者模式和釋出訂閱模式的區別。 - SpringBoot快速入門事件監聽。 ## 什麼是觀察者模式? 觀察者模式是經典行為型設計模式之一。 在GoF的《設計模式》中,觀察者模式的定義:**在物件之間定義一個一對多的依賴,當一個物件狀態改變的時候,所有依賴的物件都會自

中介模式觀察模式區別?

observer server serve 有一個 obs 交互 進行 強調 一個 中介者(mediator)強調的是同事(colleague)類之間的交互 而觀察者(observer)中的目標類(subject)強調是目標改變後對觀察者進行統一的通訊 兩者非常相同的一點就

策略模式觀察模式

  1.策略模式就是面向介面程式設計,定義了演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。 interface A{ int aaa(int a,int b); } class B implements A{ @Over

Java設計模式, 單例模式,工廠模式,建造模式觀察模式

  1、單例模式            寫法:    懶漢式                 /**     * 懶漢模式     * 宣告一個靜態物件,並且在第一次呼叫getInstance 方法時進行初始化     * Created by Bill on 2017/12

java設計模式--事件監聽器模式觀察模式

監聽器模式:事件源經過事件的封裝傳給監聽器,當事件源觸發事件後,監聽器接收到事件物件可以回撥事件的方法 觀察者模式:觀察者(Observer)相當於事件監聽者,被觀察者(Observable)相當於事件源和事件,執行邏輯時通知observer即可觸發oberver的up

訂閱發布模式觀察模式真的不一樣

參考資料 csharp net 結構 com dash 通知操作 模式 發布-訂閱模式 1、觀察者模式 觀察者模式定義了對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都將得到通知,並自動更新。觀察者模式屬於行為型模式,行為型模式關註的是對象之

Java事件機制與觀察設計模式

idea demo1 script 操作 alt face ner over 方法 一. Java事件監聽機制 1. 事件監聽三要素: 事件源,事件對象,事件監聽器 2. 三要素之間的關系:事件源註冊事件監聽器後,當事件源上發生某個動作時,事件源就會調用事件監聽的一個方法,

Java 使用動態代理觀察模式+threadlocal實現資料庫連線池

當我們使用資料庫連線池時,如果多執行緒連線資料庫時,當超過5個執行緒連線資料庫時,那麼在第6個執行緒包括之後就連線不到資料庫了,該怎麼處理。 這裡用了java動態代理來這裡用了java的動態代理來代理資料庫的連線,攔截連線的close方法。並且給代理的連線加上一

java事件機制(觀察設計模式的實際運用)

package cn.yang.test.controller; /**java的事件監聽機制和觀察者設計模式 * Created by Dev_yang on 2016/3/1. */ publ

js學習心得之js的自定義事件-基於觀察模式實現

GOF對觀察者模式的定義:Observer的意圖是定義物件之間的一種一(被觀察者)對多(觀察者)的關係,當一個物件的狀態發生改變時,所有依賴它的物件得到通知,並且會自動更新自己。 從這段經典的定義中,可以推測下,觀察者模式中的倆個物件各自應該擁有的特徵 1,被觀察者應該可以

C++ 兩種設計模式:單例模式觀察聽者模式

一、C++中有23種設計模式,大致分為建立型模式,結構型模式以及行為模式, 在這裡自己實現一下單例模式以及觀察者和監聽者模式 二、單例模式 我們通過維護一個static的成員變數來記錄唯一的物件例項,通過提供一個static的介面instance來獲得唯一的例項,就是一

js 設計模式觀察模式

swe 有變 主題 頁面 ESS eache 不能 mov 學生類 觀察者模式 又被稱為“發布-訂閱”模式,目的是解決主題對象和觀察者之間功能的耦合性。發布者和訂閱者之間是互不幹擾的,沒有聯系的,通過觀察者,當做中介,將二者聯系起來。 例子:以學生和老師之間的為例 1.首先

JS 實現視窗大小改變,同時根據視窗大小修改某個元素的大小

文章來自:原始碼線上https://shengli.me/javascript/234.html   jQuery的方法:   以上的方法,不能寫在頁面載入完成事件函式$(function(){})內部,而需要寫在外面。 頁面載入完成事件: &

大話設計模式觀察模式總結-java實現

注:示例來自《大話設計模式》 現有如下需求 公司員工想要利用工作時間炒股票 老闆經常外出 怕被老闆看到 於是拜託前臺小姐姐 老闆回來的時候打個電話通知他們 初步程式碼實現如下 前臺祕書類 package Test14; import java.uti

設計模式觀察模式(Python實現

下面介紹在學習《深入淺出設計模式》中的第二個設計模式:觀察者模式 先定義一下觀察者模式:觀察者模式定義了物件之間的一對多依賴,這樣當一個物件改變狀態時,它的所有物件都會收到依賴並且自動更新。 具體的示例請看下圖: 觀察者模式在實際應用中被使用的相當廣泛。這種設計模式體現了

Java設計模式-回撥函式觀察模式

Android的框架中有非常多的地方使用了回撥的模式,例如Activity的生命週期,按鈕的點選事件等。 下面是回撥的基本模型: public class A { private CallBack callback; //註冊一個事件 public void reg

設計模式觀察模式(Observer Pattern、JDK實現

import java.util.Observable; import java.util.Observer; /** * 觀察者模式(JDK實現)。 * @author Bright Lee */ public class JdkObserverPattern { public st

設計模式觀察模式——利用java中提供的觀察實現

java實現與自己實現的對比 一、不需要再定義觀察者和目標的介面了,JDK幫忙定義了 二、具體的目標實現裡面不需要再維護觀察者的註冊資訊了,這在Java中的Observable類裡面已經幫忙實現好了。 三、觸發通知的方式有一點變化,要先呼叫setChanged方

事件驅動模型觀察模式

你有一件事情,做這件事情的過程包含了許多職責單一的子過程。這樣的情況及其常見。當這些子過程有如下特點時,我們應該考慮設計一種合適的框架,讓框架來完成一些業務無關的事情,從而使得各個子過程的開發可以專注於自己的業務。  這些子過程有一定的執行次序; 這些子過程之間需要較靈活