command pattern

9
Command Pattern Karola Schäuble, 13015

Upload: melva

Post on 04-Jan-2016

41 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Command Pattern

Command Pattern

Karola Schäuble, 13015

Page 2: Command Pattern

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?

Page 3: Command Pattern

• 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?

Beispiel Textverarbeitung

Page 4: Command Pattern

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.

Page 5: Command Pattern

Einfache Struktur

Die abstrakte Klasse Command definiert die Schnittstelle, über die der Invoker auf jede konkrete Befehlsklasse zugreifen kann.

Page 6: Command Pattern

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!

Page 7: Command Pattern

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.

Page 8: Command Pattern

Code Beispielabstract class Command { abstract public void execute(); }

class ConcreteCommand extends Command { public ConcreteCommand() { ... }

public void execute() { ... } }

Page 9: Command Pattern

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.