Назад к вопросам
Middle
97
questionbank

Что такое паттерн 'Команда' (Command)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Поведенческий паттерн проектирования, который превращает запрос в отдельный объект, содержащий всю информацию о запросе. Это позволяет параметризовать методы объектов с различными запросами, ставить запросы в очередь или протоколировать их, а также поддерживает отмену операций.

Основные элементы паттерна:

  • Команда (Command): Абстрактный класс или интерфейс, объявляющий метод для выполнения запроса.
    // Интерфейс команды
    class Command:
        def execute(self):
            pass
    
    
  • Конкретная Команда (Concrete Command): Реализует интерфейс Command и связывает приемник с действием. Определяет набор действий, которые должны быть выполнены на приемнике.
    // Конкретная команда для включения света
    class LightOnCommand(Command):
        def __init__(self, light):
            self._light = light # Приемник
    
        def execute(self):
            self._light.on()
    
    
  • Приемник (Receiver): Класс, который знает, как выполнить фактическую работу. В нашем примере это Light.
    // Приемник - объект, над которым выполняются действия
    class Light:
        def on(self):
            print("Свет включен")
    
        def off(self):
            print("Свет выключен")
    
    
  • Инициатор (Invoker): Объект, который запрашивает у команды выполнение действия. Не знает о конкретной команде или приемнике.
    // Инициатор - вызывает команду
    class RemoteControl:
        def set_command(self, command):
            self._command = command
    
        def press_button(self):
            self._command.execute()
    
    
  • Клиент (Client): Создает объекты Concrete Command и связывает их с Receiver. Затем передает команду в Invoker.
    // Клиентский код
    if __name__ == "__main__":
        light = Light() # Приемник
        light_on_command = LightOnCommand(light) # Конкретная команда
    
        remote = RemoteControl() # Инициатор
        remote.set_command(light_on_command) # Передача команды инициатору
    
        remote.press_button() # Инициатор вызывает команду
    
    

Преимущества:

  • Разделяет инициатор и приемник команды.
  • Позволяет параметризовать инициатор различными командами.
  • Облегчает реализацию отмены/повтора операций (путем сохранения истории команд).
  • Позволяет построить очереди команд и протоколировать их выполнение.

Недостатки:

  • Может привести к большому количеству классов, если много команд.