Java Academy · Les

Command-patroon: acties inkapselen

Verpak aanvragen als Command-objecten ter ondersteuning van undo/redo en het opnemen van macro's.

Les 3 van 414 stappen

Command-patroon: acties inkapselen is een gratis Java Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

De bedoeling van het opdrachtpatroon

Het opdrachtpatroon kapselt een verzoek in een object in, zodat je clients met verschillende verzoeken kunt parametriseren en ondersteuning kunt bieden voor wachtrijen, logboekregistratie en bewerkingen die je ongedaan kunt maken.

Opdrachtinterface

Definieer een interface met een execute()-methode en eventueel een undo()-methode. Elk opdrachtobject weet hoe het één actie uitvoert en terugdraait.

public interface Command {
    void execute();
    void undo();
}

Concrete opdracht: TextEditor

Elk concreet opdrachtobject kapselt een ontvanger en de parameters van de actie in. execute voert de actie uit; undo maakt deze ongedaan.

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()); }
}

Aanroeper: CommandHistory

De aanroeper bevat een geschiedenis van uitgevoerde opdrachten. Hij roept execute() aan en voegt de opdracht aan een stapel toe. Undo haalt een opdracht van de stapel en roept undo() aan.

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();
    }
}

Stapel voor ongedaan maken en opnieuw uitvoeren

Voeg een stapel voor opnieuw uitvoeren toe: bij het ongedaan maken voeg je de opdracht aan die stapel toe; bij opnieuw uitvoeren haal je de opdracht van de stapel en voer je deze opnieuw uit.

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);
    }
}

Macroopdracht

Een macroopdracht is een samengestelde opdracht die een lijst met opdrachten bevat en deze na elkaar uitvoert. Ongedaan maken voert de omgekeerde bewerkingen in omgekeerde volgorde uit.

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(); }
}

Opdrachtwachtrij voor taakverwerking

Sla opdrachten op in een wachtrij en verwerk ze asynchroon. Een werkthread haalt opdrachten uit de wachtrij en voert ze uit — zo worden producenten losgekoppeld van de uitvoeringsthread.

BlockingQueue<Command> queue = new LinkedBlockingQueue<>();
// Producer:
queue.put(new SendEmailCommand(recipient, subject, body));
// Consumer thread:
Command cmd = queue.take();
cmd.execute();

Opdrachten met Executor

Verpak opdrachten als Runnable-lambda's en dien ze in bij een ExecutorService — de lambda is het opdrachtobject.

ExecutorService exec = Executors.newFixedThreadPool(4);
exec.submit(() -> sendEmail(recipient, subject));
exec.submit(() -> generateReport(params));

Opdrachten vastleggen voor controle

Serialiseerbare opdrachtobjecten kunnen in een logboek worden opgeslagen. Bij herstel speel je ze opnieuw af om de uiteindelijke toestand te reconstrueren — de basis van Event Sourcing.

void execute(Command cmd) {
    cmd.execute();
    auditLog.append(cmd.toString()); // log every action
    history.push(cmd);
}

Actieknoppen in GUI's

In GUI-frameworks bevat elke knop of elk menu-item een opdracht. Als je op de knop klikt, roept die command.execute() aan. Vervang opdrachten tijdens de uitvoering om het gedrag van de knop te wijzigen.

Button saveBtn = new Button("Save");
saveBtn.setOnAction(() -> new SaveDocumentCommand(doc).execute());

Opdrachtpatroon versus strategiepatroon

Beide kapselen gedrag in. Het strategiepatroon kapselt een algoritme in dat je tijdens de uitvoering kunt verwisselen. Het opdrachtpatroon kapselt een volledig verzoek in, inclusief de parameters en ontvanger, en ondersteunt geschiedenis en wachtrijen.

Opdrachtpatroon in Spring

De Tasklet van Spring Batch en de MessageHandler van Spring Integration zijn opdrachtpatronen op applicatieniveau. Elke Tasklet kapselt één stap van een batchtaak in.

Korte controle

Welke extra methode voegt het opdrachtpatroon naast execute() toe om ongedaan maken te ondersteunen?

Samenvatting

Het opdrachtpatroon kapselt acties in als objecten. Gebruik het voor stapels voor ongedaan maken en opnieuw uitvoeren, taakwachtrijen, macro-opnamen en controlelogboeken. Combineer het met een aanroeper die de opdrachtgeschiedenis bijhoudt.

Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Command-patroon: acties inkapselen” gratis?

Ja — de volledige tekst van “Command-patroon: acties inkapselen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Command-patroon: acties inkapselen”?

Verpak aanvragen als Command-objecten ter ondersteuning van undo/redo en het opnemen van macro's. Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Command-patroon: acties inkapselen”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Observer-patroon: gebeurtenismeldingen
  2. Strategy-patroon: uitwisselbare algoritmen
  3. Command-patroon: acties inkapselen
  4. Template Method: algoritmeskeletten definiëren
← Terug naar Java Academy