Skip to content

Command

Pandas edited this page Jun 18, 2017 · 1 revision

Назначение

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

Применимость

Используйте паттерн команда, когда хотите:

  • Параметризовать объекты выполняемым действием, как в случае с пунктами меню.
  • Определять, ставить в очередь и выполнять запросы в разное время.
  • Поддержать отмену операций. Операция Execute объекта Command может сохранить состояние, необходимое для отката действий, выполненных командой.
  • Поддержать протоколирование изменений, чтобы их можно было выполнить повторно после аварийной остановки системы.
  • Структурировать систему на основе высокоуровневых операций, построенных из примитивных.

Структура

Imgur

Участники

  • Command - команда: объявляет интерфейс для выполнения операции;

  • ConcreteCommand - конкретная команда: определяет связь между объектом-получателем Receiver и действием; реализует операцию Execute путем вызова соответствующих операций объекта Receiver;

  • Client - клиент: создает объект класса ConcreteCommand и устанавливает его получателя;

  • Invoker - инициатор: обращается к команде для выполнения запроса;

  • Receiver (Document, Application) - получатель: располагает информацией о способах выполнения операций, необходимых для удовлетворения запроса. В роли получателя может выступать любой класс.

Результаты

Результаты применения паттерна команда таковы:

  • Команда разрывает связь между объектом, инициирующим операцию, и объектом, имеющим информацию о том, как ее выполнить;
  • Команды - это самые настоящие объекты. Допускается манипулировать ими и расширять их точно так же, как в случае с любыми другими объектами;
  • Из простых команд можно собирать составные. В общем случае составные команды описываются паттерном компоновщик;
  • Добавлять новые команды легко, поскольку никакие существующие классы изменять не нужно

Clone this wiki locally