Behavioral Patterns Seminar Software-Entwurf WS 04/05 Przemyslaw Dul
Gliederung Design Pattern (Wiederholung) Einordnung Übersicht über die Kategorien: Creational,Structural,Behavioral Übersicht über die Behavioral Patterns Zwei Patterns im Detail Command, Chain Of Responsibility Aspekte: Kapselung der Variation Entkopplung von Sender und Empfänger 2
Design Patterns (Wiederholung) Lösungssammlung für Software-Design Probleme Geben Design-Erfahrungen an andere weiter Bessere Lehre Vermeiden/Verringern die Suche nach bereits vorhandenen Lösungen Steigerung der Effizienz Unterstützen die Kommunikation zwischen Entwicklern Leichtere Verständigung Dokumentieren Design-Entscheidungen Bessere Wartbarkeit 3
Einordnung Creational Structural Behavioral Design Patterns UML OO Analyse & Design OOP Software-Entwurf 4
Übersicht Creational Patterns erzeugen Objekte. Entscheiden flexibel welche Objekte für welchen Fall erzeugt werden sollen. Structural Patterns helfen bei der Gruppierung von Objekten in Strukturen, wie z.b. komplexe User Interfaces. Behavioral Patterns stellen die Kommunikation zwischen Objekten her und helfen bei der Steuerung des Ablaufs der Kommunikation. 5
Übersicht Creational Structural Behavioral Abstract Factory Adapter Chain of Responsibility Builder Bridge Command Factory Composite Interpreter Prototype Decorator Iterator Singleton Facade Mediator Flyweight Memento Proxy Observer State Strategy Template Visitor 6
Chain of Responisibility Entkoppelt den Sender einer Nachricht von seinem Empfänger, Indem die Empfänger verkettet werden Und die Anfrage entlang der Kette geleitet wird Bis ein Empfänger die Anfrage erledigt. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 7
Command Kapselt einen Befehl als ein Objekt. Trennt die Ausführung eines Befehls von der Umgebung, die ihn erzeugt. Befehle können als Parameter übergeben werden. Befehle können in eine Queue oder in einen Stack gestellt werden Um z.b. Operationen rückgängig zu machen. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 8
Interpreter Definiert eine Repräsentation einer Grammatik zu einer Sprache Sowie einen Interpreter, um die Sätze in dieser Sprache zu interpretieren. Z.B. für reguläre Ausdrücke, kleine Grammatiken. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 9
Iterator Ermöglicht den sequentiellen Zugriff auf die Elemente eines zusammengesetzten Objektes. Die zugrundeliegende Repräsentation wird nicht offengelegt. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 10
Mediator Fördert die lose Kopplung von miteinander kommunizierenden Objekten, Indem eine Klasse das Zusammenspiel einer Menge von Objekten kapselt. Die Objekte müssen also nicht aufeinander explizit Bezug nehmen. Ermöglicht das Zusammenspiel unabhängig von diesen Objekten zu variieren. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 11
Memento Erfasst und externalisiert (für Speicherung) den internen Zustand eines Objekts. Seine Kapselung wird dabei nicht aufgegeben. Objekt kann später in diesen Zustand zurückversetzt werden. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 12
Observer Ändert sich der Zustand eines Objektes, so werden alle seine Beobachter darüber informiert. Nützlich bei 1-zu-N Abhängigkeitsbeziehungen. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 13
State Ein Objekt ändert sein Verhalten, wenn sein interner Zustand sich ändert. Nützlich wenn das Verhalten von mehreren Methoden vom aktuellen Zustand abhängt, Und flexibel weitere Zustände hinzugefügt werden sollen. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 14
Strategy Kapselt einen Algorithmus in eine Klasse. Macht Algorithmen austauschbar. Nützlich bei Familien von Algorithmen. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 15
Template In einer abstrakten Klasse wird das Skelett eines Algorithmus definiert. Einzelne Schritte werden an Unterklassen delegiert. Unterklassen können bestimmte Schritte gestalten, Ohne die Struktur des Algorithmus zu verändern. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 16
Visitor Kapselt Operationen auf Elementen einer Objektstruktur (z.b. Baum) als Objekt. Es lassen sich einfach neue Operationen definieren, Ohne die Klassen der zu bearbeitenden Elemente zu verändern. Behavioral Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Visitor 17
Schema von Patterns Pattern Motivation / Kontext Behavioral Chain of Responsibility Command Struktur Anwendbarkeit Konsequenzen / Auswirkungen Beispiel / Implementierung 18
Command Pattern - Motivation Kapselung eines Befehls für GUI-Elemente (Menüs, Buttons, Toolbars usw.) als Objekt. GUI-Elemente brauchen nicht zu wissen, was der Befehl tut. Befehls-Objekte können herumgereicht und gespeichert werden. 19
Command Pattern - Struktur Client Caller Command {abstract} execute() : void {abstract} Receiver receiver ConcreteCommand action() : void execute() : void receiver.action(); 20
Command Pattern - Anwendbarkeit Um Objekte mit einer auszuführenden Aktion zu parametrisieren. Um Aktionen zu unterschiedlichen Zeitpunkten spezifizieren, aufreihen und ausführen zu lassen. Um Undo zu unterstützen, indem das Command-Objekt alle relevanten Informationen für Umkehr speichert. Protokollierung von Änderungen, Speichern und Laden. Transaktionen (Menge von Datenänderungen) modellieren. 21
Command Pattern - Konsequenzen Entkopplung des Auslösers eines Befehls vom Umsetzer. Befehlsobjekte können verändert und erweitert werden. Befehlsobjekte können zu eine Befehlsobjekt zusammengeführt werden. (Composite-Pattern) Einfaches Hinzuzufügen von neuen Befehlen, da keine existierenden Klassen geändert werden müssen. 22
Command Pattern - Beispielimplementierung public class Client extends JFrame { public Client(){ HideAction hideaction = new HideAction(); JButton button = new JButton(hideAction); add(button); } } public class HideAction extends AbstractAction { public void actionperformed(actionevent e) { setvisible(false); } } client hideaction button new HideAction() new JButton(hideAction) setvisible(false) actionperformed(...) 23
Chain of Responsibility - Motivation Implementierung eines kontextsensitiven Hilfesystems für eine GUI. User erhält Hilfe für den ausgewählten Teil. Button liefert in einem Dialog andere Hilfe, als ähnlicher Button im Hauptfenster. Falls keine spezifische Hilfe, eine allgemeine Hilfe angezeigen. 24
Chain of Responsibility - Struktur Client Handler - nexthandler: Handler {abstract} +* handlerequest() : void {abstract} ConcreteHandler + handlerequest() : void ConcreteHandlerB + handlerequest() : void 25
Chain of Responsibility - Anwendbarkeit Wenn mehr als ein Objekt eine Anfrage bearbeiten können soll und a priori nicht feststeht welches. Wenn eine Anfrage an einen von mehreren Empfängern gerichtet wird, ohne den Empfänger explizit anzugeben. Wenn die Menge der Empfänger und die Wahl des Empfängers dynamisch sein sollen. 26
Chain of Responsibility - Konsequenzen Reduktion der Kopplung zwischen Sender und Empfänger nur noch Referenz auf den Nachfolger, statt auf alle mgl. Empfänger. Mehr Flexibilität bei der Zuweisung von Zuständigkeiten durch Änderung der Kette zur Laufzeit. Aber keine Abarbeitungs-Garantie da kein expliziter Empfänger vorhanden, oder wenn die Kette nicht richtig konfiguriert ist. 27
Chain of Responsibility - Implementierung HelpHandler - hhandler: HelpHandler +* handlehelp() : void handler.handlehelp() Application Widget Dialog Button + handlehelp() : void + showhelp() : void if(can handle){ showhelp(); } else { super.handlehelp(); } 28
Kapselung der Variation Strategy kapselt einen Algorithmus. State kapselt zustandsabhängiges Verhalten. Mediator kapselt das Protokoll zw. Objekten. Iterator kapselt die Art des Zugriffs und die Traversierung von Elementen eines Objektes. 29
Entkopplung von Sender und Empfänger Command: Durch definition der Sender-Empfängerbeziehung in einem separaten Objekt, kann Sender mit verschiedenen Empfängern zusammenarbeiten. Chain Of Responsibility: Durch Weiterleitung einer Anfrage entlang der Kette von mgl. Empfängern. Mediator: Durch indirekte Interaktion durch das Mediator Objekt. Observer: Durch definition einer Schnittstelle zur Signalisierung von Änderungen. 30
Das Beste zuletzt! Bis auf wenige Ausnahmen ergänzen sich Behavioral Patterns. Chain of Resposibility kann das Command Pattern verwenden, um Anfragen als Objekte zu repräsentieren. Behavioral Patterns arbeiten gut mit anderen Patterns zusammen. Das Composite-Pattern kann das Visitor-Pattern verwenden, um Operationen auf den Komponenten in der Komposition anzuwenden. 31