Назад к вопросам
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() # Инициатор вызывает команду
Преимущества:
- Разделяет инициатор и приемник команды.
- Позволяет параметризовать инициатор различными командами.
- Облегчает реализацию отмены/повтора операций (путем сохранения истории команд).
- Позволяет построить очереди команд и протоколировать их выполнение.
Недостатки:
- Может привести к большому количеству классов, если много команд.