<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 21:27:29
        文檔

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

        JavaScript設(shè)計模式之觀察者模式(發(fā)布者-訂閱者模式)_javascript技巧:觀察者模式( 又叫發(fā)布者-訂閱者模式 )應(yīng)該是最常用的模式之一. 在很多語言里都得到大量應(yīng)用. 包括我們平時接觸的dom事件. 也是js和dom之間實現(xiàn)的一種觀察者模式. 代碼如下: div.onclick = function click (){ alert ( click' ) }
        推薦度:
        導(dǎo)讀JavaScript設(shè)計模式之觀察者模式(發(fā)布者-訂閱者模式)_javascript技巧:觀察者模式( 又叫發(fā)布者-訂閱者模式 )應(yīng)該是最常用的模式之一. 在很多語言里都得到大量應(yīng)用. 包括我們平時接觸的dom事件. 也是js和dom之間實現(xiàn)的一種觀察者模式. 代碼如下: div.onclick = function click (){ alert ( click' ) }

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

        代碼如下:
        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的代碼如下:
        代碼如下:
        loadImage( imgAry, function(){
        Map.init();
        Gamer.init();
        } )

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

        可是寫這個模塊的同事A去了外地旅游. 于是我打電話給他, 喂. 你的loadImage函數(shù)在哪, 我能不能改一下, 改了之后有沒有副作用. 如你所想, 各種不淡定的事發(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ā)布一個信號.

        代碼如下:
        loadImage.trigger( ”ready' );

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

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

        代碼如下:
        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)用.

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        JavaScript設(shè)計模式之觀察者模式(發(fā)布者-訂閱者模式)_javascript技巧:觀察者模式( 又叫發(fā)布者-訂閱者模式 )應(yīng)該是最常用的模式之一. 在很多語言里都得到大量應(yīng)用. 包括我們平時接觸的dom事件. 也是js和dom之間實現(xiàn)的一種觀察者模式. 代碼如下: div.onclick = function click (){ alert ( click' ) }
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费国产真实迷j在线观看| 成人网站免费观看| 亚洲无人区午夜福利码高清完整版 | 免费人成视频在线播放| 日本特黄a级高清免费大片| 亚洲日本天堂在线| 久久精品无码一区二区三区免费 | 8x网站免费入口在线观看| 亚洲综合一区二区精品导航| 免费一级毛片在线播放不收费| 亚洲av色香蕉一区二区三区蜜桃| 蜜臀91精品国产免费观看| 国产成人精品日本亚洲语音| 四虎永久免费观看| 国产激情久久久久影院老熟女免费| 亚洲毛片网址在线观看中文字幕| 黄色网址免费在线观看| 国产成人亚洲综合无码精品| 99久久国产免费中文无字幕| 亚洲人成网男女大片在线播放| 妞干网在线免费观看| 永久免费精品影视网站| 亚洲av无码av制服另类专区| 97免费人妻无码视频| 亚洲AV无码成人精品区日韩| 不卡精品国产_亚洲人成在线 | 一本无码人妻在中文字幕免费 | 久久亚洲AV午夜福利精品一区| 久久免费看黄a级毛片| 中文日韩亚洲欧美制服| 亚洲精品尤物yw在线影院| 久久99精品国产免费观看| 久久久久亚洲国产| 国产亚洲精品自在久久| 在线a级毛片免费视频| 又大又硬又粗又黄的视频免费看 | 亚洲w码欧洲s码免费| 国产成人高清亚洲一区久久 | 国产精品免费一区二区三区| 亚洲国产精品成人精品软件| 亚洲成AⅤ人影院在线观看|