command pattern

Post on 04-Jan-2016

41 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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?

• 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

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 Beispielabstract 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.

top related