Kommando (Entwurfsmuster)

Verhaltensmuster
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 29. Juli 2010 um 14:53 Uhr durch 92.74.233.90 (Diskussion). Sie kann sich erheblich von der aktuellen Version unterscheiden.

In der objektorientierten Programmierung ist Kommando (auch Befehl; englisch Command) ein Entwurfsmuster, bei dem das Kommando-Objekt alle zum Aufruf einer Methode notwendigen Informationen enthält. Es ist eines der GoF-Muster, das zur Kategorie der Verhaltensmuster (Behavioral Patterns) gehört.

Verwendung

Wenn z. B. eine Schaltfläche in einer GUI mit einer Aktion verknüpft werden soll, dient das Kommando dazu, die auszuführende Aktion zu parametrisieren. Es stellt somit die objektorientierte Entsprechung zu den Rückruffunktionen (callback function) dar. Dabei können das Erstellen des Kommandos und die tatsächliche Ausführung zu verschiedenen Zeiten oder in einem anderen Kontext (Thread, Prozess, Rechner) stattfinden.

Implementierung eines Rückgängig-Mechanismus (Undo). Bei jeder Ausführung werden die zur Umkehrung nötigen Daten im Objekt gespeichert und das Objekt selber auf einem Stapel gesichert. Um das Gegenteil Wiederherstellen (Redo) zu implementieren, genügt ein zweiter Stapel für die rückgängig gemachten Befehle.

Akteure

 
UML-Klassendiagramm

Der Befehl ist die Basisklasse aller Kommandos. Ein Konkreter Befehl speichert den zum Ausführen nötigen Zustand, darunter typischerweise auch einen Verweis auf den Empfänger und implementiert die Befehlsschnittstelle.

Der Klient erzeugt einen konkreten Befehl und versieht ihn mit einem Verweis auf den Empfänger und allen anderen nötigen Informationen. Er gibt dem Aufrufer eine Referenz auf den konkreten Befehl.

Der Aufrufer besitzt einen oder mehrere Verweise auf Befehle und fordert diese bei Bedarf auf, ihre Aktion auszuführen. An den Empfänger werden keine besonderen Anforderungen gestellt. Er muss nichts über die anderen Akteure wissen. Somit kann jede Klasse als Empfänger dienen. Der konkrete Befehl ruft Methoden des Empfängerobjektes auf, um seine Aktion auszuführen.

Vor- & Nachteile

Auslösender und Ausführender sind entkoppelt. Befehlsobjekte können wie andere Objekte auch manipuliert werden (Verändern, Filtern, Zwischenspeichern, …). Befehlsobjekte können zu komplexen Befehlen kombiniert werden (Makros, realisiert als Kompositum).

Da für jedes Kommando eine neue Klasse benötigt wird, kann deren Anzahl schnell groß und die Implementierung damit unübersichtlich werden.

Beispiel

Die Verknüpfung von GUI-Elementen stellt ein einfaches Beispiel mit Schaltflächen oder Menüpunkten dar:

  • Konkrete Befehle realisieren dann Aktionen wie Datei öffnen, Rückgängig oder Schreibmarke nach rechts
  • Klienten sind die Applikation oder Dialoge.
  • Aufrufer sind Schaltflächen, Menüpunkte oder Hotkeys.
  • Empfänger sind die Applikation (Datei öffnen) oder das Dokument (Rückgängig, Einfügemarke nach rechts)

Vorlage:Navigationsleiste Entwurfsmuster der Viererbande