導入
メディエーターモード(メディエーター)は、メディエーターオブジェクトを使用して、一連のオブジェクト相互作用をカプセル化します。仲介者は、オブジェクトを明示的に互いに参照する必要はなく、それによりそれらをゆるく結合し、独立して相互作用を変える可能性があります。
主なコンテンツは、http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascriptからのものです
文章
ソフトウェア開発では、仲介者は、システムのさまざまな部分が統一されたインターフェイスを提供することで通信できるようにする行動設計パターンです。一般に、システムに直接通信する必要がある多くのサブモジュールがある場合、各モジュールが中央の制御ポイントを介して対話するために中央の制御ポイントを作成する必要があります。中間モデルにより、これらのサブモジュールは、直接通信なしでデカップリングの目的を達成できます。
たとえば、一般的な空港交通制御システムであるタワーは、航空機のレポートからすべての通信が完了するため、航空機の前で通信するのではなく、航空機の報告からタワーへの配信(サブモジュール)を制御する仲介者です。中央制御システムは、システムの鍵、つまりソフトウェア設計における仲介者の役割です。
まず、擬似コードを使用して理解しましょう。
コードコピーは次のとおりです。
//次のコードは擬似コードです、コードにあまり注意を払わないでください
//ここでアプリの名前空間は、仲介者の役割を演じることに相当します
var app = app || {};
//アプリの仲介者を介してAJAX要求を行います
app.sendrequest = function(options){
$ .ajax($。extend({}、options);
}
// URLを要求した後、ビューを表示します
app.populateview = function(url、view){
$ .when(app.sendrequest({url:url、method: 'get'})
.then(function(){
//コンテンツを表示します
});
}
//コンテンツをクリアします
app.resetView = function(view){
view.html( '');
}
JavaScriptでは、仲介者は非常に一般的であり、オブザーバーパターンのメッセージバスに相当します。ただし、それらはPub/Sub Like Observersを呼び出すことでは実装されていませんが、統一された方法で仲介者によって管理されます。オブザーバーに基づいて例を挙げましょう。
コードコピーは次のとおりです。
var mediator =(function(){
//イベントを購読し、イベントがトリガーされた後にコールバック関数を提供する
var subscribe = function(channel、fn){
if(!mediator.channels [channel])mediator.channels [channel] = [];
mediator.channels [channel] .push({context:this、callback:fn});
これを返します。
}、
//ブロードキャストイベント
publish = function(channel){
if(!mediator.channels [channel])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);
}
これを返します。
};
戻る {
チャンネル:{}、
公開:パブリッシュ、
購読:購読、
インストール:function(obj){
obj.subscribe = subscribe;
obj.publish = publish;
}
};
}());
コードの呼び出しは比較的簡単です:
コードコピーは次のとおりです。
(function(mediator){
関数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、トム
}
initialize(); //初期化
updatename(); // 電話
})(メディエーター);
仲介者とオブザーバー
この時点で、誰もが混乱するかもしれません。仲介者とオブザーバーは似ているようです。違いは何ですか?実際には少し似ていますが、特定の説明を見てみましょう。
オブザーバーパターン、制約をカプセル化しない単一のオブジェクト。それどころか、オブザーバーオブザーバーとコンクリートクラスの主題は協力して制約を維持します。コミュニケーションは、複数のオブザーバーと複数のコンクリートクラスを介して相互作用します。各コンクリートクラスには通常、複数のオブザーバーが含まれており、コンクリートクラスの1人のオブザーバーも別のオブザーバーの具体的なクラスです。
仲介モデルが行うことは単なる分布ではなく、これらの制約を維持する役割を果たします。
中間および外観パターン
多くの人々は、仲介パターンと外観パターンの違いについても混乱する可能性があります。どちらも既存のモジュールを抽象化しますが、微妙な違いがいくつかあります。
仲介者が行うことは、モジュール間で通信することです。これは多方向ですが、外観モードは、機能を追加せずに特定のモジュールまたはシステムの単純なインターフェイスを定義するだけです。システム内の他のモジュールの概念は、外観モードと直接接続されておらず、一方向と見なすことができます。
これが別の完全な例です:
コードコピーは次のとおりです。
<!doctype html>
<html lang = "en">
<head>
<Title> JavaScriptパターン</title>
<メタcharset = "utf-8">
</head>
<body>
<div id = "results"> </div>
<スクリプト>
function player(name){
this.points = 0;
this.name = name;
}
player.prototype.play = function(){
this.points += 1;
mediator.played();
};
varスコアボード= {
//コンテンツを表示するコンテナ
要素:document.getElementById( 'results')、
//スコア表示を更新します
更新:function(score){
var i、msg = '';
(私はスコア){
if(score.hasownproperty(i)){
msg + = '<p> <strong>' + i + '<// strong>:';
msg += score [i];
msg += '<// p>';
}
}
this.element.innerhtml = msg;
}
};
var mediator = {
//すべてのプレイヤー
プレイヤー:{}、
//初期化
セットアップ:function(){
var players = this.players;
player.home = new Player( 'home');
player.guest = new Player( 'Guest');
}、
//プレイ後、スコアを更新します
再生:function(){
var players = this.players、
スコア= {
ホーム:players.home.points、
ゲスト:players.guest.points
};
scoreboard.update(score);
}、
//ユーザーキーインタラクションを処理します
キープレス:function(e){
e = e || window.event; // IE
if(e .which === 49){//番号キー "1"
mediator.players.home.play();
戻る;
}
if(e。e. === 48){//番号キー "0"
mediator.players.guest.play();
戻る;
}
}
};
// 行く!
mediator.setup();
window.onkeypress = mediator.keypress;
// 30秒後に終了します
setimeout(function(){
window.onkeypress = null;
console.log( 'ゲームオーバー!');
}、30000);
</script>
</body>
</html>
要約します
中間モードは一般に、オブジェクトのグループが明確に定義されているが複雑な方法で通信している状況で使用されます。一般的に言えば、中間モードはシステムで簡単に使用できますが、システムでそれを誤用するのも簡単です。システムに多目的相互作用の複雑なオブジェクトグループが表示される場合、最初に中間モードを使用することは急いではいけませんが、システム設計に何か問題があるかどうかを考えてください。
さらに、仲介モデルは相互作用の複雑さを中間自体の複雑さに変えるため、中間オブジェクトは他のオブジェクトよりも複雑になります。