Во-вторых, копии состояния могут занимать довольно много оперативной памяти. Поэтому иногда можно прибегнуть к альтернативной реализации, когда вместо восстановления старого состояния, команда выполняет обратное действие. Недостаток этого способа в сложности (а иногда и невозможности) реализации обратного действия.
Создайте общий интерфейс команд и определите в нём метод запуска.
Один за другим создайте классы конкретных команд. В каждом классе должно быть поле для хранения ссылки на один или несколько объектов-получателей, которым команда будет перенаправлять основную работу.
Кроме этого, команда должна иметь поля для хранения параметров, которые нужны при вызове методов получателя. Значения всех этих полей команда должна получать через конструктор.
И наконец, реализуйте основной метод команды, вызывая в нём те или иные методы получателя.
Добавьте в классы отправителей поля для хранения команд. Объект-отправитель должен принимать готовый объект команды извне через конструктор, либо через сеттер команды.
Измените основной код отправителей так, чтобы они делегировали выполнение действия команде.
Порядок инициализации объектов должен выглядеть так:
, , и показывают различные способы работы отправителей запросов с их получателями:
Обработчики в могут быть выполнены в виде . В этом случае множество разных операций может быть выполнено над одним и тем же контекстом, коим является запрос.
Но есть и другой подход, в котором сам запрос является Командой, посланной по цепочке объектов. В этом случае одна и та же операция может быть выполнена над множеством разных контекстов, представленных в виде цепочки.
и можно использовать сообща для реализации отмены операций. В этом случае объекты команд будут отображать выполненные действие над объектом, снимки — хранить копию состояния этого объекта до того, как команда была выполнена.
и похожи по духу, но отличаются масштабом и применением:
Если нужно копировать перед вставкой в историю выполненных команд, вам может помочь .
можно рассматривать как расширенный аналог , который способен работать сразу с несколькими видами получателей.