В чем суть паттерна Command?

«В чем суть паттерна Command?» — вопрос из категории Паттерны, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн Command (Команда) инкапсулирует запрос в виде объекта. Это позволяет параметризовать клиентов различными запросами, ставить их в очередь, логировать и поддерживать отмену операций.

Структура и пример (Java):

// 1. Интерфейс команды
interface Command {
    void execute();
    void undo(); // Для поддержки отмены
}

// 2. Конкретная команда
class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOn();
    }

    @Override
    public void undo() {
        light.turnOff();
    }
}

// 3. Использование (Invoker)
RemoteControl remote = new RemoteControl();
remote.setCommand(new LightOnCommand(livingRoomLight));
remote.pressButton(); // Выполнит команду

Преимущества и применение:

  • Разделение ответственности: Отделяет объект, инициирующий запрос, от объекта, который его выполняет.
  • Гибкость: Команды — это объекты, которыми легко манипулировать (очередь, журналирование).
  • Отмена/повтор (Undo/Redo): Легко реализуется хранением истории команд.
  • Используется в: UI-библиотеках (действия кнопок), планировщиках задач, транзакционных системах.