コマンドパターン
利点
柔軟性が高い
コマンドをオブジェクト化することで、複雑な操作を簡単に管理できる
取り消しや履歴の管理が容易
各コマンドが undo メソッドを持てば、簡単に操作を取り消せる
オープン/クローズの原則に従う
新しいコマンドを追加する際に既存のコードを変更する必要がない
欠点
コードが増える
コマンドやクラスを追加するたびに、具体的なコマンドクラスを作成する必要がある
コード量が増える
シンプルなケースでは過剰設計になりうる
単純な操作を行うだけなら、コマンドパターンを使わなくても十分な場合がある
コード例
code:python
# Commandインターフェース
class Command:
def execute(self):
pass
def undo(self):
pass
# Receiver(受け手)
class Light:
def on(self):
print("ライトが点灯しました!")
def off(self):
print("ライトが消灯しました!")
# ConcreteCommand(具体的なコマンド)
class LightOnCommand(Command):
def __init__(self, light: Light):
self.light = light
def execute(self):
self.light.on()
def undo(self):
self.light.off()
class LightOffCommand(Command):
def __init__(self, light: Light):
self.light = light
def execute(self):
self.light.off()
def undo(self):
self.light.on()
# Invoker(呼び出し役)
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()
def press_undo(self):
if self.command:
self.command.undo()
# Client(依頼者)
if __name__ == "__main__":
# Receiver(ライト)を作成
light = Light()
# Command(オン・オフ)を作成
light_on = LightOnCommand(light)
light_off = LightOffCommand(light)
# Invoker(リモコン)を作成
remote = RemoteControl()
# ライトを点灯
remote.set_command(light_on)
remote.press_button() # Output: ライトが点灯しました!
# ライトを消灯
remote.set_command(light_off)
remote.press_button() # Output: ライトが消灯しました!
# Undo(取り消し)
remote.press_undo() # Output: ライトが点灯しました!
使わない場合のコード
code:python
# Receiver(受け手)
class Light:
def on(self):
print("ライトが点灯しました!")
def off(self):
print("ライトが消灯しました!")
# Invoker(リモコン)
class RemoteControl:
def __init__(self, light: Light):
self.light = light
self.last_command = None # 最後に実行したコマンドを記録
def press_on_button(self):
self.light.on()
self.last_command = "on"
def press_off_button(self):
self.light.off()
self.last_command = "off"
def press_undo(self):
if self.last_command == "on":
self.light.off()
elif self.last_command == "off":
self.light.on()
else:
print("取り消せる操作がありません。")
# Client(依頼者)
if __name__ == "__main__":
# ライトを作成
light = Light()
# リモコンを作成
remote = RemoteControl(light)
# ライトを点灯
remote.press_on_button() # Output: ライトが点灯しました!
# ライトを消灯
remote.press_off_button() # Output: ライトが消灯しました!
# Undo(取り消し)
remote.press_undo() # Output: ライトが点灯しました!