home | suche | kontakt/johner | institut studierende | tech-docs | mindmailer |
![]() |









Command-Pattern
Das Command-Pattern hilft dabei, zwei Komponenten voneinander zu entkoppeln - konkret einen Sender (Auslöser) von einem Empfänger. Als Beispiel mag eine Fernbedienung für ein Modellflugzeug dienen. Die Fernbedienung soll auch für andere Spielzeuge wiederverwendbar sein. D.h. sie sollte das angesteuerte Objekt nicht (!) kennen. Das Command-Pattern zeigt, wie man so etwas realisieren kann: mittels eines Interfaces Command, welches über eine Methode execute verfügt.

Command
Hier das Interface, das über eine Methode execute verfügt. Wie man sieht, lässt sich auch ein Undo hier realisieren.
package patternCommand;
public interface Command {
public void execute();
//public void undo();
}
FlugzeugFliegLinksCommand
Nun benötigt man für jedes Kommando (in diesem Fall nur links und rechts) eine Implementierung des Command-Interfaces.
package patternCommand;
public class FlugzeugFliegLinksCommand implements Command {
private Flugzeug flugzeug;
public FlugzeugFliegLinksCommand(Flugzeug flugzeug) {
this.flugzeug = flugzeug;
}
public void execute() {
flugzeug.querruderLinks();
flugzeug.hoehenruderHoch();
}
}
Fernbedienung
Dank der Interfaces kann man nun die Fernbedienung unabhängig vom Objekt (Flugzeug oder anderes Spielzeug) "programmieren". Man sieht, dass die Fernbedienung diese Objekte nicht kennt.
package patternCommand;
public class Fernbedienung {
private Command rechtsCommand;
private Command linksCommand;
//Alternativ: Commands über setCommand() übergeben
public Fernbedienung (Command rechts, Command links) {
rechtsCommand = rechts;
linksCommand = links;
}
public void hebelNachRechts() {
rechtsCommand.execute();
}
public void hebelNachLinks() {
linksCommand.execute();
}
}
Fernbedienungskonfigurator
Zum Schluss benötigen wir noch eine Klasse, welche die "Programmierung" der Fernbedienung vornimmt. Sie muss natürlich das anzusteuernde Objekt (z.B. Flugzeug) und die Fernbedienung kennen.
In diesem Beispiel probiert der Fernbedingungskonfigurator die Fernbedienung gleich aus. Das Konfigurieren und Benutzen der Fernbedienung könnte genauso in zwei Klasse aufgeteilt werden.
package patternCommandClient;
import patternCommand.Command;
import patternCommand.Fernbedienung;
import patternCommand.Flugzeug;
import patternCommand.FlugzeugFliegLinksCommand;
import patternCommand.FlugzeugFliegRechtsCommand;
public class Fernbedienungskonfigurator {
public static void main(String[] args) {
//Priming der Fernbedieung (setzen EEPROM):
//Konkrete Commands werden erzeugt und mit Receiver verbunden
Flugzeug flugzeug = new Flugzeug();
Command rechtsCommand = new FlugzeugFliegRechtsCommand(flugzeug);
Command linksCommand = new FlugzeugFliegLinksCommand(flugzeug);
Fernbedienung fernbedienung = new Fernbedienung(rechtsCommand, linksCommand);
fernbedienung.hebelNachLinks();
}
}
Klassendiagramm
Zum Schluss noch das Klassendiagramm für unsere Implementierung des Pattern
