Что такое паттерн Command и что даёт упаковка запроса в объект?
Поведенческие паттерны
Command превращает запрос в объект: операцию со всеми параметрами можно хранить, передавать, ставить в очередь, логировать и отменять.
Устройство
- Интерфейс
Commandс методамиexecute()иundo(); конкретная команда хранит получателя и аргументы. - Invoker просто вызывает
execute()— он не знает ни операции, ни получателя: связанность минимальна.
Что даёт объектность
- Undo и redo: стек выполненных команд с обратными операциями.
- Очереди и отложенное выполнение: задачи для воркеров, макросы (команда из команд — это уже Composite).
- Логирование и повтор: журнал команд восстанавливает состояние после сбоя — event sourcing в миниатюре.
Где встречается
Пункты меню и горячие клавиши в редакторах, job-очереди фоновых задач (сериализованные команды), сценарии умного дома.
Минус
Рост числа классов: на каждую операцию по классу — в простых случаях достаточно функции-обработчика.
Коротко для собеседования
Command делает из вызова объект с данными и методом execute(), поэтому операции можно откладывать, ставить в очередь, логировать и отменять. Незаменим для undo/redo и job-очередей, но в простых случаях класс на каждую операцию избыточен — хватает функции.