Инкапсулирует запрос в виде объекта, делая возможной параметризацию клиентских объектов с другими запросами, организацию очереди или регистрацию запросов, а также поддержку отмены операций.
В качестве примера используется универсальный пульт управления домашней техникой. У пульта есть 7 ячеек, у каждой ячейки есть кнопки включения и выключения. Также у пульта есть глобальная кнопка отмены последней операции.
Чтобы отвязать код пульта (клиента) от кода устройств, которыми он управляет используются специальные объекты, у которых есть всего два метода: execute и undo. Пульт ничего не знает об конечных устройствах и объектах команд, кроме то, что для выполнения команды необходимо вызвать execute(), а для отмены - undo(). Объект команды инкапсулирует в себя получателя (устройство, которое будет выполнять инструкции) и сами инструкции.
Таким образом, при добавлении поддержки нового устройства, необходимо лишь создать соответствующие команды. Код самого клиента менять не нужно. Следовательно вся кодовая база соответствует принципу открытости/закрытости.
- Паттерн Команда отделяет объект, выдающий запросы, от объекта, который умеет эти запросы выполнять.
- Объект команды инкапсулирует получателя с операцией (или набором операций).
- Инициатор вызывает метод execute() объекта команды, что приводит к выполнению соответствующих операций с получателем.
- Возможна параметризация инициаторов командами (даже динамическая во время выполнения).
- Команды могут поддерживать механизм отмены, восстанавливающий объект в состоянии до последнего вызова метода execute().
- Макрокоманды - простое расширение паттерна Команда, позволяющее выполнять цепочки из нескольких команд. В них также легко реализуется механизм отмены.
- На практике нередко встречаются "умные" объекты команд, которые реализуют запрос самостоятельно вместо его делегирования получателю.
- Команды также могут использоваться для реализации систем регистрации команд и поддержки транзакций.