(engl. Pattern command)
Das Entwurfsmuster Befehl gehört zur
Klasse der Verhaltensmuster. Es kapselt einen Befehl als eigenständiges
Objekt. Dadurch wird es möglich, einem Klienten unterschiedliche Befehle über
die selbe Schnittstelle anzubieten bzw. eine Aktion unabhängig von dessen
Aktivierung zu behandeln.
Das Befehlsmuster kann verwendet werden, wenn:
- Objekte mit einer auszuführenden Aktion parametriert werden
sollen.
Dies ist vergleichbar mit Callback-Funktionen in prozeduralen
Sprachen, also Funktionen die irgendwo registriert werden und zu einem späteren
Zeitpunkt (z.B. beim Auslösen eines bestimmten Ereignisses) aufgrufen werden.
- Anfragen zu unterschiedlichen Zeitpunkten zu spezifizieren, aufzureihen
und auszuführen sind.
Ein Befehlsobjekt kann über eine von der
ursprünglichen Anfrage unabhängige Lebensdauer verfügen. Wenn der Empfänger
einer Anfrage in einer vom Adressraum unabhängigen Weise repräsentiert werden
kann, dann kann ein Befehlsobjekt für die Anfrage zu einem anderen Prozess
transferiert und die Anfrage dort ausgeführt werden.
- eine Undo-Funktion, d.h. das Rückgängigmachen von Operationen,
unterstützt werden soll.
Die FuehreAus-Operation einer Befehlsklasse
kann den relevanten Zustand für die Umkehr des Befehls im Befehlsobjekt selbst
speichern. Die Befehlsklassenschnittstelle muss dann über eine zusätzliche
Rückgängig-Operation verfügen, welche die Auswirkungen des vorigen
FuehreAus-Aufrufs rückgängig macht. Einmal ausgeführte Befehlsobjekte werden in
einer Befehlsgeschichte (Liste) gespeichert. Undo und Redo erreicht man durch
Traversieren der Liste vorwärts und rückwärts, wobei man jeweils FuehreAus
respektive Rückgängig aufruft.
- Änderungen mitprotokolliert werden sollen.
Im Falle eines
Absturzes können die bereits vorgenommenen Änderungen somit erneut ausgeführt
werden. Indem die Befehlsklassenschnittstelle um Operationen zum Laden und
Speichern erweitert wird, kann ein persistentes Logbuch der Änderungen angelegt
werden. Das System nach einem Absturz wieder herzustellen umfasst dann das Laden
von gespeicherten Befehlsobjekten von der Festplatte und ihre erneute Ausführung
mittels der FuehreAus-Operation.
- ein System mittels komplexer Operationen strukturiert werden soll, die
aus primitiven Operationen aufgebaut sind.
Solch eine Struktur kann oft
in Informationssystemen gefunden werden, die Transaktionen unterstützen. Eine
Transaktion kapselt eine Menge von Datenänderungen. Das Befehlsmuster stellt
eine Möglichkeit dar, Transaktionen zu modellieren. Befehlsobjekte besitzen eine
gemeinsame Schnittstelle, die es ihnen ermöglicht, alle Transaktionen auf die
gleiche Weise aufzurufen. Das Muster erleichtert es zudem, das System um neue
Transaktionen zu erweitern. Befehlsobjekte können weiterhin zu
sogenannten Makro-Befehlen zusammengesetzt werden. Dadurch wird es möglich eine
Abfolge von Befehlen zusammenzufassen und somit genauso wie einen einzelnen
Befehl zu behandeln. Die FuehreAus-Operation des Makros besteht dann aus dem
Aufruf aller FuehreAus-Operationen der zugeordneten Befehlsobjekte. (siehe Beispiel)
Quelle: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides:
Entwurfsmuster, 1996
|