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