Vorlesung Softwaretechnologie 2007/8 Dr. Günter Kniesel ROOTS Kapitel 6 Entwurfsmuster (Design Patterns) Stand: 27.11.2007 © 2000-2007 Dr. Günter Kniesel Einführung: Die Grundidee von Pattern z Pattern (Muster) wurden zuerst im Bereich der Architektur beschrieben. z Grundlegende Idee: Alle Ingenieurdisziplinen benötigen eine Terminologie ihrer wesentlichen Konzepte sowie eine Sprache, die diese Konzepte in Beziehung zueinander setzt. z Ziele von Pattern in der Welt der Software: Dokumentation von Lösungen wiederkehrender Probleme Probleme, um Programmierer bei der Softwareentwicklung zu unterstützen. Schaffung einer gemeinsamen Sprache, um über Probleme und ihre Lö Lösungen zu sprechen. h Bereitstellung eines standardisierten Katalogisierungsschemas um erfolgreiche Lösungen aufzuzeichnen. z Bei Pattern handelt es sich weniger um eine Technologie (wie z.B. bei UML), als um eine Kultur der Dokumentation und Unterstützung guter UML) Softwarearchitektur. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-2 ROOTS Einführung: Literatur zu Pattern und Software z Erich Gamma Gamma, Richard Helm Helm, Ralph Johnson Johnson, John Vlissides (Gang of Four): "Design Patterns - Elements of Reusable Object-Oriented Software" Addison-Wesley, 1995 z Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal (Gang of Five): "Pattern-Oriented Software Architecture - A System of Patterns" John Wiley & Sons, 1996 z Serge Demeyer, Stephane Ducasse, Oscar Nierstrasz: "Object Oriented Reengineering Patterns", Morgan Kaufman, 2002 z Patterns im WWW Patterns Home Page: g http://www.hillside.net/ p Portland Pattern Repository: http://c2.com/ppr/index.html Brad Appleton: "Patterns and Software: Essential Concepts and Terminology„ http://www.bradapp.net/docs/patterns-intro.html p pp p Doug Lea, Patterns-Discussion FAQ, http://gee.oswego.edu/dl/pd-FAQ/pd-FAQ.html Buchliste: http://c2.com/cgi/wiki?PatternRelatedBookList Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-3 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel a = 50% b = 30% c = 20% - X Model - X a = 50% b = 30% c = 20% View + Controller Vorlesung Softwaretechnologie, Wintersemester 2007/8 View + Controller 06-4 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel a = 50% b = 30% c = 20% Änderungen am Modell werden propagiert - - X Views melden sich an Vorlesung Softwaretechnologie, Wintersemester 2007/8 X a = 50% b = 30% c = 20% 06-5 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel a = 50% b = 30% c = 20% - X - X - X a = 50% b = 30% c = 20% • mehrere Views sind gleichzeitig möglich • neue Views können ohne Änderung des Modells hinzugefügt werden Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-6 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel a = 50% b = 30% c = 20% z Propagierung von Änderungen: Observer Pattern kommt z.B. auch bei Client/Server-Programmierung zur Benachrichtigung der Clients zum Einsatz z Geschachtelte Views: Composite Pattern View enthält weitere Views, wird aber wie ein einziger View behandelt behandelt. kommt z.B. auch bei Parsebäumen im Compilerbau zum Einsatz (Ausdrücke). - - X X z Reaktion auf Events im Controller: Strategy Pattern Eingabedaten können validiert werden (Daten, Zahlen, etc.). Controller können zur Laufzeit gewechselt werden. kommt z.B. auch bei der Codeerzeugung im Compilerbau zum Einsatz (Code für verschiedene CPUs). Vorlesung Softwaretechnologie, Wintersemester 2007/8 - 06-7 X ROOTS Überblick z Einführung Grundidee, Literatur, MVC-Framework als Beispiel z Beispiele wichtiger Patterns Observer, Strategy, Command Facade, Singleton, Proxy, Adapter, Bridge Factory Method, Abstract Factory Composite, Visitor z Patterns Create Architectures Bridge, Abstract Factory, Singleton z Nutzen von Patterns z Zusammenfassung und Ausblick Arten von Patterns, Abgrenzung Weiterführende Themen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-8 ROOTS Das Observer Pattern: Einführung z Absicht Stellt eine 1-zu-n Beziehung zwischen Objekten her Wenn das eine Objekt seinen Zustand ändert, werden die davon abhängigen Objekte benachrichtigt und entsprechend aktualisiert z Andere Namen "Dependents", "Publish-Subscribe", "Listener" z Motivation Verschiedene Objekte sollen zueinander konsistent gehalten werden Andererseits sollen sie dennoch nicht eng miteinander gekoppelt sein. (bessere Wiederverwendbarkeit) Diese Ziele stehen in einem gewissen Konflikt zueinander. Man spricht von g forces“, also g gegenläufig g g wirkenden Kräften. „conflicting Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-9 ROOTS Das Observer Pattern: Beispiel z Trennung von Daten und Darstellung Wenn in einer Sicht Änderungen vorgenommen werden, werden alle anderen Sichten aktualisiert – Sichten sind aber unabhängig voneinander. a = 50% b = 30% c = 20% - X - X - X a = 50% b = 30% c = 20% Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-10 ROOTS Das Observer Pattern: Anwendbarkeit Das Pattern ist im folgenden Kontext anwendbar: z Abhängigkeiten Ein Aspekt einer Abstraktion ist abhängig von einem anderen Aspekt. Aufteilung dieser Aspekte in verschiedene Objekte erhöht Variationsmöglichkeit und Wiederverwendbarkeit. z Folgeänderungen Änderungen an einem Objekt erfordert Änderungen an anderen Objekten. Es E ist i t nicht i ht b bekannt, k t wieviele i i l Obj Objekte kt geändert ä d t werden d müssen. ü pp g z Lose Kopplung Objekte sollen andere Objekte benachrichtigen können, ohne Annahmen über die Beschaffenheit dieser Objekte machen zu müssen. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-11 ROOTS Das Observer Pattern: Struktur Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-12 ROOTS Rollenaufteilung / Verantwortlichkeiten z Observer („Beobachter“ auch: Subscriber, Listener) update (auch: handleEvent) Ö Reaktion auf Zustandsänderung des Subjects z Subject („Subjekt“ auch: Publisher) attach(auch: register, register addListener) Ö Observer registrieren detach (auch: unregister, removeListener) Ö registrierte Observer entfernen notify Ö update-Methoden p aller registrierten g Observer aufrufen setState Ö zustandsändernde Operation(en) Ö für beliebige Clients getState Ö abfrage bf des d aktuellen kt ll Z Zustands t d Ö damit Observer feststellen können was sich genau geändert hat Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-13 ROOTS Das Observer Pattern: Zusammenarbeit der Objekte Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-14 ROOTS Das Observer Pattern: Konsequenzen z Unabhängigkeit „Subjekte“ und „Beobachter“ können unabhängig voneinander variiert werden. „Beobachter“ können hinzugefügt werden, ohne „Subjekte“ oder andere „Beobachter Beobachter“ zu ändern ändern. „Subjekte“ können ohne „Beobachter“ wiederverwendet werden. Umgekehrt ebenfalls. z „Broadcast“-Nachrichten Subjekt benachrichtigt alle angemeldeten Beobachter Beobachter B b ht entscheiden, t h id ob b sie i N Nachrichten h i ht b behandeln h d l oder d iignorieren i z Abstrakte Kopplung Subjekte aus tieferen Schichten eines Systems können mit Beobachtern aus höheren Schichten kommunizieren, ohne die Schichten zu verletzen. z Unerwartete Aktualisierungen Kleine Zustandsänderungen des Subjekts können komplexe Folgen haben. Auch uninteressante Zwischenzustände können unnötige Aktualisierungen auslösen. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-15 ROOTS Das Observer Patterns: Implementierung z Speicherung der Beziehung zwischen Subjekt und Beobachter Instanzvariable im Subjekt oder ... globale (Hash-)Tabelle (Hash )Tabelle z Beobachtung mehrer Subjekte Die graphische Darstellung einer Tabelle könnte mehrere Subjekte beobachten. Dann muss die „update()“-Methode einen zusätzlichen Parameter haben, der das Subjekt angibt. z Wer ruft "notify()" auf? a)) "setState()"-Methode " tSt t ()" M th d d des S Subjekts: bj kt Ö + Klienten können Aufruf von "notify()" nicht vergessen. Ö – Aufeinanderfolgende Aufrufe von "setState()" führen zu überflüssigen Aktualisierungen. b) Klienten: Ö + Mehrere Änderungen können akkumuliert werden. Ö – Klienten vergessen möglicherweise Aufruf von "notify()". Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-16 ROOTS Implementierung des Observer Patterns z Konsistenz Zustand eines Subjekts muss vor Aufruf von "notify()" konsistent sein. Vorsicht bei Vererbung bei Aufruf jeglicher geerbert Methoden die möglicherweise „notify()“ -aufrufen : public class MySubject extends Subject { public void doSomething(State newState) { super.doSomething(newState); d S thi ( St t ) // ruft ft " "notify()" tif ()" auf f this.modifyMyState(newState); // zu spät! } } Dokumentation von „„notify()“-Aufrufen y() erforderlich Besser: In Oberklsse „Template-Method Pattern“ anwenden um sicherzustellen, dass „notify()“-Aufrufe immer am Schluß einer Methode stattfinden stattfinden. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-17 ROOTS Das Observer Patterns: Implementierung z Wie werden die Informationen über eine Änderung weitergegeben: „push“ h“ vs. „pull“ ll“ p push: Subjekt j übergibt g in „update()“ p () detaillierte Informationen über Änderungen. g Ö + Berechnungen werden seltener durchgeführt. Ö – Beobachter sind weniger wiederverwendbar pull: Subjekt übergibt in „update()“ keinerlei Informationen, aber die Beobachter müssen sich die Informationen vom Subjekt holen Ö + Geringere Kopplung zwischen Subjekt und Beobachter. Ö – Berechnungen werden häufiger durchgeführt. Zwischenformen sind möglich Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-18 ROOTS Das Observer Patterns: Implementierung Fortgeschrittene Techniken z Differenzierung von Ereignissen Beobachter-Registrierung nur für spezielle Ereignisse weniger "Rückfragen" / höhere Effizienz z ChangeManager verwaltet lt t Beziehungen B i h zwischen i h S Subjekt bj kt und dB Beobachter. b ht (Speicherung in Subjekt und Beobachter kann entfallen.) definiert die Aktualisierungsstrategie benachrichtigt alle Beobachter verzögerte Benachrichtigung möglich Ö Insbesondere wenn mehrere Subjekte verändert werden müssen müssen, bevor die Aktualisierungen der Beobachter Sinn macht Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-19 ROOTS Das Observer Patterns: Bekannte Anwendungen z Bekannte Anwendungen Model-View-Controller-Framework in Smalltalk Java Foundation Classes / Swing Oberon System Diverse Client/Server Client/Server-Modelle, Modelle zz.B. B Java RMI Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-20 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel a = 50% b = 30% c = 20% z Propagierung von Änderungen: Observer Pattern kommt z.B. auch bei Client/Server-Programmierung zur Benachrichtigung der Clients zum Einsatz z Geschachtelte Views: Composite Pattern View enthält weitere Views, wird aber wie ein einziger View behandelt behandelt. kommt z.B. auch bei Parsebäumen im Compilerbau zum Einsatz (Ausdrücke). - - X X z Reaktion auf Events im Controller: Strategy Pattern Eingabedaten können validiert werden (Daten, Zahlen, etc.). Controller können zur Laufzeit gewechselt werden. kommt z.B. auch bei der Codeerzeugung im Compilerbau zum Einsatz (Code für verschiedene CPUs). Vorlesung Softwaretechnologie, Wintersemester 2007/8 - 06-21 X ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Let's play patterns! Aufgabe z IntegerBag Menge von integers z IntegerAdder Addiert alles was sich im Bag befindet und gibt Ergebnis aus z IntegerPrinter I t Pi t Gibt den kompletten Inhalt eines IntegerBag aus Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-23 ROOTS Mögliche Lösung z Siehe http://www.javaworld.com/javaworld/javaqa/2001-05/04-qa- 0525-observer.html Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-24 ROOTS Das Strategy Pattern: Einführung z Absicht Kapselung einer Familie von Algorithmen mit der Möglichkeit, sie beliebig auszutauschen. z Motivation Berechnung von Zeilenumbrüchen Ö mehrere Algorithmen können eingesetzt werden Ö neue Varianten sollen später hinzugefügt werden können z S Struktur (f (für obiges Beispiel)) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-25 ROOTS Das Strategy Pattern: Anwendbarkeit und Struktur z Anwendbar in folgendem Kontext Einige ähnliche Klassen unterscheiden sich nur in gewissen Aspekten des Verhaltens. Diese können in ein Strategie-Objekt g j ausgelagert g g werden. Verhalten ist abhängig von äußeren Randbedingungen Verschiedene Varianten eines Algorithmus werden benötigt Ö z.B. B mitit unterschiedlicher t hi dli h Z Zeit-/Platzkomplexität. it /Pl t k l ität Kapselung von Daten eines komplexen Algorithmus z Struktur (allgemein) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-26 ROOTS Das Strategy Pattern: Implementierung z Alternative Schnittstellen zwischen Kontext und Strategien 1. Kontext übergibt alle relevanten Daten an die Strategie-Methode 2. Kontext übergibt this an Strategie-Methode Æ flexibelste Lösung 3. Strategie-Objekt speichert bei Initialisierung feste Referenz auf Kontext z Implementierung von Default-Verhalten möglich In der Kontext-Klasse wird ein Default-Verhalten verwendet, wenn kein Strategie-Objekt gesetzt ist. (Context) (T1,...,Tn) default (Context) (T1,...,Tn) Vorlesung Softwaretechnologie, Wintersemester 2007/8 (Context) (T1,...,Tn) (Context) (T1,...,Tn) 06-27 ROOTS Implementierung: Fallunterscheidung in Kontext ContextInterface() { if ( (strategy == null) ll) ... default ... else strategy.AlgorithmInterface(); } ... z Vorteile ??? z Nachteile Uneinheitliche Lösung: Kontext muss Default-Strategie kennen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-28 ROOTS Implementierung: „Default-Strategie“-Klasse ContextInterface() { ... strategy.AlgorithmInterface(); ... } ... Dies Variante ist als das Dies ist eine Anwendung "Null Pattern" des "Null Object Pattern" bekannt. AlgorithmInterface() { ... default d f lt ... } z Idee jede Zuweisung "Strategy s = null;" ersetzen durch "Strategy s = new DefaultStrategy();" Abfragen auf null und entsprechende Fallunterscheidungen löschen z Vorteile einheitliche Lösung, klare Trennung von Kontext und Strategien lesbarerer Code Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-29 ROOTS Das Strategy Pattern: Konsequenzen z Konzeptuell Familie von zusammengehörigen Algorithmen Auswahl verschiedener Implementierungen desselben Verhaltens dynamische Alternative zu Unterklassenbeziehung Polymorphismus statt Fallunterscheidungen (if (if-then-else, then else switch switch-case) case) leichtere Erweiterbarkeit z Konsequenzen aus Implementierung Kontext übergibt evtl. Parameter, die nicht jedes Strategie-Objekt benötigt Ö this thi zu übergeben üb b iistt allgemeiner ll i Zusätzliche Nachrichten zwischen Kontext und Strategie Erhöhte Anzahl an Objekten Ö Möglicherweise können aber Strategie-Objekte gemeinsam verwendet werden Ö Flyweight-Pattern Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-30 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s Zwischenfazit: Was also sind Patterns? ROOTS Definition: Was ist jetzt also ein Pattern? z Definitionsvorschlag "A pattern is the abstraction from a concrete form which keeps recurring in specific non-arbitrary non arbitrary contexts. contexts." Dirk Riehle, Heinz Züllighoven: "Understanding and Using Patterns in Software Development", TAPOS 2, 1 (1996). ( ) z Definitionsvorschlag "Each pattern is a three-part rule, which expresses p a relation between a certain context,, a certain system of forces which occurs repeatedly in that context, and a certain software configuration which allows these forces to resolve themselves " themselves. Richard Gabriel, on the Patterns Home Page Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-32 ROOTS Aber nicht... "A pattern is a solution to a problem in a context." anonym ;-) Gegenbeispiel z Problem: Wie werden Objekte im Speicher alloziert? z Kontext: K t t Ein Ei großes ß OO OO-System S t in i einem i R Rechner h mit it virtuellem i t ll Speicher. z Lösung: g Führe einige g typische yp Anwendungen g durch und stelle fest,, welche Objekte häufig miteinander kommunizieren. Plaziere diese Objekte auf derselben Seite im virtuellen Speicher. Begründung z Das ist kein Pattern - es ist "nur" eine Lösung für ein Problem in einem Kontext. z Damit es zu einem Pattern werden kann, muss ein Lösungsprinzip abstrahiert werden, werden das auch für andere wiederkehrende Probleme in ähnlichen Kontexten eingesetzt werden kann. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-33 ROOTS Bestandteile eines Patterns: Kontext, Problem, Forces z Kontext Die Vorbedingungen unter denen das Pattern benötigt wird. (Æ Anwendbarkeit des Pattern) z Problem Beschreibung des Problems oder der Absicht des Patterns Ziel und gewünschte Eigenschaften die in einem bestimmten Kontext mit bestimmten Randbedingungen/Kräften erreicht werden sollen. Die Kräfte und die Ziele scheinen sich zu widersprechen. z Randbedingung / Kräfte (Forces) Die relevanten Randbedingungen und Einschränkungen, die berücksichtigt werden müssen. Wie Wi diese di miteinander it i d iinteragieren t i und d iim K Konflikt flikt stehen. t h Die daraus entstehenden Kosten. Typischerweise durch ein motivierendes Szenario illustriert. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-34 ROOTS Bestandteile eines Patterns: Lösung z Die Lösung wird beschrieben durch die Teilnehmer, ihre Rollen, ihre statischen Beziehungen g und dynamische y Zusammenarbeit z Teilnehmer Die Typen (Interfaces und Klassen) die in der Lösung eine Rolle spielen. z Rollen Alle Namen in der Beschreibung eines Patterns bezeichnen nur die Rollen der entsprechenden p Interfaces,, Klassen,, Methoden,, Felder,, Assotiationen. Sie werden bei der Implementierung durch zur Anwendung und Rolle passende Namen ersetzt Beispiel: Rolle z Statische Beziehungen und dynamische Zusammenarbeit Klassendiagramm, dynamisches Diagramm, Text Meistens ist das Verständnis des dynamischen Verhaltens entscheidend Denken in Objekten (Instanzen) statt Klassen (Typen)! Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-35 ROOTS Übersicht aller Bestandteile eines Patterns z Name des Patterns z Problem, das vom Pattern g gelöst wird z Kontext, in dem das Pattern angewendet werden kann z Randbedingungen/Kräfte (forces), die das Pattern beeinflussen z Lösung. Beschreibung, wie das gewünschte Ergebnis erzielt wird z Beispiele der Anwendung des Patterns z Resultierender R lti d K Kontext t t aus der d A Anwendung d d des P Patterns tt z Erläuterung (rationale), warum das Pattern funktioniert z Bezug zu anderen Patterns z Bekannte Verwendungen des Patterns z optional: Zusammenfassung g ((auch: "pattern thumbnail")) (Es wurden auch andere Schemata für die Beschreibung von Pattern definiert definiert. Dieses hier ist recht ausführlich ausführlich.)) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-36 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Wichtige Design Patterns "Gang of Four"-Patterns: Überblick und Klassifikation Verhalten Struktur z Visitor z Composite z Observer z Flyweight y g z Command z Template Method Bisher z Chain Ch i off R Responsibility ibilit z Decorator z State z Proxy y z Strategy z Adapter z Multiple Vererbung z Bridge Jetzt z Facade F d Split Objects z Factory z Prototype z Factory Method z Singleton z Builder Vorlesung Softwaretechnologie, Wintersemester 2007/8 Objekt-Erzeugung 06-38 ROOTS Erläuterung zur Klassifikation z Verhaltens-Patterns Verhalten leicht erweiterbar, komponierbar, dynamisch änderbar oder explizit manipulierbar machen z Struktur-Patterns Objekte mit fehlendem Zustand Zustand, rekursive Strukturen Verschiedenste Formen der Entkopplung (Schnittstelle / Implementierung, Identität / physikalische Speicherung, ...) z Split Object Patterns Ziel: Dynamisch änderbares Verhalten, gemeinsame Verwendung oder pp g von Teilobjekten j Entkopplung Weg: Aufteilung eines konzeptionellen Gesamtobjektes in modellierte Teilobjekte die kooperieren um das Verhalten des konzeptionellen Gesamtobjektes zu realisieren z Erzeugungs-Patterns Flexibilität indem die Festlegung von konkret zu erzeugenden Objekte ( (new XYZ()) so weitit wie i möglich ö li h verzögert ö t wird i d und d evtl. tl sogar zur Laufzeit L f it immer noch verändert werden kann. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-39 ROOTS Selbsttest Ordnen Sie beim Nacharbeiten die auf der vorherigen Folie genannten Ziele den Ihnen dann bekannten Patterns zu! Diskutieren Sie ihre Einschätzung mit Ihren Kollegen! Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-40 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Facade Pattern Facade Pattern z Absicht Menge von Interfaces eines Subsystems zusammenfassen Abhängigkeiten der Clients von der Struktur des Subsystems reduzieren client classes client classes Facade subsystem y classes subsystem y classes z Motivation / Beispiel Compiler mit Subsystemen Ö Scanner Ö ... Ö CodeGenerator Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-42 ROOTS Facade Pattern: Beispiel Compiler compiler subsystem classes compile() Stream BytecodeStream CodeGenerator StackMachineCodeGen. Vorlesung Softwaretechnologie, Wintersemester 2007/8 Scanner Token Parser Symbol ProgramNodeBuilder StatementNode ProgramNode ExpressionNode VariableNode RISCCodeGenerator 06-43 ROOTS Facade Pattern: Anwendbarkeit z einfaches Interface zu einem komplexen Subsystem einfache Dinge einfach realisierbar (aus Client-Sicht) anspruchsvolle Clients dürfen auch "hinter die Facade schauen" Ö zB für seltene, komplexe Anpassungen des Standardverhaltens z viele Abhängigkeiten zwischen Klassen reduzieren durch Facade-Objekte z hierarchische Strukturierung eines System eine i F Facade d als l Ei Einstiegspunkt ti kt iin jjede d Eb Ebene Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-44 ROOTS Facade Pattern z Implementierung: Konfigurierbarkeit einer Facade eigene Facade-Subklasse pro Konfiguration oder andere Subsystem-Objekte instantiieren z Abgrenzung: Singleton Facaden sind meist Singletons g ((man braucht nur eine einzige) g ) z Abgrenzung: Abstract Factory zur Erzeugung konsistenter Sätze von Subsystem-Objekten als Alternative zu Facade Æ "Verstecken" plattform-spezifischer Klassen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-45 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Singleton Pattern Singleton: Motivation z Beschränkung der Anzahl von Exemplaren zu einer Klasse z Meist: nur ein einzelnes Exemplar Z.B. Facade, Repository, System, Factory (vgl. Abstract Factory) z Aber auch: festen Menge von Exemplaren Motivation 1: begrenzte Ressourcen Ressourcen. Motivation 2: Teure Objekterzeugung durch „Object Pool“ vermeiden Æ z.B. 1000 Enterprise Java Beans vorhalten, nach Nutzung zurück in den Pool Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-47 ROOTS Singleton: Struktur + Implementierung Besitzt keinen öffentlichen Konstruktor: Singleton getInstance() instanceOperation() private Singleton() { this.Singleton(arg1, ..., argN); } private Singleton(...) { Liefert eine Instanz (typischerweise immer die ... Selbe): } -instancePool -instanceData i t D t Speichert die einzige Instanz oder begrenzte Menge an Instanzen public static Singleton getInstance() { if ( (instancePool == null) ) instancePool = new Singleton(); return instancePool; } z Kein öffentlicher Konstruktor dadurch wird verhindert, dass Clients beliebig g viele Instanzen erzeugen g können in Java muss explizit ein nicht-öffentlicher Konstruktor mit leerer Argumentliste g implementiert p werden,, damit kein impliziter p öffentlicher Konstruktor vom Compiler erzeugt wird z instancePool als Registry für alle Singleton-Instanzen lookup-Mechanismus l k M h i erforderlich f d li h um gezielt i lt eine i IInstanz t auszuwählen ähl Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-48 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Adapter Pattern Adapter Pattern (auch: Wrapper) z Absicht Schnittstelle existierender Klasse an Bedarf existierender Clients anpassen z Motivation Graphik-Editor bearbeitet Shapes Ö Linien, Li i R Rechtecke, ht k ... Ö durch "BoundingBox" beschrieben Textelemente sollen auch möglich sein Ö Klasse TextView vorhanden Ö bietet keine "BoundingBox"-Operation Integration g ohne Ö Änderung der gesamten Shape-Hierarchie und ihrer Clients Ö Änderung der TextView-Klasse z Idee Adapter-Klasse stellt Shape-Interface zur Verfügung ... implementiert Shape-Interface anhand der verfügbaren TextViewMethoden Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-50 ROOTS Adapter Pattern: Beispiel Existierende Klassen DrawingEditor * Shape Adapter-Klasse BoundingBox() CreateManipulator() Line TextShape BoundingBox() CreateManipulator() BoundingBox() CreateManipulator() text TextView getExtent() ... return text.getExtent() return new TextManipulator() Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-51 ROOTS Adapter Pattern (Objekt-Adapter): Schema adaptee Client Target Adaptee request() q () other() f() f() Adaptee_N … Adapter … request() f() adaptee.other() :Client :Adapter :Adaptee_N request() other() f() Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-52 ROOTS Adapter Pattern (Objekt-Adapter): Konsequenzen adaptee Client Target Adaptee request() q () other() f() f() Adaptee_N … Adapter … request() f() adaptee.other() z Adaptiert eine ganze Klassenhierarchie Beliebige B li bi Ad Adapter-Subtypen t S bt kö können mit it b beliebigen li bi Ad t S bt Adaptee-Subtypen kombiniert werden (Æ siehe Objektdiagram auf vorheriger Folie) Kombination wird erst zur Laufzeit, auf Objektebene, festgelegt z Overriding nicht möglich Die f()-Definition aus Adapter wird nicht anstelle der f()-Definition aus Adaptee für den f()-Aufruf f() Aufruf aus der Methode other() verwendet (Æ siehe Objektdiagram auf vorheriger Folie) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-53 ROOTS Adapter Pattern (Object Adapter): Variante adaptee Client Target Adaptee request() q () other() f() f() … Adaptee_N … …‘‘ Ad t Adaptee_N‘ N‘ …‘‘ f() f() f() Adapter request() f() z Object Adapter mit Overriding zu Adapteee und jede Unterklasse des Adaptees eine weitere Unterklasse einfügen, i fü iin di die d das redefinierte d fi i t Verhalten V h lt eingefügt i fü t wird i d ((also l z.B. B f()) Ö Warum neue Unterklassen? Weil die Adaptee-Hierarchie nicht veränderbar ist! Problem: Redundanz! Ö Was konzeptionell nur ein mal in Adapter stehen sollte wird in jeder neuen Unterklasse von Adaptee redundant eingefügt Æ Wartungsprobleme! Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-54 ROOTS Class Adapter Idiom: Schema „Vererbung ohne Subtyping“: Erbender erbt Methoden die nicht als Teil seines Interface sichtbar werden. Î "private inheritance" in C++ Î "closed inheritance" in Eiffel Client Target Adaptee request() () other() th () f() f() Adaptee_N … <<implementation inheritance>> Adapter request() f() … anAdaptedAdaptee:Adapter p p p :Client request() other() f() Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-55 ROOTS Class Adapter Idiom: Konsequenzen Cli t Client T Target t Ad t Adaptee request() other() f() f() Adaptee N Adaptee_N … <<implementation inheritance>> Adapter request() f() :Client … anAdaptedAdaptee:Adapter z Overriding des Adaptee-Verhaltens Adaptee Verhaltens leicht möglich Da Adapter eine Unterklasse von Adaptee ist, funktioniert das Overriding von f() z Keine zusätzliche Indirektion nur ein Objekt statt zwei z Adaptiert nur eine Klasse nicht ihre Unterklassen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-56 ROOTS Adapter Pattern: Konsequenzen Client z Class Adapter adaptiert nur eine Klasse ... nicht ihre Unterklassen Overriding des Adaptee-Verhaltens leicht möglich keine zusätzliche Indirektion (nur ein Objekt) :Client Target request() Adapter request() Adaptee f() m() Adapt_N Adapt N f() m() :Adapter :Adaptee z Object j Adapter adaptiert eine ganze Klassenhierarchie Overriding schwieriger Ö redefiniertes d fi i t Verhalten V h lt iin spezifische ifi h U Unterklasse t kl d des Adaptees Ad t einfügen i fü Ö Adapter benutzt diese Unterklasse Ö Kombinierbarkeit mit anderen Unterklassen geht verloren z Object Adapter mit Delegation (roots.iai.uni-bonn.de/research/darwin) adaptiert eine ganze Klassenhierarchie Overriding des Adaptee-Verhaltens leicht möglich Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-57 ROOTS Class Adapter Idiom: Schema Client Target request() „Vererbung ohne Subtyping“: "private inheritance" in C++ oder "closed inheritance" in Eiffel Adaptee specificRequest() <<implementation inheritance>> Adapter req est() request() :Client Vorlesung Softwaretechnologie, Wintersemester 2007/8 specificRequest() anAdaptedAdaptee:Adapter 06-58 ROOTS Zweiweg-Adapter ("Two-way adapters") z Adapter soll auch das Adaptee-Interface erfüllen Beispiel: QOCA (constraint solving toolkit) und Unidraw (Graphischer editor) Explizite Variablen-Repräsentation in beiden Systemen Integration erfordert Zwei Zwei-Weg-Adapter Weg Adapter z Implementierung multiple Vererbung multiple lti l D Delegation l ti Einfach-Vererbung und einfach-Delegation (QOCA class hierarchy) (Unidraw class hierarchy) ConstraintVariable StateVariable ConstraintStateVariable Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-59 ROOTS Adapter Pattern: Konsequenzen (2) z Aufwand des Adapters einfache Namens-Anpassung Ö show() --> print() beliebiges anderes Interface Ö ganz andere Semantik Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-60 ROOTS Adapter Pattern: Anwendbarkeit z Nachträgliche Anpassung Schnittstelle einer existierenden Klasse anpassen Å Bisherige Adpater-Varianten z Vorausschauend Anpassungs-Möglichkeit einbauen Klasse Kl so entwerfen, t f dass d sie i von unbekannten b k t Clients Cli t b benutzt t t werden d kann, die andere Interfaces erwarten Æ „Pluggable Adapters“ Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-61 ROOTS Adapter Pattern: Pluggable Adapters z Motivation TreeDisplay soll beliebige Baumstrukturen darstellen Beispiel: Datei-Hierarchie, Vererbungs-Hierarchie z Idee Schnittstellen-Anpassbarkeit in TreeDisplay "einbauen" Minimales Interface identifizieren das TreeDisplay p y von den angezeigten g g Entities kennen muss Adaptierbarkeit dieses Interface an verschiedene Hierarchien vorsehen z Implementierungsvarianten Vererbung Simulierte Delegation Parametrisierung mit "Blöcken" Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-62 ROOTS a) Pluggable Adapter mit Vererbung und Abstrakten Operationen <<Client, Target>> TreeDisplay g getChildren ((Node)) createGraphicNode(Node) display() buildTree (Node n) z Anpassungs-Interface ist Teil des TreeDisplay Abstrakte Methoden z Adapter sind Unterklassen von TreeDisplay <<Adapter>> <<Adaptee>> FileSystemEntity DirectoryTreeDisplay getChildren (Node) createGraphicNode(Node) getChildren(n) for each child { addGraphicNode( createGraphicNode(child)) buildTree(child) } Vorlesung Softwaretechnologie, Wintersemester 2007/8 Was,, wenn ich die Art der Anzeige zur Laufzeit ändern will? ill? 06-63 ROOTS b) Pluggable Adapter mit „Delegate Objects“ <<Client>> delegate TreeDisplay <<Target>> TreeAccessorDelegate setDelegate(Delegate) g ( g ) display() buildTree (Node n) getChildren (TreeDisplay, (TreeDisplay Node) createGraphicNode(TreeDisplay, Node) <<Adapter>> backreference <<Adaptee>> FileSystemEntity DirectoryBrowser getChildren (TreeDisplay, Node) createGraphicNode(TreeDisplay, Node) createFile() deleteFile() z delegate.getChildren(this,n) delegate getChildren(this n) for each child { addGraphicNode( delegate.createGraphicNode(this,child)) buildTree(child) } Vorlesung Softwaretechnologie, Wintersemester 2007/8 Eigenes Anpassungs-Interface Abstrakte Methoden z z Adapter implementieren Interface Adapter muessen an TreeDisplay rückfragen können, um dessen Operationen zu nutzen 06-64 ROOTS c) Pluggable Adapter Idiom in Smalltalk und Java Smalltalk Pseudo-Java V l M d l ValueModel V l M d l ValueModel value: value setValue() getValue() adaptee PluggableAdaptor adaptee Objekt PluggableAdaptor getBlock setBlock getBlock setBlock value: value setValue(Oject val) getValue() Objekt GetBlock getValue(Obj) SetBlock setValue(Obj,Val) ^ ^getBlock l k value: l adaptee d Vorlesung Softwaretechnologie, Wintersemester 2007/8 return getBlock.getValue(adaptee) 06-65 ROOTS Blöcke in Smalltalk und Java z Smalltalk Blöcke sind Objekte die auf die Nachricht „value“ reagieren Ö Analog zu einem „Command“-Objekt das auf „run“ reagiert Blöcke können auf den Kontext zugreifen, in dem Sie definiert wurden! Ö können zz.B. B direkt auf Variablen des erzeugenden Kontexts zugreifen z Java Instanzen einer „Inner Class“ können auf den Kontext der sie erzeugenden „Outer Class“-Instanz zugreifen getBlock und setBlock als inner classes der anzupassenden Klasse Leider ist damit ist keine unvorhergesehene Adaptierung realisierbar (Änderungen der anzupassenden Klasse wären erforderlich). Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-66 ROOTS Adapter Pattern: Pluggable Adapter Implementierung z Vererbung manchmal zu starr z Simulierte Delegation flexibler, da Anpassungsstrategie austauschbar z Parametrisierung P ti i mit it "Blö "Blöcken" k " flexibelste Variante leider e de nur u S Smalltalk-Idiom a ta d o „Innere Klassen“ in Java haben nicht die Ausdruckskraft von SmalltalkBlöcken Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-67 ROOTS Adapter Pattern: Abgrenzung z Bridge gleiches Interface kontrolliert Zugriff "Implementierungs-Detail" z Decorator gleiches Interface zusätzliche / veränderte Funktion "konzeptionelle konzeptionelle Eigenschaft" Eigenschaft z Adapter verschiedenes Interface ähnlich Protection-Adapter Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-68 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Proxy Pattern Proxy Pattern (auch: Surogate, Smart Reference) z Absicht Stellvertreter für ein anderes Objekt bietet Kontrolle über Objekt-Erzeugung und -Zugriff z Motivation kostspielige Objekt-Erzeugung verzögern (zB: große Bilder) verzögerte g Objekterzeugung j g g soll Programmstruktur g nicht g global verändern z Idee Bild-Stellvertreter (Proxy) verwenden Bild-Stellvertreter verhält sich aus Client-Sicht wie Bild Bild Bild-Stellvertreter Stellvertreter erzeugt Bild bei Bedarf aTextDocument image Hauptspeicher Vorlesung Softwaretechnologie, Wintersemester 2007/8 anImageProxy file anImage Platte 06-70 ROOTS Proxy Pattern: Beispiel Graphic * DocumentEditor draw() getExtent() store() load() Image <<creates>> imageData g extent draw() getExtent() g store() load() ImageProxy fileName extent image Vorlesung Softwaretechnologie, Wintersemester 2007/8 draw() getExtent() g store() load() if (image == 0){ image = loadImage(filename); } image.draw() g () if (image == 0){ return extent; } else { return image.getExtent(); } 06-71 ROOTS Proxy Pattern: Schema Subject * Client request() ... RealSubject realSubject Proxy request() ... request() ... aRealSubject aProxy ← request() Vorlesung Softwaretechnologie, Wintersemester 2007/8 ... realSubject request(); realSubject.request(); ... q () ← request() aClient 06-72 ROOTS Proxy Pattern: Verantwortlichkeiten z Proxy bietet gleiches Interface wie "Subject" referenziert eine "RealSubject"-Instanz kontrolliert alle Aktionen auf dem "RealSubject" z Subject definiert das g gemeinsame Interface z RealSubject das Objekt das der Proxy vertritt eigentliche Funktionalität z Zusammenspiel selektives Forwarding Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-73 ROOTS Proxy Pattern: Anwendbarkeit z Virtueller Proxy verzögerte Erzeugung "teurer" Objekte bei Bedarf Beispiel: Bilder in Dokument, persistente Objekte y z Remote Proxy Zugriff auf entferntes Objekt Objekt-Migration Beispiele: B i i l CORBA CORBA, RMI RMI, mobile bil A Agenten t z Concurrency Proxy nur eine i di direkte kt R Referenz f auff R RealSubject lS bj t locking des RealSubjects vor Zugriff (threads) z Copy-on-Write C W it kopieren erhöht nur internen "CopyCounter" wirkliche Kopie bei Schreibzugriff und "CopyCounter">0 CopyCounter 0 Î Verzögerung teurer Kopier-Operationen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-74 ROOTS Proxy Pattern: Anwendbarkeit z Protection Proxy (Zugriffskontrolle) Schmaleres Interface Ö "Kritische" Operationen ausgeblendet Ö andere via Forwarding implementiert ganz anderes Interface Ö Autorisierung prüfen Ö direkten Zugriff gewähren oder Forwarding Beispiel: "CHOICES" Betriebssystem Betriebssystem, JDK Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-75 ROOTS Protection-Proxy im JDK (ab 1.2): GuardedObject z Problem Sichere Weitergabe eines schützenwerten Objektes an unbekannten Empfänger Objektspezifische j p Zugriffsrechte g Verzögerte Überprüfung der Zugriffsrechte z Idee: GuardedObject Enthält "bewachtes Objekt" und "Wächter" (Guard) Guard-Interface enthält nur die Methode checkGuard(Object) Referenz auf bewachtes Objekt wird nur dann herausgegeben herausgegeben, wenn checkGuard(Object)erfolgreich ist (sonst SecurityException) checkGuard(...) Requestor getObject() Guard GuardedObject bewachtes Obj kt Objekt z Verbleibendes Problem Man muß sich darauf verlassen verlassen, daß der "Requestor" Requestor das "bewachte bewachte Objekt" selbst nur in ein GuardedObject verpackt weitergibt! Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-76 ROOTS Proxy Pattern: Implementierung z „Consultation“ Allgemein: manuell erstellte Forwarding-Methoden C++: Operator-Overloading Ö Proxy redefiniert Dereferenzierungs-Operator:*anImage Ö Proxy redefiniert Member-Accesss-Operator:anImage->extent() Member Accesss Operator:anImage >extent() Smalltalk: Reflektion Ö Proxy redefiniert Methode "doesNotUnderstand: aMessage" Lava: L eigenes i S Sprachkonstrukt hk t kt Ö Proxy deklariert "consultee"-Variable class Proxy { private consultee RealImage realImage; ... } z Falls der Typ von "RealSubject RealSubject„ dem Proxy bekannt sein muß: Je eine spezifische Proxy-Klasse für jeden RealSubject-Typ y nicht bekannt sein muß: z ... dem Proxy Nur eine Proxy-Klasse für verschiedene RealSubject-Typen Ö Beispiel: „Guarded Object“ (vorherige Folie) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-77 ROOTS Proxy Pattern: Implementierung z Refenrenzierung des RealSubject vor Instantiierung Orts- und Zeit-unabhängige "Ersatz-Referenzen" Beispiele Ö Dateinamen Ö CORBA IOR (Interoperable Object Reference) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-78 ROOTS Proxy Pattern: Abgrenzung z Proxy gleiches Interface kontrolliert Zugriff "Implementierungs-Detail" z Decorator gleiches Interface zusätzliche / veränderte Funktion "konzeptionelle konzeptionelle Eigenschaft" Eigenschaft z Adapter verschiedenes Interface ähnlich Protection-Proxy Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-79 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Bridge Pattern Bridge Pattern (auch: Handle / Body) z Absicht Schnittstelle und Implementierung trennen ... unabhängig variieren z Motivation portable "Window"-Abstraktion in GUI-Toolkit mehrere Variations-Dimensionen Ö Fenster-Arten: – normal / als Icon, – schließbar / nicht schließbar, – ... Ö Implementierungen: – X-Windows, – IBM Presentation Manager Manager, – MacOS, – Windows XYZ, – ... Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-81 ROOTS Bridge Pattern: Warum nicht einfach Vererbung einsetzen? Neue Fenster-Art: "iconifizierbare" Fenster Window XWindow PMWindow Window XWindow PMWindow IconWindow XIconWindow PMIconWindow z Probleme dieses Lösungsversuchs Eigene Ei Kl Klasse fü für jjede d K Kombination bi ti F Fenster-Art t A t / Plattform Pl ttf Ö unwartbar Client wählt Kombination Fenster-Art / Plattform (bei der Objekterzeugung) Ö plattformabhängiger Client-Code Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-82 ROOTS Bridge Pattern: Idee z Trennung von Konzeptueller Hierarchie Implementierungs-Hierarchie bridge imp Window WindowImp drawText() drawRect() devDrawText() devDrawLine() imp.devDrawLine() imp devDrawLine() imp.devDrawLine() imp.devDrawLine() imp.devDrawLine() IconWindow TransientWindow XWindowImp PMWindowImp d drawBorder() B d () d drawCloseBox() Cl B () devDrawText() devDrawLine() devDrawLine() devDrawText() XDrawLine() XDrawString() drawRect() drawText() Vorlesung Softwaretechnologie, Wintersemester 2007/8 drawRect() 06-83 ROOTS Bridge Pattern: Schema Client Abstraction imp Implementor operation() basicOperation() imp.basicOperation() RefinedAbstraction Vorlesung Softwaretechnologie, Wintersemester 2007/8 ConcreteImplementorA ConcreteImplementorB basicOperation() basicOperation() 06-84 ROOTS Bridge Pattern: Verantwortlichkeiten z Abstraction definiert Interface referenziert Implementierung z RefinedAbstraction erweitert das Interface z Implementor Interface der Implementierungs-Hierarchie kann von Abstraction abweichen z ConcreteImplementor wirkliche Implementierung z Zusammenspiel Forwarding Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-85 ROOTS Bridge Pattern: Anwendbarkeit z Dynamische D i h Ä Änderbarkeit d b k it Implementierung erst zur Laufzeit auswählen z Unabhängige Variabilität neue Unterklassen in beiden Hierarchien beliebig kombinierbar z Implementierungs-Transparenz für Clients Änderungen g der Implementierung p g erfordern keine Änderung g/ Neuübersetzung der Clients z Vermeidung von "Nested Nested Generalisations" Generalisations keine Hierarchien der Art wie in der Motivations-Folie gezeigt keine kombinatorische Explosion der Klassenanzahl z Sharing mehrere Clients nutzen gleiche Implementierung z.B. Strings Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-86 ROOTS Bridge Pattern: Implementierung Instantiierung des richtigen ConcreteImplementor z Falls Abstraction alle ConcreteImplementor-Klassen kennt: Fallunterscheidung im Konstruktor Auswahl des ConcreteImplementor anhand von Parametern des Konstruktors Ö Beispiel: Collection Ö wenig i El Elemente: t IImplementierung l ti als l verkettete k tt t Liste Li t Ö viele Elemente: Implementierung als Hashtable Alternativ: Default-Initialisierung und spätere situationsbedingte Änderung z Falls Abstraction völlig unabhängig von ConcreteImplementor-Klassen sein soll: Entscheidung anderem Objekt überlassen Î Abstract Factory Pattern Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-87 ROOTS Bridge Pattern: Abgrenzung z Bridge antizipierte Entkopplung von Schnittstelle und Implementierung z Adapter nachträgliche Anpassung der Schnittstelle einer Implementierung z Abstract Factory nutzbar zur Erzeugung und Konfiguration einer Bridge Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-88 ROOTS Patterns für Subsysteme (Æ siehe „Systementwurf“) z Facade Subsystem abschirmen z Singleton Nur eine einzige Facade-Instanz erzeugen z Proxy P Stellvertreter für entferntes Subsystem z Adapter Anpassung der realen an die erwartete Schnittstelle z Bridge Entkopplung der Schnittstelle von der Implementierung Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-89 ROOTS Vorlesung Softwaretechnologie 2007/8 Dr. Günter Kniesel ROOTS Teil 2 - Object Design Patterns - Command, Factory Method, Abstract Factory, Composite, Visitor „Patterns Create Architectures“ Rückblick: „Was nutzen Patterns?“ © 2000-2007 Dr. Günter Kniesel Das Command Pattern: Motivation z Kontext GUI-Toolkits mit Buttons, Menüs, etc. z Forces Vielfalt trotz Einheitlichkeit Ö Einheitlicher Code in allen GUI-Elementen Ö .. trotzdem verschiedene Effekte Wiederverwendung Wi d d Ö Über verschiedene GUI-Elemente ansprechbare Operationen nur ein mal programmieren Dynamik Ö dynamische Änderung der Aktionen von Menu-Einträgen Ö kontext-sensitive Aktionen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-91 ROOTS Das Command Pattern: Idee z O Operationen i als l Obj Objekte k mit i M Methode h d execute() d darstellen ll z in den GUI-Elementen speichern Einheitlicher Aufruf Verschiedene Implementierungen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-92 ROOTS Das Command Pattern: Anwendbarkeit z Operationen als Parameter z Variable Aktionen referenziertes Command-Objekt austauschen z Zeitliche Trennung Befehl zur Ausführung, g, Protokollierung, g, Ausführung g z Speicherung und Protokollierung von Operationen History-Liste Serialisierung z "Undo" von Operationen Command-Objekte enthalten neben execute() auch unexecute() werden in einer History-Liste gespeichert z Recover-Funktion nach Systemabstürzen History-Liste y wird g gespeichert p Zustand eines Systems ab letzter Speicherung wiederstellbar z Unterstützung von Transaktionen Transaktionen können sowohl einfache ("primitive") ( primitive ), als auch komplexe Command CommandObjekte sein. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-93 ROOTS Implementierung des Command Patterns z Unterschiedliche Grade von Intelligenz Command-Objekte können "nur" Verbindung zwischen Sender und Empfänger sein, oder aber alles selbstständig erledigen erledigen. z Unterstützung von "undo" Semantik Ö Undo (unexecute()) und redo (execute()) müssen den exakt gegenteiligen Effekt haben! Problem: In den wenigsten Fällen gibt es exact inverse Operationen Ö Die Mathematik ist da eine Ausnahme... Daher Zusatzinfos erforderlich Ö Damit ein Command-Objekt "undo" unterstützen kann, müssen evtl. zusätzliche Informationen gespeichert werden. Ö Typischerweise: Kopien des alten Zustands der Objekte die wiederhergestellt werden sollen. History-Liste Ö Für mehrere Levels von undo/redo Clonen vor Speicherung in der History-Liste Ö Es reicht nicht eine Referenz auf die Objekte zu setzen! Ö Man muss das Objekt j "tief" Clonen,, um sicherzustellen dass sein Zustand nicht verändert wird. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-94 ROOTS Das Command Pattern: Konsequenzen z Entkopplung von Aufruf einer Operation und Spezifikation einer Operation. z Kommandos als Objekte Command-Objekte können wie andere Objekte auch manipuliert und erweitert werden werden. z Komposition Folgen von Command-Objekte können zu weiteren Command-Objekten zusammengefasst werden. z Erweiterbarkeit Neue Command Command-Objekte Objekte können leicht hinzugefügt werden werden, da keine Klassen geändert werden müssen. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-95 ROOTS Aufgabe z die sich mit z Observer z Strategy z Command z lösen lö lä lässt. t Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-96 ROOTS Patterns-Überblick Verhalten Struktur z Visitor z Composite z Observer z Flyweight y g z Command z Template Method z Chain Ch i off R Responsibility ibilit z Decorator z State z Adapter p z Strategy z Proxy z Multiple Vererbung z Bridge z Facade F d Split Objects z Factory z Prototype z Factory Method z Singleton z Builder Vorlesung Softwaretechnologie, Wintersemester 2007/8 Objekt-Erzeugung 06-97 ROOTS Vorlesung Softwaretechnologie 2007/8 Dr. Günter Kniesel Das Command und Observer Pattern in Java © 2000-2007 Dr. Günter Kniesel ROOTS Verbindung von Observer und Command in Java (1) <<interface>> ActionListener void actionPerfomed(ActionEvent evt) <<implements>> MyPasteCommand :MenuItem void actionPerfomed(ActionEvent evt) :Button ← addActionListener(ActionListener) :JComponent z → actionPerformed(ActionEvent) ← registerKeyboardAction(ActionListener, ( KeyStroke, S ...)) Observer Buttons, Menue Menue-Einträge Einträge und Tasten generieren "ActionEvents" Interface "ActionListener" ist vordefiniert Î "ActionListener" implementieren Î ... und Instanzen davon bei Buttons, MenuItems, etc registrieren Vorlesung Softwaretechnologie, Wintersemester 2007/8 : MyPasteCommand z Command & Observer gleiche Methode (z.B. actionPerformed) spielt die Rolle der run() Methode eines Commands und die Rolle der update() Methode eines Observers implementierende Klasse (z.B. MyPasteCommand) ist gleichzeitig ein Command und ein Observer 06-99 ROOTS Verbindung von Observer und Command in Java (2) z Zusätzliche Unterstützung für "Command" Command Interface "Action" und Klasse "AbstractAction" <<interface>> ActionListener void actionPerfomed(ActionEvent evt) Aktivierung Akti i / Deaktivierung von MenuItems denen diese "Action" zugeordnet ist ... Parameter können allerdings auch direkt als InstanzVariablen realisiert werden. <<interface>> Action void putValue(String key, Object value) Object getValue(String key) Einheitliche Schnittstelle zur Speicherung von Parametern für "Action" ... boolean isEnabled() void setEnabled(boolean b) void addPropertyChangeListener(PropertyChangeListener listener) void removePropertyChangeListener(PropertyChangeListener listener) im m JDK en nthalten <<extends>> <<implements>> AbstractAction // alles ausser void actionPerfomed(ActionEvent evt) <<extends>> MyPasteCommand void actionPerfomed(ActionEvent evt) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-100 ROOTS Beispiel: Änderung der Hintergrundfarbe (1) class ColorAction extends AbstractAction { public ColorAction(..., Color c, Component comp) { ... color = c; target = comp; } public void actionPerformed(ActionEvent evt) { target.setBackground(color); target.repaint(); } private Component target; private Color color; } class ActionButton extends JButton { public ActionButton(Action a) { ... addActionListener(a); } } z ColorAction Ändern der Hintergrundfarbe einer GUI-Komponente z ActionButton Buttons die sofort bei Erzeugung mit einer Action verknüpft werden Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-101 ROOTS Beispiel: Änderung der Hintergrundfarbe (2) z Nutzung der ColorAction Erzeugung einer Instanz Registrierung class SeparateGUIFrame extends JFrame { public SeparateGUIFrame() { ... JPanel panel = new JPanel(); Action blueAction = new ColorAction("Blue", ( , ...,..., , , p panel); ); panel.registerKeyboardAction(blueAction,...); panel.add(new l dd( A ti B tt (bl A ti )) ActionButton(blueAction)); JMenu menu = new JMenu("Color"); menu.add(blueAction); ( ); ... } } Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-102 ROOTS Beispiel: Änderung der Hintergrundfarbe (2) z Nutzung der ColorAction Erzeugung einer Instanz Registrierung class SeparateGUIFrame extends JFrame { public SeparateGUIFrame() { ... JPanel panel = new JPanel(); Action blueAction = new ColorAction("Blue", ( , ...,..., , , p panel); ); panel.registerKeyboardAction(blueAction,...); panel.add(new l dd( A ti B tt (bl A ti )) ActionButton(blueAction)); JMenu menu = new JMenu("Color"); menu.add(blueAction); ( ); ... } } Der komplette Code des Beispiels steht auf der Website. Beispiel und Erläuterung siehe: "Core Core Java 2 2", Kapitel 8 8, Abschnitt "Separating GUI and Application Code". Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-103 ROOTS Fazit 9 Elegante Verbindung von Observer und Command Commands sind ActionListener von Buttons, Menus, etc. Ö Einheitlicher Aufru via actionPerformed(ActionEvent evt) Buttons und Menus sind PropertyChangeListener von Commands Ö Aktivierung / Deaktivierung 9 Wiederverwendung gleiche Action für Menu, Button, Key z Dynamik Wie ändert man die aktuelle Aktion? ... konsistent für alle betroffenen MenuItems, Buttons, etc.??? Î Strategy Pattern! Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-104 ROOTS "Gang of Four"-Patterns: Überblick und Klassifikation Verhalten Struktur z Visitor z Composite z Observer z Flyweight y g z Command z Template Method z Chain Ch i off R Responsibility ibilit z Decorator z State z Proxy y z Strategy z Adapter z Multiple Vererbung z Bridge z Facade F d Split Objects Jetzt z Factory z Prototype z Factory Method z Singleton z Builder Vorlesung Softwaretechnologie, Wintersemester 2007/8 Objekt-Erzeugung 06-105 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s Das Factory Method Pattern ROOTS Factory Method z Ziel Entscheidung über konkreter Klasse neuer Objekte verzögern z Motivation Framework F k mit it vordefinierten d fi i t Kl Klassen "D "Document" t" und d "A "Application" li ti " Template-Methode, für das Öffnen eines Dokuments: Ö 1. Check ob Dokument-Art bekannt Ö 2. Erzeugung einer Document-Instanz !?! Erzeugung von Instanzen noch nicht bekannter Klassen! z Idee aktuelle Klasse entscheidet wann Objekte erzeugt werden Ö Aufruf einer abstrakten Methode Subklasse entscheidet was für Objekte erzeugt werden Ö implementiert abstrakte Methode passend Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-107 ROOTS Factory Method: Beispiel Framework D Document t * docs A li ti Application newDocument() doCreateDocument() MyDocument Document doc = doCreateDocument(); docs.add(doc); doc.open(); MyApplication doCreateDocument() return new MyDocument() Applikation Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-108 ROOTS Factory Method: Schema Product Creator anOperation() factoryMethod() ConcreteProduct ... product = factoryMethod(); ... ConcreteCreator factoryMethod() return new ConcreteProduct() z Factory Method kann abstrakt sein kann Default-Implementierung haben z Creator (Aufrufer der Factory Method) kann Klasse sein, die die Factory Method definiert kann Client-Klasse Client Klasse sein Ö Beispiel: parallele Vererbungs-Hierarchien Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-109 ROOTS Factory Method: Anwendbarkeit z Klasse neuer Objekte unbekannt z Verzögerte Entscheidung über Instantiierung erst in Subklasse erst beim Client z Mehrere Hilfsklassen Wissen über konkrete Hilfsklassen an einer Stelle lokalisieren Beispiel: Parallele Hierarchien (nächste Folie) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-110 ROOTS Factory Method: Anwendbarkeit Figure Client Manipulator createManipulator() ... Li Fi LineFigure T tFi TextFigure createManipulator() ... createManipulator() ... downClick() drag() upClick() Li M i l t LineManipulator T t Textmanipulator i l t downClick() drag() upClick() downClick() drag() upClick() z Verbindung paralleler Klassenhierarchien Factory Method lokalisiert das Wissen über zusammengehörige Klassen Restlicher R li h C Code d d der Fi Figure-Hierarchie Hi hi und d Cli Client-Code C d iist völlig ölli unabhängig von spezifischen Manipulators (nur vom Manipulator-Interface) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-111 ROOTS Factory Method: Implementierung z Fester "Produkt-Typ" jede Unterklasse erzeugt festgelegte Produkt-Art Produkt Art z Codierter "Produkt-Typ" Parameter oder Objekt-Variable kodiert "Produkt-Typ" Fallunterscheidung anhand Code Î mehrere Produkte Î mehr Flexibilität z Klassen-Objekt als "Produkt-Typ" Parameter oder Objekt-Variable ist "Produkt-Typ" direkte di k Instantiierung I ii Î mehr Flexibilität Î bessere Wartbarkeit Î kein statischer Typ-Check Vorlesung Softwaretechnologie, Wintersemester 2007/8 class Creator { Product create(){ MyProduct(); } } class Creator { Product create(int id) { if (id==1) return MyProduct1(); if (id==2) return MyProduct2(); ... } } Idiom reflektiver Sprachen • Smalltalk • Java class Creator { Object create(Class prodType) { return prodType.getInstance(); } } Reflektiver Aufruf des parameterelosen Default-Konstruktors 06-112 ROOTS Factory Method: Konsequenzen z Code wird abstrakter / wiederverwendbarer keine festen Abhängigkeiten von spezifischen Klassen z Verbindung paralleler Klassenhierarchien Factory F t Method M th d lokalisiert l k li i t d das Wi Wissen üb über Z Zusammengehörigkeiten hö i k it z evtl. künstliche Subklassen nur zwecks Objekterzeugung Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-113 ROOTS Factory Method: Anwendungen z überall in Toolkits, Frameworks, Class Libraries Unidraw: Beispiel "Figure und Manipulator" MacApp und ET++: Beispiel "Document und Application" z Smalltalk's Model Model-View-Controller View Controller Framework FactoryMethoden-Template: defaultController Hook-Methode: defaultControllerClass z Orbix Erzeugung des richtigen Proxy Ö leichte Ersetzung von Standard-Proxy durch Caching Proxy Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-114 ROOTS Factory Method: Abgrenzung z Template Method ruft oft Factory Method auf z Abstract Factory oft ft mit it F Factory t M Methods th d iimplementiert l ti t gleiche Motivation z Prototype erfordert keine Unterklassenbildung ... dafür aber explizite initialize()-Methode Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-115 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s Das Abstract Factory Pattern ROOTS Abstract Factory z Ziel zusammengehörige Objekte verwandter Typen erzeugen ... ohne deren Klassenzugehörigkeit fest zu codieren z Motivation M ti ti GUI-Toolkit für mehrere Plattformen Anwendungsklassen e du gs asse nicht c t von o p plattformspezifischen att o spe sc e Widgets dgets ab abhängig ä gg machen Trotzdem soll die Anwendung Ö alle Widgets konsistent zu einem "look look and feel" feel erzeugen können Ö "look and feel" umschalten können Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-117 ROOTS Abstract Factory: Motivation WidgetFactory Client createWindow() createScrollBar() Window MotifWidgetFactory createWindow() createScrollBar() PMWidgetFactory PMWindow MotifWindow createWindow() createScrollBar() Scrollbar PMScrollbar Vorlesung Softwaretechnologie, Wintersemester 2007/8 MotifScrollBar 06-118 ROOTS Abstract Factory: Schema AbstractFactory Client createProductA() createProductB() AbstractProductA ConreteFactory1 createProductA() createProductB() ConreteFactory2 ProductA2 ProductA1 createProductA() createProductB() AbstractProductB ProductB2 Vorlesung Softwaretechnologie, Wintersemester 2007/8 ProductB1 06-119 ROOTS Abstract Factory: Implementierung z ConcreteFactories sind Singletons z Produkt-Erzeugung via Factory-Methods z ffester t Produkt-Typ P d kt T (eine ( i M Methode th d fü für jjedes d P Produkt) d kt) Nachteil Ö neues Produkt erfordert Änderung der gesamten Factory-Hierarchie z Codierter "Produkt-Typ" (eine parametrisierte Methode für alle Produkte) Vorteil Ö leichte Erweiterbarkeit um neues Produkt Nachteile: Ö alle Produkte müssen gemeinsamen Obertyp haben Ö Clients können nur die Operationen des gemeinsamen Obertyps nutzen Ö Verzicht auf statische Typsicherheit z Klassen-Objekt Klassen Objekt als "Produkt-Typ" Produkt Typ (eine parametrisierte Methode) Vorteil Ö neues Produkt erfordert keinerlei Änderungen der Factory Nachteil Ö Verzicht auf jegliche statische Typinformation / Typsicherheit Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-120 ROOTS Abstract Factory: Implementierung z Produktfamilie = Subklasse Vorteil Ö Konsistenz der Produkte Nachteil Ö neue Produktfamilie erfordert neue Subklasse, Subklasse auch bei geringen Unterschieden z Produktfamilie = von Clients konfigurierte assoziative Datenstruktur Varianten Ö Prototypen und Cloning Ö Klassen und Instantiierung Vorteil Ö keine Subklassenbildung g erforderlich Nachteil Ö Verantwortlichkeit an Clients abgegeben Ö konsistente Produktfamilien können nicht mehr garantiert werden Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-121 ROOTS Abstract Factory: Konsequenzen z Abschirmung von Implementierungs-Klassen Namen von Implementierungsklassen erscheinen nicht im Code von Clients Clients benutzen nur abstraktes Interface z leichte Austauschbarkeit von Produktfamilien Name N einer i C ConcreteFactory t F t erscheint h i t nur ein i mall iim C Code d Ö bei ihrer Instantiierung leicht austauschbar gegen andere ConcreteFactory Beispiel: Dynamisches Ändern des look-and-feel Ö andere ConcreteFactory instantiieren Ö alle GUI-Objekte neu erzeugen z konsistente Benutzung von Produktfamilien keine Motif-Scrollbar in Macintosh-Fenster z schwierige Erweiterung um neue Produktarten Schnittstelle der AbstractFactory legt Produktarten fest Neue Produktart = Änderung der gesamten Factory-Hierarchie Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-122 ROOTS Abstract Factory: Anwendbarkeit z System soll unabhängig sein von Objekt-Erzeugung Objekt-Komposition Objekt-Darstellung z System soll konfigurierbar sein Auswahl aus verschiedenen Produkt-Familien z konsistente Produktfamilien nur Objekte der gleichen Familie "passen zusammen" z Library mit Produktfamilie anbieten Clients sollen nur Schnittstelle kennen ... nicht die genauen Teilprodukt-Arten / -Implementierungen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-123 ROOTS "Gang of Four"-Patterns: Überblick und Klassifikation Jetzt Verhalten Struktur z Visitor z Composite z Observer z Flyweight y g z Command z Template Method z Chain Ch i off R Responsibility ibilit z Decorator z State z Proxy y z Strategy z Adapter z Multiple Vererbung z Bridge z Facade F d Split Objects z Factory z Prototype z Factory Method z Singleton z Builder Vorlesung Softwaretechnologie, Wintersemester 2007/8 Objekt-Erzeugung 06-124 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Composite Pattern Composite Pattern z Ziel rekursive Aggregations-Strukturen darstellen ("ist Teil von") Aggregat und Teile einheitlich behandeln z Motivation M ti ti Gruppierung von Graphiken Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-126 ROOTS Composite Pattern: Beispiel Graphic draw() add(Graphic) remove(Graphic) getChildren() children Line Text Picture draw() draw() draw() add(Graphic) remove(Graphic) getChildren() aLine aText aText aPicture Vorlesung Softwaretechnologie, Wintersemester 2007/8 draw() { for all c in children c.operation() } aPicture 06-127 ROOTS Composite Pattern: Struktur * Client Component operation() add(Component) remove(Component) getChildren() children Leaf Composite operation() operation() add(Component) remove(Component) getChildren() Vorlesung Softwaretechnologie, Wintersemester 2007/8 operation() { for all c in children c.operation() } 06-128 ROOTS Composite Pattern: Verantwortlichkeiten z Component (Graphic) gemeinsames Interface aller Teilobjekte default-Verhalten Interface für Zugriff auf Teilobjekte (!) evtl. evtl Interface für Zugriff auf Elternobjekte z Leaf ((Rectangle, g Line, Text)) * Component operation() add(Component) remove(Component) (C t) getChildren() children Leaf Composite operation() operation() add(Component) remove(Component) getChildren() "primitive" Teil-Objekte implementieren gemeinsames Interface leere l IImplementierungen l ti fü für T Teilzugriffs-Interface il iff I t f p ((Picture)) z Composite speichert Teilobjekte implementiert gemeinsames Interface durch forwarding implementiert Teilzugriffs-Interface Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-129 ROOTS Composite Pattern: Anwendbarkeit * Component operation() add(Component) remove(Component) (C t) getChildren() Vorlesung Softwaretechnologie, Wintersemester 2007/8 children Leaf Composite operation() operation() add(Component) remove(Component) getChildren() 06-130 ROOTS Composite Pattern: Implementierung Component Leaf Composite operation() operation() add(Component) remove(Component) (C ) getChildren() parent gemeinsam nutzen operation() add(Component) remove(Component) getChildren() 1 z Composites sollen wissen wovon sie Teil sind Explizite Referenzen auf Composite in Component Klasse z Mehrere Composites sollen Components * children schließt explizite Referenz der Components auf Composite aus oder erfordert, dass Components wissen, dass sie Teile mehrerer Composites sind i d z Component Interface "Sauberes Design": g Verwaltungs-Operationen g p ((add, remove, g getChildren)) in Composite, da sie für Leafs nicht anwendbar sind. Wunsch nach einheitlicher Behandlung aller Graphic-Objekte durch Clients Æ Verwaltungs-Operationen in Component mit default-Implementierung di nichts die i ht ttutt Æ Leaf-Klassen sind damit zufrieden, Composites müssen die Operationen passend implementieren. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-131 ROOTS Composite Pattern: Konsequenzen z einheitliche Behandlung Teile Ganzes z einfache Clients dynamic d i bi binding di statt t tt Fallunterscheidungen F ll t h id z leichte Erweiterbarkeit neue eue Leaf-Klassen ea asse neue Composite-Klassen ohne Client-Änderung z evtl. zu allgemein Einschränkung der Komponenten-Typen schwer run run-time time type checks (instanceof) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-132 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Das Visitor Pattern Das Visitor Pattern z Absicht Repräsentation von Operationen auf Elementen einer Objektstruktur Neue Operationen definieren, ohne dass die Klassen dieser Objekte zu ändern Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-134 ROOTS Das Visitor Pattern: Motivation z Beispiel: Compiler enthält Klassenhierarchie für Ausdrücke einer Programmiersprache z Problem Code einer Operation ist über mehrere Klassen verteilt Neue N O Operation ti erfordert f d t Änderung Ä d d der gesamten t Hi Hierarchie hi Node TypeCheck() GenerateCode() PrettyPrint() VariableRefNode TypeCheck() GenerateCode() PrettyPrint() Vorlesung Softwaretechnologie, Wintersemester 2007/8 AssignmentNode g TypeCheck() GenerateCode() PrettyPrint() 06-135 ROOTS Das Visitor Pattern: Idee (1) z Operation = Objekt Zusammenfassung aller Methoden einer Operation in einer Klasse z visit...-Methoden visit -Methoden Ausprägung der Operation auf bestimmtem Objekttyp NodeVisitor visitAssignment(AssignmentNode) visitVariableRef(VariableRefNode) TypeCheckingVisitor CodeGeneratingVisitor visitAssignment(AssignmentNode) visitVariableRef(VariableRefNode) visitAssignment(AssignmentNode) visitVariableRef(VariableRefNode) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-136 ROOTS Das Visitor Pattern: Idee (2) z "akzeptierende" Methoden in der betroffenen Klassenhierarchie rufen die jeweils passende visit...-Methode auf * Program Node accept(NodeVisitor) AssignmentNode VariableRefNode accept(NodeVisitor v) accept(NodeVisitor v) v visitAssignment(this) v.visitAssignment(this) Vorlesung Softwaretechnologie, Wintersemester 2007/8 v visitVariableRef(this) v.visitVariableRef(this) 06-137 ROOTS Das Visitor Pattern: Schema Client Visitor visitConcreteElementA(ConcreteElementA) visitConcreteElementB(ConcreteElementB) ConcreteVisitor1 ConcreteVisitor2 visitConcreteElementA(ConcreteElementA) visitConcreteElementB(ConcreteElementB) visitConcreteElementA(ConcreteElementA) visitConcreteElementB(ConcreteElementB) ObjectStructure * Element accept(Visitor) ConcreteElementA accept(Visitor v) operationA() v visitConcreteElementA(this) v.visitConcreteElementA(this) Vorlesung Softwaretechnologie, Wintersemester 2007/8 ConcreteElementB accept(Visitor v) operationB() v visitConcreteElementB(this) v.visitConcreteElementB(this) 06-138 ROOTS Visitor Pattern: Verantwortlichkeiten / Implementation z Objektstruktur-Hierarchie einheitliche accept-Methode z Visitor-Hierarchie jje eine visit-Methode für jjede Klasse der Objektstruktur j z Accept-Methoden haben Visitor als Parameter "Welche Operation soll auf mir ausgeführt werden?" z Visit Visit-Methoden Methoden haben Parameter vom Typ der jeweilige Klasse der Objektstruktur "Wie soll Operation X auf Objekten des Typs Y ausgeführt werden?" z Traversierung der Objektstruktur kann definiert sein in der Objektstruktur j ((Methode accept(...)) p ( )) oder im Visitor-Objekt (Method visit...(...)) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-139 ROOTS Das Visitor Pattern: Zusammenarbeit Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-140 ROOTS Das Visitor Pattern: Konsequenzen z Funktionale Dekomposition Ein Visitor fasst Methoden der gleichen Operation zusammen ... und trennt Methoden verschiedener Operationen z Heterogenität Objekt-Klassen j können aus verschiedenen Hierarchien stammen z Hinzufügen neuer Operationen ist einfach neue Visitor-Klasse z Hinzufügen Hi fü neuer Obj Objekt-Klassen kt Kl iistt sehr h aufwendig f di neue Objekt-Klasse neue visit... - Methode in allen Visitors z Sammeln von Zuständen während der Abwanderung eines Objektbaums dafür keine zusätzlichen Parametern nötig z Verletzung von Kapselung Klassen der Objekstruktur müssen den Visitors ausreichend Funktionalität bieten Oft müssen ihre Schnittstellen mehr preisgeben als sonst nötig Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-141 ROOTS Das Visitor Pattern: Anwendbarkeit z Funktionale Dekomposition Zusammengehörige Operationen sollen zusammengefasst werden ... statt in einer Klassenhierarchie verteilt zu sein z Stabile Objekt-Hierarchie selten lt neue Kl Klassen aber oft neue Operationen g Hierarchie z Heterogene viele Klassen mit unterschiedlichen Schnittstellen Operationen die von den Klassen abhängen z Anwendungsbeispiel Java Java-Compiler Compiler des JDK 1 1.3 3 Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-142 ROOTS Überblick z Einführung Grundidee, Literatur, MVC-Framework als Beispiel z Beispiele wichtiger Patterns Observer, Strategy, Command Bridge, Factory Method, Abstract Factory z Patterns Create Architectures Bridge, Abstract Factory, Singleton z Nutzen N t von Patterns P tt z Zusammenfassung und Ausblick Bestandteile eines Patterns, Definition Arten von Patterns, Abgrenzung Weiterführende Themen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-143 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS „Patterns Create Architectures“ Ein Beispiel zum Zusammenspiel von Patterns Bridge & Abstract Factory & Singleton „Patterns Create Architectures“ z Idee Wenn man Patterns wohlüberlegt zusammen verwendet, entsteht ein Grossteil einer Software-Architektur aus dem Zusammenspiel der Patterns. z Beispiel Zusammenspiel von Bridge, Factory und Singleton Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-145 ROOTS Erinnerung ans Abstract Factory Pattern WidgetFactory Client createWindow() createScrollBar() in der Praxis müsste WidgetFactory ein Singleton sein MotifWidgetFactory createWindow() createScrollBar() PMWidgetFactory Window PMWindow MotifWindow createWindow() createScrollBar() Scrollbar in der Praxis müsste hier das BridgePattern angewendet werden Vorlesung Softwaretechnologie, Wintersemester 2007/8 PMScrollbar MotifScrollBar 06-146 ROOTS Erinnerung ans Bridge Pattern z Trennung von Konzeptueller Hierarchie Client imp Window drawText() drawRect() ImplementierungsHierarchie WindowImp devDrawText() devDrawLine() IconWindow TransientWindow PMWindowImp XWindowImp drawBorder() () drawCloseBox() C () devDrawText() devDrawLine() devDrawLine() devDrawText() Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-147 ROOTS Zusammenspiel: Bridge, Factory, Singleton << konfiguriert >> Client WidgetFactory Singleton WidgetFactory setFactory(WidgetFactory MOTIF) WidgetFactory.setFactory(WidgetFactory.MOTIF) WidgetFactory.getFactory() PMWidgetFactory createWindow() createScrollBar() << benutzt >> Wi d Window IconWIndow TransientWindow Scrollbar FixedSB imp imp ProportionalSB Vorlesung Softwaretechnologie, Wintersemester 2007/8 MotifWidgetFactory Wi d I WindowImp PMWindow MotifWindow ScrollbarImp PMScrollbar MotifScrollBar 06-148 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s Rückblick: Was nützen Patterns? ROOTS Nutzen von Design Patterns (1) z Objekte / Klassen identifizieren Abstraktionen, die kein Gegenstück in der realen Welt / dem AnalyseModell haben Beispiel: Ö Composite Pattern Ö Abstraktionen von Prozessen Ö Strategy Ö State "Strict modelling of the real world leads to a system that reflects today's y realities but not necesarilly y tomorrow's. The abstractions that emerge during design are key to making a design flexible." Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-150 ROOTS Nutzen von Design Patterns (2) z Granularität der Objekte festlegen Facade Ö ein "Riesen-Objekt" Flyweight Ö viele kleine kleine, gemeinsam verwendbare Teilobjekte Builder Ö Komposition von Gesamt-Objekt aus Teilobjekten Visitor Ö Gruppe von konsistenten Aktionen Command Ö einzelne Aktion Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-151 ROOTS Nutzen von Design Patterns (3) z Schnittstellen identifizieren was gehört dazu was gehört nicht dazu (Bsp. Memento) z Beziehungen zwischen Schnittstellen festlegen Subtyping Ö Decorator Ö Proxy Je eine Methode pro Klasse aus einer anderen Objekthierarchie Ö Abstract Factory Ö Builder Ö Visitor Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-152 ROOTS Nutzen von Design Patterns (4) z Wahl der Implementierung Interface, Abstrakte Klasse oder konkrete Klasse Ö Grundthema fast aller Patterns Abstrakte Methode oder Hook Methode Ö von template method aufgerufene Methoden Overriding oder fixe Implementierung Ö Factory method Ö Template T l t method th d Vererbung oder Subtyp-Beziehung Ö Adapter, Decorator, State, Strategy, Command, Chain of Responsibility: Gemeinsamer Obertyp, nicht gemeinsame Implementierung Vererbung oder Aggregation Ö Vererbung ist statisch Ö Es wird oft mehr vererbt als gewünscht Ö Beispiel: alle "split object patterns" Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-153 ROOTS Nutzen von Design Patterns (5): Patterns verkörpern erkörpern Gr Grundprinzipien ndprin ipien g guten ten Designs z Implementierungen austauschbar machen Typdeklarationen mit Interfaces statt mit Klassen Design an Interfaces orientieren, nicht an Klassen Client-Code wiederverwendbar für neue Implementierungen des gleichen Interface z Objekt-Erzeugung änderbar gestalten "Creational Patterns" statt "new MyClass()" Client-Code Cli C d wiederverwendbar i d db fü für neue IImplementierungen l i d des gleichen l i h Interface z Funktionalität änderbar gestalten Aggregation und Forwarding statt Vererbung späte ät Konfigurierbarkeit, K fi i b k it D Dynamik ik weniger implizite Abhängigkeiten (kein "fragile base class problem") Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-154 ROOTS Überblick z Einführung Grundidee, Literatur, MVC-Framework als Beispiel z Beispiele wichtiger Patterns Observer, Strategy, Command Facade, Singleton, Proxy, Adapter, Bridge Factory Method, Abstract Factory Composite, Visitor z Patterns Create Architectures Bridge, Abstract Factory, Singleton z Nutzen von Patterns z Zusammenfassung und Ausblick Arten von Patterns, Abgrenzung Weiterführende Themen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-155 ROOTS Arten von Design Patterns z Analysis Pattern wiederkehrende Problemen in der Analysephase eines Softwareprojekts Martin Fowler: "Analysis Patterns", Addison-Wesley, 1997 z Architektur Pattern ... beschreibt b h ibt mögliche ö li h ffundamentale d t l St Strukturen kt von S Softwaresystemen. ft t ... enthält vordefinierte Subsysteme und ihre Verantwortlichkeiten. g und Richtlinien für die Organisation g ihrer Beziehungen. g ... enthält Regeln Beispiel: Das Model-View-Controller Framework z Design Pattern Schema für die Realisation von Subsystemen oder Komponenten eines Softwaresystems g Pattern)) z Idiom ((auch: Coding low-level design patterns für eine gegebene Programmiersprache. Beispiel: Wie stelle ich sicher, dass eine Instanz einer Java-Klasse nur innerhalb dieser Klasse erzeugt werden kann? Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-156 ROOTS Weitere Arten von Pattern z Organizational Patterns Struktur und Praxis von Organisationen; also Gruppen, die ein gemeinsames Ziel verfolgen http://www.bell-labs.com/cgiuser/ OrgPatterns/OrgPatterns?OrganizationalPatterns g g g z Anti-Patterns beschreiben typische Fehler ... und bestenfalls auch wie man sie wieder beseitigt Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-157 ROOTS Abgrenzung: Pattern sind keine Algorithmen z Patterns versus Algorithmen Algorithmen lösen feinkörnigere Probleme als Patterns (z.B. Suchen, Sortieren) Algorithmen sind deterministischer (weniger ImplementierungsFreiheitsgrade) g ) Komplexität von Algorithmen lässt sich leichter fassen Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-158 ROOTS Abgrenzung: Pattern sind keine Frameworks z Pattern versus Frameworks Framework Ö Menge von kooperierenden Klassen für einen spezifischen Anwendungsbereich Ö erweiterbar durch Unterklassenbildung und Komposition von Instanzen Ö Hollywood-Prinzip ("Don't call us, we'll call you." --> Template Method Pattern) Patterns sind abstrakter Ö Frameworks existieren als konkreter konkreter, wiederverwendbarer Code – Patterns enthalten nur Beispiele von Code Patterns sind weniger spezifisch Ö Frameworks werden für konkrete Anwendungsbereiche eingesetzt – Patterns können fast überall eingesetzt werden Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-159 ROOTS Weiterführende Themen z Pattern Catalogs Sammlungen von lose zusammenhängenden Patterns z Pattern Systems Sammlungen S l von stark t k zusammenhängenden hä d P Patterns tt mit it engen Verzahnungen z Pattern Languages verfolgen ein gemeinsames Ziel, dass durch die Zusammenarbeit der enthaltenen Patterns erreicht werden kann inkl. einer Art "Grammatik", die alle mögliche Kombinationen aufzeigt Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-160 ROOTS Pattern: Zusammenfassung z Betonung von Praktikabilität Patterns sind bekannte Lösungen für erwiesenermaßen wiederkehrende Probleme Sie sollen Softwareentwickler bei ihrer Arbeit unterstützen, nicht mehr und nicht weniger g z "Aggressive Hintanstellung von Originalität" Lösungen, die sich noch nicht in der Praxis bewährt haben, sind keine Pattern. Pattern z Patterns sind kein Allheilmittel Originalität g bei der Anwendung g von Patterns ist nach wie vor g gefragt. g Es muss immer noch abgewägt werden, welche Patterns, Pattern Languages, etc. eingesetzt werden. z Gesamteffekt Aufgabe des Softwarearchitekten verlagert sich von der Erfindung des Rads zur Auswahl des richtigen Rads und seiner kreativen Verwendung Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-161 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Rückblick, Selbsttest Im Kapitel „Systementwurf“ kommen die 2 folgenden Folien vor. Sie sollten nun in der Lage sein sein, für die inzwischen besprochenen Design Patterns die auf den folgenden 2 Folien genannten Hinweise nachvollziehen. Wenn nicht, schauen Sie sich die Pattern-Beschreibungen noch mal genau an! Nichtfunktionale Anforderungen geben Hinweise zur Nutzung g von Design g Patterns ((Entwurfsmustern)) z Idee Identifikation von Design Patterns anhand von Schlüsselwörtern in der Beschreibung nichtfunktionaler Anforderungen Analog zu Abbots Objektidentifikation durch Textanalyse z Hinweise auf Abstract Factory Pattern “Herstellerunabhängig”, “Geräteunabhängig”, “muss eine Produktfamilie unterstützen” z Hinweise auf Adapter Pattern “muss muss mit einem existierenden Objekt zusammenarbeiten” zusammenarbeiten z Hinweise auf Bridge Pattern „muss sich um die Schnittstelle zu unterschiedlichen Systemen kümmern von denen einige erst noch entwickelt werden.“ „ein erster Prototyp muss vorgeführt werden“ Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-163 ROOTS Nichtfunktionale Anforderungen geben Hinweise zur Nutzung g von Design g Patterns (Fortsetzung) ( g) z Hinweise auf Composite Pattern “komplexe Struktur”, “muss variable Tiefe und Breite haben” z Hinweise auf Façade Pattern “muss mit einer Menge existierender Objekte zusammenarbeiten”, "stellt ...-Dienst -Dienst bereit" bereit z Hinweise auf Proxy Pattern “muss ortstransparent sein” z Hinweise auf Observer Pattern “muss erweiterbar sein”, “muss skalierbar sein” z Hinweise Hi i auff Strategy St t Pattern P tt “muss Funktionalität X in unterschiedlichen Ausprägungen bereitstellen können” Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-164 ROOTS Vorlesung Softwaretechnologie 2007/8 Kapitel ap te 4: Design es g Patterns atte s ROOTS Ausgeblendete Folien Auf "Split Objects"-Idee basierende Patterns 1. Das Strategy Pattern Verbreitung von Patterns z Prozesse Unified Process z Notationen UML z Programmiersprachen P i h Patterns als Sprachkonstrukte z Libraries Java APIs z automatische Erkennung von Patterns re-engineering z Tools Generierung von Quelltexten (z (z.B. B Together/J) z Formalisierung von Patterns Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-167 ROOTS Advanced Topics z Pattern Languages Descriptions of systems of patterns with matching initial and resulting contexts, together with a "grammar" that describes how to compose them. z Pattern Sequences Concrete sequences of patterns from a pattern language language. Repeated application of pattern sequences lead to new higher-level patterns. This seems to be a fruitful basis for a formalization of patterns. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-168 ROOTS Das Command Pattern z Bekannte Anwendungen javax.swing.undo.UndoableEdit Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-169 ROOTS Das Visitor Pattern: Bekannte Anwendungen z Java-Compiler des JDK 1.3 Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-170 ROOTS Observer Aufgabe z Terminkalender-Einträge werden geändert Visuelle Anzeige aktualisieren Mail-Benachrichtigungen verschicken Benachrichtigungsstrategie soll sehr weitgehend konfigurierbar sein Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-171 ROOTS Änderungen gegenüber Vorlage (Patterns-Vorlesung aus SS2002)) z Vieles gelöscht z Design-Vorlage g g eine Stufe g größer ((20 statt 18 Punkt auf 1 Ebene)) Folgeänderung: Verschiebung fixer Objekte auf vielen Folien Folgeänderung: Löschung von Leerzeilen auf Folien mit viel Text z Komplett überarbeitete Visitor-Pattern-Folien neu eingefügt (auf Basis von Pascal‘s Satz aus 2001)) z Folie zu cloning im Prototype Pattern umfangreich überarbeitet (incl. aufwendiger f di A Animation) i ti ) Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-172 ROOTS Vorlesung Softwaretechnologie 2007/8 Dr. Günter Kniesel ROOTS Vorlesung Design Patterns Sommersemester 2002 Dr. Günter Kniesel Institut für Informatik III Universität Bonn Römerstr. 164, 53117 Bonn [email protected] © 2000-2007 Dr. Günter Kniesel Dieses Material is nur für die Hörer der Vorlesung „Design Design Patterns Patterns“ (Sommersemester 2002) bestimmt. Es darf ausschliesslich zur Vorund Nachbereitung der Vorlesung bzw. zur Vorbereitung auf die entsprechende Prüfung verwendet werden. werden Die Weitergabe an Personen außerhalb des oben erwähnten Personenkreises ist ohne ausdrückliche Genehmigung des Autors nicht zulässig. Das komplette p Material umfaßt 299 Folien. Die Einleitung g und die Beschreibung des Observer und Command Patterns (Seite 6 bis 40) basieren auf Folien von Pascal Costanza. Die Folien zum Singleton Pattern (Seite 86 bis 89) sind ein Beitrag von Holger Mügge. Vorlesung Softwaretechnologie, Wintersemester 2007/8 06-174 ROOTS