Паттерн "Команда" в Java — undo в редакторе и очередь действий
Обзор — в поведенческих паттернах. Практика на C# (MediatR, ICommand) — в Команда в C#. Здесь — классическая Command на Java с undo/redo.
Задача паттерна
Command превращает запрос в объект с методами execute() и при необходимости undo(). Такой объект можно передать, поставить в очередь, залогировать или отменить.
Пример — текстовый редактор
import java.util.ArrayDeque;
import java.util.Deque;
interface Command {
void execute();
void undo();
}
class TextEditor {
private final StringBuilder text = new StringBuilder();
void insert(int pos, String str) {
text.insert(pos, str);
}
void delete(int pos, int length) {
text.delete(pos, pos + length);
}
String getText() {
return text.toString();
}
}
class InsertCommand implements Command {
private final TextEditor editor;
private final int position;
private final String text;
InsertCommand(TextEditor editor, int position, String text) {
this.editor = editor;
this.position = position;
this.text = text;
}
@Override
public void execute() {
editor.insert(position, text);
}
@Override
public void undo() {
editor.delete(position, text.length());
}
}
class CommandHistory {
private final Deque<Command> history = new ArrayDeque<>();
void execute(Command cmd) {
cmd.execute();
history.push(cmd);
}
void undo() {
if (!history.isEmpty()) {
history.pop().undo();
}
}
}
TextEditor editor = new TextEditor();
CommandHistory history = new CommandHistory();
history.execute(new InsertCommand(editor, 0, "Hello"));
history.execute(new InsertCommand(editor, 5, " World"));
System.out.println(editor.getText()); // Hello World
history.undo();
System.out.println(editor.getText()); // Hello
Command в Java-экосистеме
| Место | Как проявляется Command |
|---|---|
Swing Action | Объект действия с actionPerformed |
| JUnit / TestNG | Иногда оборачивают шаги в команды |
| CQRS | CreateOrderCommand как DTO намерения (см. интеграционные паттерны) |
В Spring Boot для HTTP-команд чаще используют сервисные методы или MediatR-подобные библиотеки; учебная схема Command + Handler на C# — в 120.
Когда применять и риски
| Ситуация | Command |
|---|---|
| Undo/redo | Каждое действие — класс с обратимой логикой |
| Очередь, отложенное выполнение | Команда сериализуется и уходит в worker |
| Макросы | Список команд выполняется подряд |
Минус — много мелких классов. Для одного вызова сервиса достаточно метода без паттерна.
Откат через полный снимок состояния — Memento.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#