90 likes | 242 Vues
Command Pattern. Karola Schäuble, 13015. Wozu eigentlich?. Beispiel Textverarbeitung viele Funktionen können von unterschiedlichen Stellen aus aufgerufen werden, z.B. - Menüeintrag - Button - Popup-Menü bei Rechtsklick - Tastaturkürzel
E N D
Command Pattern Karola Schäuble, 13015
Wozu eigentlich? • Beispiel Textverarbeitung • viele Funktionen können von unterschiedlichen Stellen aus aufgerufen werden, z.B. • - Menüeintrag • - Button • - Popup-Menü bei Rechtsklick • - Tastaturkürzel • Soll jedesmal die Funktion dahinter implementiert werden?
Beispiel Textverarbeitung • Befehle sollen rückgängig gemacht werden können • oder sie sollen erneut ausgeführt werden Wie kann man das speichern, wenn die Operationen eng mit den Objekten die sie aufrufen verbunden sind?
Lösung • Den Befehl in einem Objekt kapseln! • Ein und derselbe Befehl kann von meheren Objekten aus aufgerufen werden. • Die Befehlsobjekte können in einer Befehlsgeschichte gespeichert werden.
Einfache Struktur Die abstrakte Klasse Command definiert die Schnittstelle, über die der Invoker auf jede konkrete Befehlsklasse zugreifen kann.
Erklärung • Der Client (Anwendung) erzeugt ein ConcreteCommand-Objekt und weist ihm den Receiver zu. • Der Invoker befiehlt seinem gespeicherten Befehlsobjekt eine Anfrage auszuführen. • ConcreteCommand implementiert die execute()-Methode der Klasse Command und ruft darüber seinen Receiver auf. • Der Receiver führt nun die entsprechenden Operationen aus. Entkopplung von Aufrufer und Empfänger eines Befehls!
Vom Invoker zum ConcreteCommand Beispiel Menü • beim Hinzufügen der Menüeinträge wird eine add()-Methode aufgerufen - allgemein: add(String, Command) - speziell: add(„NameMenueEintrag“, KonkreterBefehl) Der Name des Menüeintrags und der dazugehörige Befehl werden dann in einer Tabelle abgelegt.
Code Beispiel abstract class Command { abstract public void execute(); } class ConcreteCommand extends Command { public ConcreteCommand() { ... } public void execute() { ... } }
Rückgängig • Um noch die Möglickeit des Rückgängigmachens hinzuzufügen, bekommt die Klasse Command noch eine undo()-Methode. • Der Zustand des Receivers wird nun im Befehlsobjekt gespeichert, bevor der Befehl ausgeführt wird und kann über undo() wiederhergestellt werden. • Es braucht desweiteren noch einen CommandManager, der die Befehlsobjekte in einer Liste speichert und gegebenenfalls dessen undo()-Methode aufruft.