🐱

Command

2023/09/10に公開

Command パターンは、リクエストをオブジェクトとしてカプセル化し、遅延実行やキュー、ログ取り、トランザクションなどのサポートを可能にするデザインパターンです。このパターンを使用することで、リクエストの送信者と受信者を分離できます。

主要な構成要素:

  1. Command (コマンド): 実行されるアクションを表すインターフェースや抽象クラス。
  2. ConcreteCommand (具体的なコマンド): Command インターフェースを実装する具体的なクラス。
  3. Invoker (起動者): Command の実行を要求するクラス。
  4. Receiver (受信者): コマンドの実際の操作を行うクラス。

例:

ライトのオン・オフを制御するシンプルなリモコンを考えてみましょう。

  1. Command:

    from abc import ABC, abstractmethod
    
    class Command(ABC):
        @abstractmethod
        def execute(self):
            pass
    
    
  2. ConcreteCommand:

    class LightOnCommand(Command):
        def __init__(self, light):
            self.light = light
    
        def execute(self):
            self.light.turn_on()
    
    class LightOffCommand(Command):
        def __init__(self, light):
            self.light = light
    
        def execute(self):
            self.light.turn_off()
    
    
  3. Invoker:

    class RemoteControl:
        def set_command(self, command):
            self.command = command
    
        def press_button(self):
            self.command.execute()
    
    
  4. Receiver:

    class Light:
        def turn_on(self):
            print("Light is ON")
    
        def turn_off(self):
            print("Light is OFF")
    
    

利点:

  1. 分離: Command パターンは、リクエストの発行者と実行者を分離します。これにより、同じリクエストを異なる受信者で再利用することが可能となります。
  2. 柔軟性: システムに新しいコマンドを追加することが容易になります。
  3. 遅延、キュー、ログ取り: Command パターンは、コマンドの遅延実行やキューイング、ログ取りなどの操作をサポートします。

Command パターンは、リクエストや操作、呼び出しをオブジェクトとしてカプセル化することで、リクエストの送信者と受信者の間の関連性を低く保ちながら、高度な操作(遅延実行、キューイングなど)を可能にするために使用されます。

Discussion