Какой есть подход похожий на паттерн Command?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Подходы похожие на паттерн 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 подходом.