JavaScriptでのコマンドパターンの実装 – JavaScriptで始めるプログラミング
コマンドパターンは、ソフトウェアデザインパターンの一つです。これは、コマンドとしての要求をカプセル化し、パラメータ化することで、要求のためのオブジェクトを作成するパターンです。さらに、クライアントとリクエスター間の疎結合性を確保するために役立ちます。次に、JavaScriptでの具体的な実装方法を見てみましょう。
コマンドパターンの基本構造
まず、コマンドパターンの基本構造を理解しましょう。以下に示す構造は、受信者、コマンド、および呼び出し元 (Invoker) から成り立っています。
- 受信者 (Receiver) – 実際にアクションを実行するオブジェクト
- コマンド (Command) – 実行されるアクションを表すオブジェクト
- 呼び出し元 (Invoker) – コマンドを呼び出すオブジェクト
実装例
例として、シンプルな実装を示します。この例では、電気をオン/オフするコマンドを考えます。
class Light {
on() {
console.log('ライトがオンになりました');
}
off() {
console.log('ライトがオフになりました');
}
}
class Command {
execute() {}
}
class LightOnCommand extends Command {
constructor(light) {
super();
this.light = light;
}
execute() {
this.light.on();
}
}
class LightOffCommand extends Command {
constructor(light) {
super();
this.light = light;
}
execute() {
this.light.off();
}
}
class Invoker {
constructor() {
this.commands = [];
}
addCommand(command) {
this.commands.push(command);
}
executeCommands() {
this.commands.forEach((command) => command.execute());
}
}
// 使用例
const light = new Light();
const lightOn = new LightOnCommand(light);
const lightOff = new LightOffCommand(light);
const invoker = new Invoker();
invoker.addCommand(lightOn);
invoker.addCommand(lightOff);
invoker.executeCommands();
コードの説明
このコードでは、Light
クラスが受信者であり、on
とoff
のメソッドを持っています。Command
クラスは抽象クラスであり、execute
メソッドを定義しています。
また、LightOnCommand
およびLightOffCommand
クラスが具体的なコマンドクラスとなり、Light
インスタンスを受け取り、execute
メソッドでそれぞれon
およびoff
メソッドを呼び出します。呼び出し元であるInvoker
クラスでは、コマンドのリストを保持し、executeCommands
メソッドで全てのコマンドを実行します。
まとめ
JavaScriptでのコマンドパターンの実装は、比較的シンプルですが非常に柔軟で拡張性があります。これにより、異なる要求をカプセル化し、簡単に追加や変更ができるようになります。さらに、このパターンを使用することで、コードの再利用性を高めることができます。ぜひ、プロジェクトに取り入れてみてください。