Facadeパターンとは、複雑なシステムの操作を簡単にするために、シンプルなインターフェースを提供するデザインパターンだ。これにより、システム内部の複雑さを隠して、使いやすいAPIを提供することができる。
たとえば、家電製品を一つのリモコンで操作できるようにするのがこのパターンだ。
では、サンプルコードを一緒に見ていこう。
例えば、複雑な家電製品(テレビ、スピーカー、ゲーム機など)を一気に操作できるリモコンを作ると考えてみてほしい。リモコンを押すだけで、家中の電化製品が正しい順番で動くようにしよう。この「リモコン」がFacadeパターンの例なんだ。
まず、家電製品(テレビ、スピーカー、ゲーム機)をそれぞれ個別に操作するクラスを作ってみよう。それぞれには、電源を入れるメソッドを用意するよ。
// テレビクラス
class TV {
on() {
console.log("テレビの電源を入れました。");
}
}
// スピーカークラス
class Speaker {
on() {
console.log("スピーカーの電源を入れました。");
}
}
// ゲーム機クラス
class GameConsole {
on() {
console.log("ゲーム機の電源を入れました。");
}
}
次に、これらの家電製品を一度に操作する「リモコン」のようなクラスを作成しよう。このクラスがFacadeとして機能し、個別の家電製品をまとめて操作できる。
// Facadeクラス(リモコン)
class HomeTheaterFacade {
constructor(tv, speaker, gameConsole) {
this.tv = tv;
this.speaker = speaker;
this.gameConsole = gameConsole;
}
startMovie() {
console.log("映画を開始します...");
this.tv.on();
this.speaker.on();
this.gameConsole.on();
}
}
最後に、このFacadeクラスを使って、すべての家電を一度に操作してみよう。「startMovie」というメソッドを呼び出すだけで、すべての家電が動作する。
// 家電製品のインスタンスを作成
const tv = new TV();
const speaker = new Speaker();
const gameConsole = new GameConsole();
// Facadeクラス(リモコン)を作成
const homeTheater = new HomeTheaterFacade(tv, speaker, gameConsole);
// Facadeパターンを使って家電を一括操作
homeTheater.startMovie();
// 結果:
// 映画を開始します...
// テレビの電源を入れました。
// スピーカーの電源を入れました。
// ゲーム機の電源を入れました。
これでFacadeパターンの解説は終わりだ。
このパターンを使うと、複雑なシステムの操作を簡略化し、外部からはシンプルな操作ができるようになるので、ユーザーにとって扱いやすい。