まめージェント

Android, GAE, AngularJSの技術ネタ中心。Twitter: @mame01112

Javascriptでデザインパターン (その3: Mediator)

今回は、Mediatorパターン

3回目の今回は、Mediatorパターン。仲介者パターンです。

そもそもこのパターンは、Wikipediaによれば、
"オブジェクト間の通信は mediator によってカプセル化され、オブジェクト同士で直接通信せず、mediator を介して行うようになる。これにより通信するオブジェクト同士の依存関係を削減し、結合の度合いを下げることができる。"とのこと。

僕の言葉で書くと、”複雑なアプリやサービスの(特にコントローラまわりのクラスで)多数のクラスやアクションを管理する際、管理する際のロジックが複雑になることがあり(大量のif - elseやswitch文など)それが保守性と可読性を下げるため、そのようなクラスやアクションを管理するための仲介者をもうけるデザインパターン。クラスやアクション間の挙動に関しては、一律この仲介者(Mediator)を介してやりとりすることにより、クラス間の依存やメンテコストを下げることが可能となる。
※こうやって書くと、いかにWikipediaの言葉が凝縮されて短文になっていることか・・・まあ、そのおかげで抽象的になって分かりにくいこともあるんですが。

これまでMediatorパターンは、あまり実際のコードでみたことがないのですが(単純なものであれば、FactoryパターンやStrategyパターンで作れてしまう)、今回勉強ということで、JavascriptでMediatorパターンを書いてみました(ので、JavaUMLを見つつですが・・・)

実際に登場する役割

・Mediator: Colleagueとのインタフェースを定義する。
・ConcreteMediator: Colleagueを管理する。Colleague(=上記の説明であれば、クラスやアクション)に応じたロジックを持つのはここ。
・Colleague: 管理されるクラスやアクション。
といったところですかね。

実際のソースコードはこちら。

// Mediator
var Mediator = function (){
	this.colleagues = {};
};

// Concrete Mediator

Mediator.prototype = {
	addColleague : function(name, colleague){
		console.log("addColleague");
		this.colleagues[name] = colleague;
	},

	consultation : function(name){
		console.log("consultation: " + name);
		var prop = this.colleagues[name];
		prop.advice("This is advice");
		// colleagues.advice(collegague);
	}
};

var Colleague = function(){
	var mediator;
};

Colleague.prototype = {
	setMediator : function(newMediator){
		console.log("setMediator");
		mediator = newMediator;
	},

	advice : function(content){
		console.log("I got advice: " + content);
	}
};

var concreteMediator = new Mediator();

var colleagueA = new Colleague();
colleagueA.setMediator(concreteMediator);
concreteMediator.addColleague("colleagueA", colleagueA);
var colleagueB = new Colleague();
colleagueB.setMediator(concreteMediator);
concreteMediator.addColleague("colleagueB", colleagueB);

concreteMediator.consultation("colleagueA");
concreteMediator.consultation("colleagueB");

少しずつ、Javascriptに慣れてきた気がします。