Wzorzec Command: hermetyzowanie akcji
Opakowuj żądania w obiekty Command, aby obsługiwać cofanie, ponawianie i nagrywanie makr.
Wzorzec Command: hermetyzowanie akcji to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Intencja wzorca Polecenie
Wzorzec Polecenie hermetyzuje żądanie jako obiekt, umożliwiając parametryzowanie klientów różnymi żądaniami, kolejkowanie, rejestrowanie oraz wykonywanie operacji, które można cofnąć.
Interfejs polecenia
Należy zdefiniować interfejs z metodą execute() oraz opcjonalnie metodą undo(). Każdy obiekt polecenia wie, jak wykonać i cofnąć jedno działanie.
public interface Command {
void execute();
void undo();
}Konkretne polecenie: TextEditor
Każde konkretne polecenie hermetyzuje odbiornik i parametry działania. Metoda execute wykonuje działanie, a undo je cofa.
public class InsertTextCommand implements Command {
private final TextEditor editor;
private final String text;
private final int position;
public InsertTextCommand(TextEditor editor, String text, int pos) {
this.editor = editor; this.text = text; this.position = pos;
}
public void execute() { editor.insert(position, text); }
public void undo() { editor.delete(position, text.length()); }
}Wywołujący: CommandHistory
Wywołujący przechowuje historię wykonanych poleceń. Wywołuje execute() i umieszcza polecenie na stosie. Cofnięcie zdejmuje polecenie ze stosu i wywołuje undo().
public class CommandHistory {
private final Deque<Command> history = new ArrayDeque<>();
public void execute(Command cmd) {
cmd.execute();
history.push(cmd);
}
public void undo() {
if (!history.isEmpty()) history.pop().undo();
}
}Stos cofania / ponawiania
Należy dodać stos ponawiania: podczas cofania umieszczać polecenie na stosie ponawiania, a podczas ponawiania zdejmować je z tego stosu i wykonywać ponownie.
private final Deque<Command> undoStack = new ArrayDeque<>();
private final Deque<Command> redoStack = new ArrayDeque<>();
public void redo() {
if (!redoStack.isEmpty()) {
Command cmd = redoStack.pop();
cmd.execute();
undoStack.push(cmd);
}
}Makropolecenie
Makropolecenie jest kompozytem, który przechowuje listę poleceń i wykonuje je po kolei. Cofnięcie wykonuje działania odwrotne w odwrotnej kolejności.
public class MacroCommand implements Command {
private final List<Command> commands;
public MacroCommand(List<Command> commands) { this.commands = commands; }
public void execute() { commands.forEach(Command::execute); }
public void undo() { for (int i = commands.size()-1; i>=0; i--) commands.get(i).undo(); }
}Kolejka poleceń do przetwarzania zadań
Polecenia można przechowywać w kolejce i przetwarzać asynchronicznie. Wątek roboczy pobiera polecenia z kolejki i je wykonuje, oddzielając producentów od wątku wykonującego.
BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();Polecenie z użyciem Executor
Należy opakować polecenia w lambdy Runnable i przekazać je do ExecutorService — lambda jest obiektem polecenia.
ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));Rejestrowanie poleceń na potrzeby audytu
Serializowalne obiekty poleceń można zapisywać w dzienniku. Podczas odtwarzania po awarii należy wykonać je ponownie, aby odtworzyć stan końcowy — na tym opiera się Event Sourcing.
void execute(Command cmd) {
cmd.execute();
auditLog.append(cmd.toString()); // log every action
history.push(cmd);
}Przyciski akcji GUI
W środowiskach GUI każdy przycisk lub element menu przechowuje polecenie. Kliknięcie przycisku wywołuje command.execute(). Polecenia można wymieniać w czasie działania, aby zmieniać zachowanie przycisku.
Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());Polecenie a Strategia
Oba wzorce hermetyzują zachowanie. Strategia hermetyzuje algorytm, który można wymieniać w czasie działania. Polecenie hermetyzuje kompletne żądanie, w tym jego parametry i odbiornik, a także obsługuje historię oraz kolejkowanie.
Polecenie w Spring
Tasklet z Spring Batch oraz MessageHandler z Spring Integration to wzorce polecenia na poziomie aplikacji. Każdy Tasklet hermetyzuje jeden krok zadania wsadowego.
Szybkie sprawdzenie
Jaką dodatkową metodę dodaje wzorzec Polecenie poza execute(), aby obsługiwać cofanie?
Podsumowanie
Wzorzec Polecenie hermetyzuje działania jako obiekty. Należy używać go do stosów cofania i ponawiania, kolejek zadań, rejestrowania makropoleceń oraz rejestrowania audytowego. Warto połączyć go z wywołującym, który przechowuje historię poleceń.
Często zadawane pytania
Czy lekcja „Wzorzec Command: hermetyzowanie akcji” jest bezpłatna?
Tak — pełny tekst „Wzorzec Command: hermetyzowanie akcji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec Command: hermetyzowanie akcji”?
Opakowuj żądania w obiekty Command, aby obsługiwać cofanie, ponawianie i nagrywanie makr. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wzorzec Command: hermetyzowanie akcji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wzorzec Observer: powiadamianie o zdarzeniach
- Wzorzec Strategy: wymienne algorytmy
- Wzorzec Command: hermetyzowanie akcji
- Template Method: definiowanie szkieletów algorytmów