Что такое паттерн Команда (Command) и как он применяется?

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

Ответ

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

Основные компоненты:

  • Command (Интерфейс команды): Объявляет метод выполнения (например, execute()).
  • ConcreteCommand (Конкретная команда): Реализует интерфейс, связывая действие с получателем.
  • Invoker (Инициатор): Инициирует выполнение команды.
  • Receiver (Получатель): Объект, который знает, как выполнить само действие.

Пример на Java:

// Command
interface Command {
    void execute();
}

// ConcreteCommand
class LightOnCommand implements Command {
    private Light light; // Receiver
    public LightOnCommand(Light light) { this.light = light; }
    @Override
    public void execute() { light.turnOn(); }
}

// Invoker
class RemoteControl {
    private Command command;
    public void setCommand(Command command) { this.command = command; }
    public void pressButton() { command.execute(); }
}

// Receiver
class Light {
    public void turnOn() { System.out.println("Light is ON"); }
}

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

  • Отмена и повтор операций (Undo/Redo): Команда может хранить состояние для отката.
  • Очереди и планирование задач: Команды можно ставить в очередь или выполнять в разное время.
  • Макрокоманды: Создание составных команд из нескольких простых.
  • Слабосвязанная архитектура: Инициатор не зависит от конкретных операций получателя.