Ответ
Паттерн 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-библиотеках (действия кнопок), планировщиках задач, транзакционных системах.