Command-mönstret: kapsla in åtgärder
Omslut begäranden i Command-objekt för att stödja ångra/gör om och makroinspelning.
Command-mönstret: kapsla in åtgärder är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.
Command-mönstrets syfte
Command kapslar in en begäran som ett objekt, vilket gör det möjligt att parametrera klienter med olika begäranden, köa och logga dem samt stödja ångrbara operationer.
Command-gränssnitt
Definiera ett gränssnitt med en execute()-metod och eventuellt en undo()-metod. Varje kommandoobjekt vet hur en åtgärd ska utföras och återställas.
public interface Command {
void execute();
void undo();
}Konkret Command: TextEditor
Varje konkret kommando kapslar in en mottagare och åtgärdens parametrar. Execute utför åtgärden och undo återställer den.
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()); }
}Anropare: CommandHistory
Anroparen innehåller en historik över utförda kommandon. Den anropar execute() och lägger kommandot på en stack. Undo tar bort det översta kommandot och anropar 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();
}
}Stack för ångra och göra om
Lägg till en stack för att göra om: när en åtgärd ångras lägger du kommandot på stacken för att göra om; när åtgärden görs om tar du bort det översta kommandot från stacken och kör det igen.
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);
}
}Makrokommando
Ett makrokommando är en komposit som innehåller en lista med kommandon och kör dem i ordningsföljd. Ångring utför motsvarande återställningsåtgärder i omvänd ordning.
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(); }
}Kommandokö för uppgiftsbearbetning
Lagra kommandon i en kö och bearbeta dem asynkront. En arbetstråd hämtar och kör kommandon från kön, vilket frikopplar producenterna från tråden som utför dem.
BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();Command med Executor
Slå in kommandon som Runnable-lambdor och skicka dem till en ExecutorService – lambdan är kommandoobjektet.
ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));Loggning av kommandon för granskning
Serialiserbara Command-objekt kan sparas i en logg. Vid återställning spelas de upp igen för att rekonstruera det slutliga tillståndet – grunden för Event Sourcing.
void execute(Command cmd) {
cmd.execute();
auditLog.append(cmd.toString()); // log every action
history.push(cmd);
}Åtgärdsknappar i GUI
I GUI-ramverk innehåller varje knapp eller menyalternativ ett Command. När du klickar på knappen anropas command.execute(). Byt ut kommandon under körning för att ändra knappens beteende.
Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());Command kontra Strategy
Båda kapslar in beteende. Strategy kapslar in en algoritm som kan bytas ut under körning. Command kapslar in en komplett begäran, inklusive dess parametrar och mottagare, och stöder historik och köhantering.
Command i Spring
Spring Batchs Tasklet och Spring Integrations MessageHandler är kommandomönster på applikationsnivå. Varje Tasklet kapslar in ett steg i ett batchjobb.
Snabb kontroll
Vilken ytterligare metod lägger Command till utöver execute() för att stödja undo?
Sammanfattning
Command kapslar in åtgärder som objekt. Använd det för stackar för ångra/göra om, uppgiftsköer, makroinspelning och granskningsloggning. Kombinera med en anropare som underhåller kommandots historik.
Lär dig Java med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 104
- Lektioner
- 374
Vanliga frågor
Är lektionen ”Command-mönstret: kapsla in åtgärder” gratis?
Ja – hela texten till ”Command-mönstret: kapsla in åtgärder” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Command-mönstret: kapsla in åtgärder”?
Omslut begäranden i Command-objekt för att stödja ångra/gör om och makroinspelning. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Java Academy?
Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Command-mönstret: kapsla in åtgärder”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Java Academy-lektionen?
Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Observer-mönstret: händelsenotifiering
- Strategy-mönstret: utbytbara algoritmer
- Command-mönstret: kapsla in åtgärder
- Template Method: definiera algoritmskelett