Паттерн Command используется для инкапсуляции запроса в виде объекта, позволяя:
- Параметризация клиентов с различными запросами: Команда представляет собой объект, который можно хранить, передавать в методы или использовать в коллекциях. Это позволяет создавать универсальные классы, работающие с любыми командами, не зная деталей их реализации.
- Постановка запросов в очередь: Команды можно помещать в очередь для выполнения в последующем или в определенном порядке. Подходит для реализации отложенных операций, планировщиков задач или систем логирования.
- Предоставление поддержки для отмены операций: Команда может содержать методы для выполнения и отмены действия. Это используется в редакторах текста (отмена/повтор), играх и других приложениях с историей действий.
- Логирование изменений: Выполнив команду, можно записать ее в лог. Это полезно для восстановления состояния системы после сбоя или для аудита.
- Создание транзакций: Группа команд может быть объединена в одну транзакцию, которая либо выполняется целиком, либо полностью откатывается в случае ошибки.
Структурно паттерн включает следующие компоненты:
- Command: Интерфейс с методом для выполнения операции (например,
execute()
).
- ConcreteCommand: Реализация интерфейса
Command
, которая связывает приемник с определенным действием. Содержит ссылку на Receiver
.
- Invoker: Класс, который вызывает команду для выполнения. Не знает деталей реализации команды или ее п