- Command Pattern
-
Das Kommando oder der Befehl (engl. Command) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört als eines der GoF-Muster zu der Kategorie der Verhaltensmuster (Behavioral Patterns).
Es dient zum Kapseln von Anfragen als Kommando-Objekte, um damit Empfänger zu parametrisieren. Anfragen können dabei in Warteschlangen gestellt, aufgezeichnet und später ggf. auch wieder rückgängig gemacht werden.
Auch bekannt als: Aktion, Transaktion (Action, Transaction)
Inhaltsverzeichnis
Verwendung
Das Kommando wird verwendet, wenn Objekte mit einer auszuführenden Aktion parametrisiert werden sollen, beispielsweise wenn eine Schaltfläche in einer GUI mit einer Aktion verknüpft werden soll. Das ist die objektorientierte Entsprechung zu Rückruffunktionen (callback function).
Das Erstellen des Befehls und das tatsächliche Ausführen finden zu verschiedenen Zeiten oder in einem anderen Kontext (Thread, Prozess, Rechner) statt.
Implementation 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.
UML-Diagramm
Akteure
Der Befehl ist die Basisklasse aller Befehle und definiert die Schnittstelle zum Ausführen des Befehls. 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.
Vorteile
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).
Nachteile
Es wird für jedes Kommando eine neue Klasse benötigt. Dies kann sehr schnell zu einer großen Menge von Klassen führen.
Beispiel
Ein gutes Beispiel für das Befehlsmuster, ist die Verknüpfung von GUI-Elementen, wie Schaltflächen oder Menüpunkten, mit den entsprechenden Aktionen:
- 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)
Verwandte Entwurfsmuster
Makrobefehle können als Kompositum implementiert werden.
Das Memento-Entwurfsmuster kann die Objektzustände speichern.
Erzeugungsmuster: Abstrakte Fabrik | Singleton | Builder | Fabrikmethode | Prototyp
Strukturmuster: Adapter | Brücke | Decorator | Facade | Flyweight | Kompositum | Stellvertreter
Verhaltensmuster: Observer | Visitor | Interpreter | Iterator | Kommando | Memento | Schablonenmethode | Strategie | Vermittler | Zustand | Zuständigkeitskette
(Klassenmuster sind kursiv dargestellt)
Wikimedia Foundation.