欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript設(shè)計模式之觀察者模式(發(fā)布者-訂閱者模式)

 更新時間:2014年09月24日 09:53:26   投稿:junjie  
這篇文章主要介紹了JavaScript設(shè)計模式之觀察者模式(發(fā)布者-訂閱者模式),本文詳細的講解了JavaScript中的觀察者模式,需要的朋友可以參考下

觀察者模式( 又叫發(fā)布者-訂閱者模式 )應(yīng)該是最常用的模式之一. 在很多語言里都得到大量應(yīng)用. 包括我們平時接觸的dom事件. 也是js和dom之間實現(xiàn)的一種觀察者模式.

復(fù)制代碼 代碼如下:

div.onclick  =  function click (){
alert ( ”click' )
}

只要訂閱了div的click事件. 當點擊div的時候, function click就會被觸發(fā)。

那么到底什么是觀察者模式呢. 先看看生活中的觀察者模式。

好萊塢有句名言. “不要給我打電話, 我會給你打電話”. 這句話就解釋了一個觀察者模式的來龍去脈。 其中“我”是發(fā)布者, “你”是訂閱者。

再舉個例子,我來公司面試的時候,完事之后每個面試官都會對我說:“請留下你的聯(lián)系方式, 有消息我們會通知你”。 在這里“我”是訂閱者, 面試官是發(fā)布者。所以我不用每天或者每小時都去詢問面試結(jié)果, 通訊的主動權(quán)掌握在了面試官手上。而我只需要提供一個聯(lián)系方式。

觀察者模式可以很好的實現(xiàn)2個模塊之間的解耦。 假如我正在一個團隊里開發(fā)一個html5游戲. 當游戲開始的時候,需要加載一些圖片素材。加載好這些圖片之后開始才執(zhí)行游戲邏輯. 假設(shè)這是一個需要多人合作的項目. 我完成了Gamer和Map模塊, 而我的同事A寫了一個圖片加載器loadImage。

loadImage的代碼如下:

復(fù)制代碼 代碼如下:

loadImage(  imgAry,  function(){
Map.init();
Gamer.init();
} )

當圖片加載好之后, 再渲染地圖, 執(zhí)行游戲邏輯. 嗯, 這個程序運行良好. 突然有一天, 我想起應(yīng)該給游戲加上聲音功能. 我應(yīng)該讓圖片加載器添上一行代碼.
復(fù)制代碼 代碼如下:

loadImage(  imgAry,  function(){
Map.init();
Gamer.init();
Sount.init();
} )

可是寫這個模塊的同事A去了外地旅游. 于是我打電話給他, 喂. 你的loadImage函數(shù)在哪, 我能不能改一下, 改了之后有沒有副作用. 如你所想, 各種不淡定的事發(fā)生了. 如果當初我們能這樣寫呢:
復(fù)制代碼 代碼如下:

loadImage.listen( ”ready', function(){
Map.init();
})
loadImage.listen( ”ready', function(){
Gamer.init();
})
loadImage.listen( ”ready', function(){
Sount.init();
})

loadImage完成之后, 它根本不關(guān)心將來會發(fā)生什么, 因為它的工作已經(jīng)完成了. 接下來它只要發(fā)布一個信號.

復(fù)制代碼 代碼如下:

