← Назад к вопросам

Какой есть подход похожий на паттерн Command?

2.0 Middle🔥 121 комментариев
#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подходы похожие на паттерн Command

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

Основная идея паттерна Command

Паттерн Command решает проблему разделения объекта, инициирующего операцию, от объекта, который её выполняет. Это достигается путём инкапсуляции действия в отдельный объект.

Структура:

  • Command (интерфейс) — определяет методы execute() и undo()
  • ConcreteCommand (конкретная команда) — реализует интерфейс Command
  • Invoker (инициатор) — выполняет команду
  • Receiver (получатель) — выполняет фактическое действие
// Command интерфейс
public interface Command {
    void execute();
    void undo();
}

// Receiver — объект, который выполняет действие
public class Light {
    public void turnOn() {
        System.out.println("Свет включен");
    }
    public void turnOff() {
        System.out.println("Свет выключен");
    }
}

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

// Invoker — отправляет команды
public class RemoteControl {
    private Command lastCommand;
    
    public void pressButton(Command command) {
        command.execute();
        lastCommand = command;
    }
    
    public void pressUndo() {
        if (lastCommand != null) {
            lastCommand.undo();
        }
    }
}

Похожие подходы

1. Strategy Pattern

Похож на Command, но используется для выбора алгоритма выполнения, а не для инкапсуляции действий. Strategy — это о "как делать", Command — это о "что делать".

public interface PaymentStrategy {
    void pay(int amount);
}

public class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Оплата кредитной картой: " + amount);
    }
}

2. Observer Pattern

Оба паттерна разделяют отправителя и получателя, но Observer используется для уведомления множества объектов об изменениях, а Command — для инкапсуляции действий.

3. Callback Functions (Функции обратного вызова)

В Java используются Functional Interfaces и Lambda expressions как альтернатива Command:

@FunctionalInterface
public interface SimpleCommand {
    void execute();
}

public class Invoker {
    public void executeCommand(SimpleCommand command) {
        command.execute();
    }
}

// Использование
Invoker invoker = new Invoker();
invoker.executeCommand(() -> System.out.println("Выполняется команда"));

4. Event-driven Architecture

В современных Java приложениях часто используется событийная архитектура с EventBus вместо явного паттерна Command:

public class ButtonClickedEvent {
    private String buttonName;
    
    public ButtonClickedEvent(String buttonName) {
        this.buttonName = buttonName;
    }
}

public class EventHandler {
    @Subscribe
    public void handleButtonClick(ButtonClickedEvent event) {
        System.out.println("Кнопка нажата: " + event.getButtonName());
    }
}

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

  • Очередь операций — задачи добавляются в очередь и выполняются позднее
  • История операций — сохранение истории выполненных команд для отката
  • Отмена/повтор — реализация функции Undo/Redo
  • Отложенное выполнение — выполнение команды в определённый момент времени
  • Макросы — комбинирование нескольких команд в одну

Вывод: Command — универсальный паттерн для инкапсуляции действий, но в современной Java часто заменяется lambda выражениями и event-driven подходом.