Skip to content

Latest commit

 

History

History

command

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Паттерн "Команда"

Определение

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

Описание примера

В качестве примера используется универсальный пульт управления домашней техникой. У пульта есть 7 ячеек, у каждой ячейки есть кнопки включения и выключения. Также у пульта есть глобальная кнопка отмены последней операции.

Чтобы отвязать код пульта (клиента) от кода устройств, которыми он управляет используются специальные объекты, у которых есть всего два метода: execute и undo. Пульт ничего не знает об конечных устройствах и объектах команд, кроме то, что для выполнения команды необходимо вызвать execute(), а для отмены - undo(). Объект команды инкапсулирует в себя получателя (устройство, которое будет выполнять инструкции) и сами инструкции.

Таким образом, при добавлении поддержки нового устройства, необходимо лишь создать соответствующие команды. Код самого клиента менять не нужно. Следовательно вся кодовая база соответствует принципу открытости/закрытости.

Ключевые моменты

  1. Паттерн Команда отделяет объект, выдающий запросы, от объекта, который умеет эти запросы выполнять.
  2. Объект команды инкапсулирует получателя с операцией (или набором операций).
  3. Инициатор вызывает метод execute() объекта команды, что приводит к выполнению соответствующих операций с получателем.
  4. Возможна параметризация инициаторов командами (даже динамическая во время выполнения).
  5. Команды могут поддерживать механизм отмены, восстанавливающий объект в состоянии до последнего вызова метода execute().
  6. Макрокоманды - простое расширение паттерна Команда, позволяющее выполнять цепочки из нескольких команд. В них также легко реализуется механизм отмены.
  7. На практике нередко встречаются "умные" объекты команд, которые реализуют запрос самостоятельно вместо его делегирования получателю.
  8. Команды также могут использоваться для реализации систем регистрации команд и поддержки транзакций.