亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript系列(36):設計模式之中介者模式詳解

2024-05-06 16:15:56
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了深入理解JavaScript系列(36):設計模式之中介者模式詳解,中介者模式(Mediator)是指用一個中介對象來封裝一系列的對象交互,需要的朋友可以參考下
 

介紹

中介者模式(Mediator),用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

主要內容來自:http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript

正文

軟件開發中,中介者是一個行為設計模式,通過提供一個統一的接口讓系統的不同部分進行通信。一般,如果系統有很多子模塊需要直接溝通,都要創建一個中央控制點讓其各模塊通過該中央控制點進行交互。中介者模式可以讓這些子模塊不需要直接溝通,而達到進行解耦的目的。

打個比方,平時常見的機場交通控制系統,塔臺就是中介者,它控制著飛機(子模塊)的起飛和降落,因為所有的溝通都是從飛機向塔臺匯報來完成的,而不是飛機之前相互溝通。中央控制系統就是該系統的關鍵,也就是軟件設計中扮演的中介者角色。

我們先用偽代碼來理解一下:

復制代碼代碼如下:

// 如下代碼是偽代碼,請不要過分在意代碼
// 這里app命名空間就相當于扮演中介者的角色
var app = app || {};
 
// 通過app中介者來進行Ajax請求
app.sendRequest = function ( options ) {
    return $.ajax($.extend({}, options);
}
 
// 請求URL以后,展示View
app.populateView = function( url, view ){
  $.when(app.sendRequest({url: url, method: 'GET'})
     .then(function(){
         //顯示內容
     });
}
 
// 清空內容
app.resetView = function( view ){
   view.html('');
}

在JavaScript里,中介者非常常見,相當于觀察者模式上的消息Bus,只不過不像觀察者那樣通過調用pub/sub的形式來實現,而是通過中介者統一來管理,讓我們在觀察者的基礎上來給出一個例子:
復制代碼代碼如下:

var mediator = (function () {
    // 訂閱一個事件,并且提供一個事件觸發以后的回調函數
    var subscribe = function (channel, fn) {
        if (!mediator.channels[channel]) mediator.channels[channel] = [];
        mediator.channels[channel].push({ context: this, callback: fn });
        return this;
    },

 

    // 廣播事件
    publish = function (channel) {
        if (!mediator.channels[channel]) return false;
        var args = Array.prototype.slice.call(arguments, 1);
        for (var i = 0, l = mediator.channels[channel].length; i < l; i++) {
            var subscription = mediator.channels[channel][i];
            subscription.callback.apply(subscription.context, args);
        }
        return this;
    };

    return {
        channels: {},
        publish: publish,
        subscribe: subscribe,
        installTo: function (obj) {
            obj.subscribe = subscribe;
            obj.publish = publish;
        }
    };

} ());


調用代碼,相對就簡單了:
復制代碼代碼如下:

(function (Mediator) {

 

    function initialize() {

        // 默認值
        mediator.name = "dudu";

        // 訂閱一個事件nameChange
        // 回調函數顯示修改前后的信息
        mediator.subscribe('nameChange', function (arg) {
            console.log(this.name);
            this.name = arg;
            console.log(this.name);
        });
    }

    function updateName() {
        // 廣播觸發事件,參數為新數據
        mediator.publish('nameChange', 'tom'); // dudu, tom
    }

    initialize(); // 初始化
    updateName(); // 調用

})(mediator);


中介者和觀察者

 

到這里,大家可能迷糊了,中介者和觀察者貌似差不多,有什么不同呢?其實是有點類似,但是我們來看看具體的描述:

觀察者模式,沒有封裝約束的單個對象,相反,觀察者Observer和具體類Subject是一起配合來維護約束的,溝通是通過多個觀察者和多個具體類來交互的:每個具體類通常包含多個觀察者,而有時候具體類里的一個觀察者也是另一個觀察者的具體類。

而中介者模式所做的不是簡單的分發,卻是扮演著維護這些約束的職責。

中介者和外觀模式

很多人可能也比較迷糊中介者和外觀模式的區別,他們都是對現有各模塊進行抽象,但有一些微妙的區別。

中介者所做的是在模塊之間進行通信,是多向的,但外觀模式只是為某一個模塊或系統定義簡單的接口而不添加額外的功能。系統中的其它模塊和外觀模式這個概念沒有直接聯系,可以認為是單向性。


再給出一個完整的例子:

復制代碼代碼如下:

<!doctype html>
<html lang="en">
<head>
    <title>JavaScript Patterns</title>
    <meta charset="utf-8">
</head>
<body>
<div id="results"></div>
    <script>
        function Player(name) {
            this.points = 0;
            this.name = name;
        }
        Player.prototype.play = function () {
            this.points += 1;
            mediator.played();
        };
        var scoreboard = {

 

            // 顯示內容的容器
            element: document.getElementById('results'),

            // 更新分數顯示
            update: function (score) {
                var i, msg = '';
                for (i in score) {
                    if (score.hasOwnProperty(i)) {
                        msg += '<p><strong>' + i + '<//strong>: ';
                        msg += score[i];
                        msg += '<//p>';
                    }
                }
                this.element.innerHTML = msg;
            }
        };

        var mediator = {

            // 所有的player
            players: {},

            // 初始化
            setup: function () {
                var players = this.players;
                players.home = new Player('Home');
                players.guest = new Player('Guest');
            },

            // play以后,更新分數
            played: function () {
                var players = this.players,
                    score = {
                        Home: players.home.points,
                        Guest: players.guest.points
                    };

                scoreboard.update(score);
            },

            // 處理用戶按鍵交互
            keypress: function (e) {
                e = e || window.event; // IE
                if (e.which === 49) { // 數字鍵 "1"
                    mediator.players.home.play();
                    return;
                }
                if (e.which === 48) { // 數字鍵 "0"
                    mediator.players.guest.play();
                    return;
                }
            }
        };

        // go!
        mediator.setup();
        window.onkeypress = mediator.keypress;

        // 30秒以后結束
        setTimeout(function () {
            window.onkeypress = null;
            console.log('Game over!');
        }, 30000);
    </script>
</body>
</html>

 

總結

中介者模式一般應用于一組對象已定義良好但是以復雜的方式進行通信的場合,一般情況下,中介者模式很容易在系統中使用,但也容易在系統里誤用,當系統出現了多對多交互復雜的對象群時,先不要急于使用中介者模式,而是要思考一下是不是系統設計有問題。

另外,由于中介者模式把交互復雜性變成了中介者本身的復雜性,所以說中介者對象會比其它任何對象都復雜。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品制服第一页| 久久精品国产综合| 亚洲二区在线播放视频| 国产日本欧美一区二区三区在线| 欧洲成人在线视频| 久久久精品久久久久| 日韩成人中文电影| 91久久久亚洲精品| 久久夜色精品国产| 91精品国产91久久久久| 亚洲精品白浆高清久久久久久| 少妇精69xxtheporn| 国产成人激情视频| 一本色道久久88精品综合| 欧美日韩人人澡狠狠躁视频| 欧美黑人性生活视频| 欧美成人精品在线| 性日韩欧美在线视频| 日韩av免费在线| 日韩一区二区三区在线播放| 国产精品爱久久久久久久| 国产伦精品一区二区三区精品视频| 日产日韩在线亚洲欧美| 国产日产欧美精品| 性色av一区二区三区红粉影视| 亚洲国产一区自拍| 国产成人激情视频| 欧美乱大交做爰xxxⅹ性3| 日韩高清电影好看的电视剧电影| 国产精品美女网站| 中文字幕亚洲国产| 久久久成人的性感天堂| 懂色av影视一区二区三区| 国产精品成人aaaaa网站| 91九色国产视频| 精品国产拍在线观看| 欧美伊久线香蕉线新在线| 国产精品成人国产乱一区| 欧美在线性爱视频| 久久成人人人人精品欧| 日韩av资源在线播放| 最近更新的2019中文字幕| 伦理中文字幕亚洲| 日韩大片在线观看视频| 久久九九精品99国产精品| 亚洲一区二区中文| 成人一区二区电影| 日韩av在线网页| 欧美精品18videos性欧| 日本一欧美一欧美一亚洲视频| 丁香五六月婷婷久久激情| 国产精品视频精品视频| 91久久精品国产91性色| 亚洲视频在线免费看| 亚洲精品ady| 精品久久久久人成| 亚洲色图欧美制服丝袜另类第一页| 亚洲日本欧美日韩高观看| 欧美怡春院一区二区三区| 97**国产露脸精品国产| 亚洲欧美激情四射在线日| 日本三级久久久| 中文字幕精品在线视频| 精品国产一区二区三区久久狼黑人| 亚洲欧美日韩精品久久| 国产一区二区黑人欧美xxxx| 国产一区二区三区免费视频| 亚洲free性xxxx护士白浆| 韩国精品美女www爽爽爽视频| 久久成年人免费电影| 久久久久久久久国产| 亚洲精品成人久久| 亚洲成人动漫在线播放| 久久在线精品视频| 亚洲成年人影院在线| 亚洲精品一区久久久久久| 成人黄色在线观看| 欧美xxxx做受欧美.88| 成人免费观看a| 欧美三级欧美成人高清www| 午夜精品蜜臀一区二区三区免费| 久久精品色欧美aⅴ一区二区| 国产精品成av人在线视午夜片| 日本免费一区二区三区视频观看| 久久精品99久久久久久久久| 亚洲自拍欧美色图| 日韩视频第一页| 亚洲美女精品成人在线视频| 欧美一区二区.| 夜夜躁日日躁狠狠久久88av| 亚洲精品天天看| 亚洲国产精品专区久久| 一区二区三区www| 国产在线一区二区三区| 欧美一级大片视频| 亚洲欧美日韩爽爽影院| 91高清免费视频| 日本aⅴ大伊香蕉精品视频| 成人精品一区二区三区电影免费| 久久99视频免费| 欧美激情欧美狂野欧美精品| 欧美日韩国产综合视频在线观看中文| 久久久av免费| 91探花福利精品国产自产在线| 亚洲精品aⅴ中文字幕乱码| 91久久精品国产91久久性色| 久久国产加勒比精品无码| 日韩精品在线免费播放| 国产91精品久久久久久| 狠狠色噜噜狠狠狠狠97| 亚洲欧美三级伦理| 2019中文字幕全在线观看| 国产精品久久婷婷六月丁香| 欧美午夜美女看片| 亚洲视频在线视频| 国产一区av在线| 18性欧美xxxⅹ性满足| 在线午夜精品自拍| 国产在线精品自拍| 亚洲最大福利视频| 国产成人精品999| 色偷偷偷亚洲综合网另类| 久久视频在线观看免费| 日韩电影视频免费| 亚洲第五色综合网| 中文字幕视频一区二区在线有码| 欧美激情高清视频| 亚洲国产精品久久久久| 国产一区二区av| 91超碰中文字幕久久精品| 奇米4444一区二区三区| 日本成人黄色片| 日本免费一区二区三区视频观看| 国产欧美精品日韩| 国产精品免费一区| 久久天天躁日日躁| 97视频在线播放| 欧美精品少妇videofree| 欧美二区在线播放| 一道本无吗dⅴd在线播放一区| 欧美视频在线观看免费| 国产精品久久久久久久久久| 日韩欧美a级成人黄色| 日韩成人在线免费观看| 国产精品啪视频| 久久网福利资源网站| 国产精品v片在线观看不卡| 亚洲视频在线观看网站| 国产欧美一区二区三区在线看| 国产在线精品一区免费香蕉| 久久久女人电视剧免费播放下载| 国产成人福利视频| 亚洲精品wwwww| 亚洲欧美日韩成人| 26uuu国产精品视频| 亚洲日韩欧美视频一区| 欧美日韩在线第一页| 国产一区二区激情| 欧美日韩中文字幕| 日韩中文字幕在线观看| 黑人巨大精品欧美一区二区三区| 亚洲天堂免费视频| 欧美日韩爱爱视频| 欧美中文字幕在线|