JavaScriptシリーズを深く理解する(36):設計モードの仲介者モード詳細解

7121 ワード

紹介する
仲介者モード(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は一緒に結合して制約を維持し、コミュニケーションは複数の観察者と複数の具体的なクラスを通じて相互作用する.
仲介者モードは簡単な配布ではなく、これらの制約を守る役割を果たしています.
仲介者と外観モード
多くの人が、よりあいまいな仲介者と外観モデルの違いがありますが、彼らは既存のモジュールを抽象化していますが、いくつかの微妙な違いがあります.
仲介者が行うのはモジュール間の通信であり、多方向であるが、外観モードはあるモジュールまたはシステムのための簡単なインターフェースを定義するだけで、追加の機能を追加しない.システム内の他のモジュールと外観モードという概念は直接的に関係しておらず、一方向性であると考えられている.
もう一つの完全な例を示します.



    JavaScript Patterns
   



    <br>         function Player(name) { <br>             this.points = 0; <br>             this.name = name; <br>         } <br>         Player.prototype.play = function () { <br>             this.points += 1; <br>             mediator.played(); <br>         }; <br>         var scoreboard = { <p></p> <p>            // <br>             element: document.getElementById('results'),</p> <p>            // <br>             update: function (score) {<br>                 var i, msg = '';<br>                 for (i in score) {<br>                     if (score.hasOwnProperty(i)) {<br>                         msg += '<p><strong>' + i + '<\/strong>: ';<br>                         msg += score[i];<br>                         msg += '<\/p>';<br>                     }<br>                 }<br>                 this.element.innerHTML = msg;<br>             }<br>         };</p> <p>        var mediator = {</p> <p>            // player<br>             players: {},</p> <p>            // <br>             setup: function () {<br>                 var players = this.players;<br>                 players.home = new Player('Home');<br>                 players.guest = new Player('Guest');<br>             },</p> <p>            // play , <br>             played: function () {<br>                 var players = this.players,<br>                     score = {<br>                         Home: players.home.points,<br>                         Guest: players.guest.points<br>                     };</p> <p>                scoreboard.update(score);<br>             },</p> <p>            // <br>             keypress: function (e) {<br>                 e = e || window.event; // IE<br>                 if (e.which === 49) { // "1"<br>                     mediator.players.home.play();<br>                     return;<br>                 }<br>                 if (e.which === 48) { // "0"<br>                     mediator.players.guest.play();<br>                     return;<br>                 }<br>             }<br>         };</p> <p>        // go!<br>         mediator.setup();<br>         window.onkeypress = mediator.keypress;</p> <p>        // 30 <br>         setTimeout(function () {<br>             window.onkeypress = null;<br>             console.log('Game over!');<br>         }, 30000);<br>    


締め括りをつける
仲介者モードは、一般的にはオブジェクトのセットが定義されていますが、複雑な方法で通信する場合、仲介者モードはシステムで使用しやすいですが、システムで誤用しやすいです.システムが複数のインタラクティブで複雑なオブジェクトグループができたら、まず仲介者モードを急いで使用しないでください.システム設計に問題があるのではないかと考えます.
また、仲介者モードはインタラクション複雑さを仲介者自身の複雑さに変えているので、仲介者オブジェクトは他のどのオブジェクトよりも複雑であるということです.