loadImage.trigger( ”ready' );

那么監(jiān)聽了loadImage的'ready'事件的對象都會收到通知. 就像上個面試的例子. 面試官根本不關(guān)心面試者們收到面試結(jié)果后會去哪吃飯. 他只負責把面試者的簡歷搜集到一起. 當面試結(jié)果出來時照著簡歷上的電話挨個通知.

說了這么多概念, 來一個具體的實現(xiàn). 實現(xiàn)過程其實很簡單. 面試者把簡歷扔到一個盒子里, 然后面試官在合適的時機拿著盒子里的簡歷挨個打電話通知結(jié)果.

復(fù)制代碼 代碼如下:

Events = function() {
var listen, log, obj, one, remove, trigger, __this;
obj = {};
__this = this;
listen = function( key, eventfn ) {  //把簡歷扔盒子, key就是聯(lián)系方式.
var stack, _ref;  //stack是盒子
stack = ( _ref = obj[key] ) != null ? _ref : obj[ key ] = [];
return stack.push( eventfn );
};
one = function( key, eventfn ) {
remove( key );
return listen( key, eventfn );
};
remove = function( key ) {
var _ref;
return ( _ref = obj[key] ) != null ? _ref.length = 0 : void 0;
};
trigger = function() {  //面試官打電話通知面試者
var fn, stack, _i, _len, _ref, key;
key = Array.prototype.shift.call( arguments );
stack = ( _ref = obj[ key ] ) != null ? _ref : obj[ key ] = [];
for ( _i = 0, _len = stack.length; _i < _len; _i++ ) {
fn = stack[ _i ];
if ( fn.apply( __this,  arguments ) === false) {
return false;
}
}
return {
listen: listen,
one: one,
remove: remove,
trigger: trigger
}
}

最后用觀察者模式來做一個成人電視臺的小應(yīng)用.

復(fù)制代碼 代碼如下:

//訂閱者
var adultTv = Event();
adultTv .listen(  ”play',  function( data ){
alert ( “今天是誰的電影” + data.name );
});
//發(fā)布者
adultTv .trigger(  ”play',  { ‘name': ‘麻生希' }  )

相關(guān)文章

  • 基于html+css+js實現(xiàn)簡易計算器代碼實例

    基于html+css+js實現(xiàn)簡易計算器代碼實例

    這篇文章主要介紹了基于html+css+js實現(xiàn)簡易計算器代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • js利用appendChild對<li>標簽進行排序的實現(xiàn)方法

    js利用appendChild對<li>標簽進行排序的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s利用appendChild對<li>標簽進行排序的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • nodejs 后綴名判斷限制代碼

    nodejs 后綴名判斷限制代碼

    如一個文件上傳功能,需要對上傳文件進行文件格式限制。我們通常會使用后綴名做限制。
    2011-03-03
  • 使用JS實現(xiàn)簡易計算器

    使用JS實現(xiàn)簡易計算器

    這篇文章主要為大家詳細介紹了使用JS實現(xiàn)簡易計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • openlayers4.6.5實現(xiàn)距離量測和面積量測

    openlayers4.6.5實現(xiàn)距離量測和面積量測

    這篇文章主要為大家詳細介紹了openlayers4.6.5實現(xiàn)距離量測和面積量測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • js實現(xiàn)運行代碼需要刷新的解決方法

    js實現(xiàn)運行代碼需要刷新的解決方法

    js實現(xiàn)運行代碼需要刷新的解決方法...
    2007-08-08
  • file-loader打包圖片文件時路徑錯誤輸出為[object-module]的解決方法

    file-loader打包圖片文件時路徑錯誤輸出為[object-module]的解決方法

    這篇文章主要介紹了file-loader打包圖片文件時路徑錯誤輸出為[object-module]的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 基于JavaScript實現(xiàn)定時跳轉(zhuǎn)到指定頁面

    基于JavaScript實現(xiàn)定時跳轉(zhuǎn)到指定頁面

    本篇文章給大家介紹基于javascript實現(xiàn)定時跳轉(zhuǎn)到指定頁面的相關(guān)知識,涉及到j(luò)s跳轉(zhuǎn)到指定頁面的相關(guān)內(nèi)容,對js跳轉(zhuǎn)到指定頁面相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • JavaScript垃圾回收機制原理總結(jié)深入探究

    JavaScript垃圾回收機制原理總結(jié)深入探究

    就像人類會產(chǎn)生垃圾一樣,程序運行過程中也會產(chǎn)生垃圾,如果不及時回收輕則將會拖慢程序運行,重則會導(dǎo)致系統(tǒng)崩潰,也就是所謂的內(nèi)存泄漏。所以垃圾回收非常必要
    2022-10-10
  • 詳解JavaScript添加給定的標簽選項

    詳解JavaScript添加給定的標簽選項

    這篇文章給大家分享了JavaScript實現(xiàn)添加給定的標簽選項的相關(guān)知識點內(nèi)容以及代碼實例,有興趣的朋友們參考下。
    2018-09-09

最新評論