<一覧に戻る

コマンドパターン

コマンドパターンは、オブジェクト指向プログラミングにおける振る舞いに関するデザインパターンの一つです。このパターンは、操作をオブジェクトとしてカプセル化することで、リクエストのパラメータを設定したり、リクエストの履歴を保存したり、リクエストの実行を遅延させたりすることを可能にします。

コマンドパターンの基本概念

コマンドパターンは、以下の4つのコンポーネントで構成されます。

  1. コマンド(Command): 実行すべき操作を定義するインターフェースまたは抽象クラス。
  2. 具体的コマンド(ConcreteCommand): コマンドインターフェースを実装し、具体的な操作を定義するクラス。
  3. 受信者(Receiver): コマンドが実行する具体的な操作を持つオブジェクト。
  4. オーダー(Invoker): コマンドを呼び出すオブジェクト。

このパターンを使うことで、クライアントは具体的な操作を知らずにコマンドを実行できるようになります。

サンプルコード

それでは、Pythonでのコマンドパターンの実装を見ていきましょう。

1. コマンドインターフェースの定義

まず、コマンドのインターフェースを定義します。

from abc import ABC, abstractmethod

class Command(ABC):
    @abstractmethod
    def execute(self):
        pass

2. 受信者の実装

次に、受信者クラスを作成します。このクラスは、実際に操作を実行するメソッドを持ちます。

class Light:
    def turn_on(self):
        print("The light is on!")

    def turn_off(self):
        print("The light is off!")

3. 具体的コマンドの実装

受信者のメソッドを呼び出す具体的コマンドクラスを作成します。

class LightOnCommand(Command):
    def __init__(self, light: Light):
        self.light = light

    def execute(self):
        self.light.turn_on()

class LightOffCommand(Command):
    def __init__(self, light: Light):
        self.light = light

    def execute(self):
        self.light.turn_off()

4. オーダーの実装

オーダーは、コマンドを実行する役割を持ちます。

class RemoteControl:
    def __init__(self):
        self.command = None

    def set_command(self, command: Command):
        self.command = command

    def press_button(self):
        if self.command:
            self.command.execute()

5. クライアントコード

最後に、これらのクラスを使って、コマンドパターンを実際に利用するクライアントコードを書きます。

if __name__ == "__main__":
    # 受信者を生成
    light = Light()

    # 具体的コマンドを生成
    light_on_command = LightOnCommand(light)
    light_off_command = LightOffCommand(light)

    # オーダーを生成
    remote = RemoteControl()

    # ライトをオンにする
    remote.set_command(light_on_command)
    remote.press_button()  # 出力: The light is on!

    # ライトをオフにする
    remote.set_command(light_off_command)
    remote.press_button()  # 出力: The light is off!

コードの解説

  1. コマンドインターフェース: Commandクラスはコマンドの基本的な構造を定義します。executeメソッドは、具体的なコマンドで実装されるべきです。

  2. 受信者: Lightクラスは、実際の操作(ライトのオンとオフ)を行います。

  3. 具体的コマンド: LightOnCommandLightOffCommandは、受信者のメソッドを呼び出すための具体的なコマンドクラスです。

  4. オーダー: RemoteControlクラスは、コマンドを設定し、ボタンが押されたときにコマンドを実行します。

  5. クライアントコード: 最後に、受信者、具体的コマンド、オーダーを生成し、実行する流れを示しています。

コマンドパターンは、実行する操作をオブジェクトとしてカプセル化し、クライアントから操作の実装を隠すことで、柔軟性と拡張性を提供します。これにより、コードの可読性が向上し、メンテナンスが容易になります。

出力結果: