Перейти к основному содержимому

Что это такое

Паттерн Command превращает действие в значение: в объект, который знает, как себя выполнить — и часто как себя отменить. Действия-значения можно хранить в массивах, ставить в очередь, откладывать, записывать в журнал и воспроизводить заново.

Как только вам нужна отмена, вам нужны команды: что-то должно помнить, что было сделано, чтобы сделать обратное.


Пример: набор текста с отменой

Каждое слово, добавленное в документ, — это команда с методами execute() и undo(). Выполненные команды попадают в массив истории — отмена сводится к тому, чтобы попросить последнюю из них обратить своё действие.

Действия, которые умеют себя обращать

Опечатка wrold удаляется не специальным кодом, а той командой, которая её добавила, — только она точно знает, что нужно забрать обратно. Каждая команда хранит сам массив документа, поэтому её push и pop меняют документ вызывающего кода.

Prompt
Напишите программу на TypeScript с паттерном Command: интерфейс Command с методами execute и undo и класс-команду AddText, который добавляет слово в массив документа и может забрать его обратно. Выполните две команды (вторая добавляет опечатку), сохраните их в массиве истории, выведите документ, отмените последнюю команду и выведите документ снова.
Вывод: программа на TypeScript и захваченный вывод

Когда его использовать

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

Откажитесь от него, когда действия выполняются по принципу «запустил и забыл». Поставленное в очередь действие, которое нечего отменять, часто оказывается просто функцией-значением в массиве — полный паттерн оправдывает себя только тогда, когда нужна отмена или изучение действий.


Плюсы и минусы

Плюсы: отмена и повтор становятся естественными; действия можно ставить в очередь, записывать в журнал и воспроизводить заново; новые действия подключаются без изменения вызывающей стороны.

Минусы: по одному классу на действие быстро накапливается; корректное состояние для отмены — тонкий момент: команда должна запомнить всё, что нужно для обращения её действия.