コマンドパターンは、オブジェクト指向プログラミングにおける振る舞いに関するデザインパターンの一つです。このパターンは、操作をオブジェクトとしてカプセル化することで、リクエストのパラメータを設定したり、リクエストの履歴を保存したり、リクエストの実行を遅延させたりすることを可能にします。
コマンドパターンは、以下の4つのコンポーネントで構成されます。
このパターンを使うことで、クライアントは具体的な操作を知らずにコマンドを実行できるようになります。
それでは、Pythonでのコマンドパターンの実装を見ていきましょう。
まず、コマンドのインターフェースを定義します。
from abc import ABC, abstractmethod
class Command(ABC):
@abstractmethod
def execute(self):
pass
次に、受信者クラスを作成します。このクラスは、実際に操作を実行するメソッドを持ちます。
class Light:
def turn_on(self):
print("The light is on!")
def turn_off(self):
print("The light is off!")
受信者のメソッドを呼び出す具体的コマンドクラスを作成します。
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()
オーダーは、コマンドを実行する役割を持ちます。
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()
最後に、これらのクラスを使って、コマンドパターンを実際に利用するクライアントコードを書きます。
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!
コマンドインターフェース: Command
クラスはコマンドの基本的な構造を定義します。execute
メソッドは、具体的なコマンドで実装されるべきです。
受信者: Light
クラスは、実際の操作(ライトのオンとオフ)を行います。
具体的コマンド: LightOnCommand
とLightOffCommand
は、受信者のメソッドを呼び出すための具体的なコマンドクラスです。
オーダー: RemoteControl
クラスは、コマンドを設定し、ボタンが押されたときにコマンドを実行します。
クライアントコード: 最後に、受信者、具体的コマンド、オーダーを生成し、実行する流れを示しています。
コマンドパターンは、実行する操作をオブジェクトとしてカプセル化し、クライアントから操作の実装を隠すことで、柔軟性と拡張性を提供します。これにより、コードの可読性が向上し、メンテナンスが容易になります。