Kapitel 6 Entwurfsmuster (Design Patterns)
Transcription
Kapitel 6 Entwurfsmuster (Design Patterns)
Vorlesung „Softwaretechnologie“ Wintersemester te se este 2008 008 ROOTS Kapitel 6 Entwurfsmuster (Design Patterns) Stand: 19.12.2008 Einführung: Die Grundidee von Pattern z Grundlegende Idee Alle Ingenieurdisziplinen benötigen eine Terminologie ihrer wesentlichen Konzepte sowie eine Sprache, die diese Konzepte in Beziehung setzt. Pattern (Muster) wurden zuerst im Bereich der Architektur beschrieben. z Ziele von Pattern in der Welt der Software: Dokumentation von Lösungen wiederkehrender Probleme, um Programmierer bei der Softwareentwicklung zu unterstützen. Schaffung einer gemeinsamen Sprache, um über Probleme und ihre Lösungen zu sprechen. 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 Softwarearchitektur. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-2 ROOTS Einführung: Literatur zu Pattern und Software z Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Gang of Four): g Patterns - Elements of Reusable Object-Oriented j Software" "Design Addison-Wesley, 1995 z Frank Buschmann, Regine g 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 Portland Pattern Repository: http://c2.com/ppr/ Hillside Group Patterns Library: http://www.hillside.net/patterns/ Brad Appleton: „Patterns and Software: Essential Concepts and Terminology“ http://www.bradapp.net/docs/patterns-intro.html Doug Lea, Patterns-Discussion FAQ, http://gee.oswego.edu/dl/pd-FAQ/pd-FAQ.html Buchliste: http://c2.com/cgi/wiki?PatternRelatedBookList http://c2 com/cgi/wiki?PatternRelatedBookList © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-3 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel a = 50% b = 30% c = 20% 2. Änderungen am Modell werden propagiert - Model - X 1. Views melden sich an View + Controller © 2000-2008 Dr. G. Kniesel X a = 50% b = 30% c = 20% View + Controller Vorlesung „Softwaretechnologie“ (SWT) Seite 6-4 ROOTS Einführung: Das MVC-Framework in Smalltalk als Beispiel Model a = 50% b = 30% c = 20% - X - X - X a = 50% b = 30% c = 20% View + Controller View + Controller Neue Views können ohne Änderung des Modells oder der anderen Views hinzugefügt werden © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-5 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 X - z Geschachtelte Views: Composite Pattern X - 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). 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). © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-6 - X ROOTS Überblick 1. Einführung 2. Einstiegsbeispiel: "Observer" im Detail 3. Was also sind Patterns? 4. Wichtige Patterns 5 5. Z Zusammenspiel i l verschiedener hi d P Patterns tt 6. Fazit: Nutzen von Patterns 7. Zusammenfassung und Ausblick © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-7 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Observer Pattern Das Observer Pattern: Einführung z Absicht Stellt St llt eine i 1 1-zu-n Beziehung B i h zwischen i h Obj Objekten kt h her Wenn das eine Objekt seinen Zustand ändert, werden die davon abhängigen Objekte benachrichtigt und entsprechend aktualisiert z Andere Namen "Dependents" Dependents , "Publish Publish-Subscribe Subscribe", "Listener" 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 „conflicting fli ti fforces“, “ also l gegenläufig lä fi wirkenden ik d K Kräften. äft © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-10 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% © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-11 ROOTS Das Observer Pattern: Anwendbarkeit a = 50% b = 30% c = 20% Das Pattern ist im folgenden Kontext anwendbar: - z Abhängigkeiten - - a = 50% b = 30% c = 20% Ein Aspekt einer Abstraktion ist abhängig von einem anderen Aspekt 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 ist nicht bekannt, wie viele Objekte geändert werden müssen. z Lose Kopplung Objekte sollen andere Objekte benachrichtigen können, ohne Annahmen j machen zu müssen. über die Beschaffenheit dieser Objekte © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-12 ROOTS Das Observer Pattern: Struktur (N:1 Pull-Modell) (N:1, Pull Modell) 1 * <<interface>> Observer {abstract} Subject subject observers observers.add(o) update() :void attach(o:Observer):void detach(o:Observer):void notify() : void observers.remove(o) ( ) for all o in observers { o.update(); } ConcreteObserver ConcreteSubject {redefines subject} subjectState:State 1 return subjectState; update() :void … subject.getState(); … © 2000-2008 Dr. G. Kniesel getState() : State setState(State s): void subjectState = s; notify() Vorlesung „Softwaretechnologie“ (SWT) Seite 6-13 ROOTS Rollenaufteilung / Verantwortlichkeiten (Pull Modell) z Observer („Beobachter“) -- auch: Subscriber, Listener update() -- auch: handleEvent Ö Reaktion auf Zustandsänderung des Subjects z Subject („Subjekt“) -- auch: Publisher attach(Observer o) -- auch: register, addListener Ö Observer registrieren detach(Observer o) -- auch: unregister, removeListener Ö registrierte Observer entfernen notify() Ö update-Methoden aller registrierten Observer aufrufen setState(…) Ö zustandsändernde Operation(en) Ö für internen Gebrauch und beliebige Clients getState() Ö abfrage des aktuellen Zustands geändert hat Ö damit Observer feststellen können was sich wie g © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-14 ROOTS Das Observer Patterns: Implementierung Wie werden die Informationen über eine Änderung weitergegeben: „push push“ versus „pull pull“ z Pull: Subjekt übergibt in „update()“ „update() keinerlei Informationen, aber die Beobachter müssen sich die Informationen vom Subjekt holen + Geringere Kopplung zwischen Subjekt und Beobachter. – Berechnungen B h werden d hä häufiger fi d durchgeführt. h füh t z Push: Subjekt j übergibt g in Parametern von „„update()“ p () detaillierte Informationen über Änderungen. + Rückaufrufe werden seltener durchgeführt. – Beobachter B b ht sind i d weniger i wiederverwendbar i d db (Abhä (Abhängig i von d den Parametertypen) z Zwischenformen sind möglich © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-15 ROOTS Das Observer Pattern: Struktur (N:1 Push-Modell) (N:1, Push Modell) <<interface>> Observer 1 * {abstract} Subject subject observers observers.add(o) update(StateA) :void observers.remove(o) ( ) ConcreteObserver attach(o:Observer):void detach(o:Observer):void notify() : void ConcreteSubject subjectStateA:StateA subjectStateB:StateB bj tSt t B St t B update(StateA) :void © 2000-2008 Dr. G. Kniesel for all o in observers { o.update(subjectStateA); } Vorlesung „Softwaretechnologie“ (SWT) notify() : void setState(State s): void Seite 6-16 ROOTS Das Observer Pattern: Implementierung z Speicherung der Beziehung zwischen Subjekt und Beobachter Instanzvariable I t i bl im i S Subjekt bj kt oder d ... globale (Hash-)Tabelle z Beobachtung B b ht mehrerer h Subjekte S bj kt Beispiel Tabellenkalkulation: Jede Zelle muss evtl. viele Andere beobachten um sich bei deren Änderun gneu zu berechnen. Realisierung: Die „update()“-Methode muss einen Parameter haben, der das Subjekt angibt, das sich gerade geändert hat. Querbezug zu Pull Pull-Modell: Modell: Der Parameter kann für pull pull-Rückfragen Rückfragen an das Modell genutzt werden (keine fefste Speicherung / Assoziation nötig) Problem: Welchen Typ hat der Parameter? Ö „Object Object“:: Zu unspezifisch, unspezifisch damit kann man nicht viel anfangen Ö Konkreter Subject Typ: Zu spezifisch für andere Subjects © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-17 ROOTS Das Observer Pattern: Implementierung z Vermeidung irrelevanter Notifikationen durch Differenzierung von Ereignissen Bisher: Notifikation bei jeder Änderung Alternative: Beobachter-Registrierung und Notifikation nur für spezielle Ereignisse Realisierung: Differenzierung von attach(), detach(), update() und notify() in jjeweils ereignisspezifische g p Varianten Vorteile: Ö Notifikation nur für relevante Ereignisse Æ höhere Effizienz Ö Weniger „Rückfragen Rückfragen“ pro Ereignis Æ höhere Effizienz Nachteil: Mehr Programmieraufwand, wenn man sich für viele Ereignistypen interessiert Ö Aber: Ab W Werkzeugunterstützung k t tüt möglich ö li h © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-18 ROOTS Das Observer Patterns: Implementierung 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 evtl. überflüssigen Aktualisierungen. b) Klienten: Ö + Mehrere Änderungen können akkumuliert werden. Ö – Klienten vergessen möglicherweise Aufruf von "notify()". z ChangeManager Verwaltet Beziehungen zwischen Subjekt und Beobachter. (Speicherung in Subjekt und Beobachter kann entfallen.) Definiert die Aktualisierungsstrategie Benachrichtigt alle Beobachter. Verzögerte Benachrichtigung möglich Ö Insbesondere wenn mehrere Subjekte j verändert werden müssen,, bevor die Aktualisierungen der Beobachter Sinn macht © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-19 ROOTS Das Observer Pattern: Implementierung z Konsistenz-Problem Zustand Z t d eines i S Subjekts bj kt muss vor A Aufruf f f von "notify()" " tif ()" konsistent k i t t sein. i Vorsicht bei Vererbung bei Aufruf jeglicher geerbter Methoden die möglicherweise „notify()“ -aufrufen : public class MySubject extends SubjectSuperclass { public void doSomething(State p g( newState) ) { super.doSomething(newState); // ruft "notify()" auf this.modifyMyState(newState); // zu spät! } } z Lösung Dokumentation von „notify()“-Aufrufen erforderlich (Schnittstelle!) Besser: In Oberklasse „Template-Method Pattern“ anwenden um sicherzustellen,, dass „notify()“-Aufrufe „ y() immer am Schluss einer Methode stattfinden Æ s. nächste Folie. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-20 ROOTS Das Observer Pattern: Implementierung Verwendung von „Template Method Pattern“ Template Method public bli class l S bj tS SubjectSuperclass l { ... final public void doSomething(State newState) { this.doItReally(newState); this.notify(); // notify immer am Schluß } public void doItReally(State newState) { } } Hook Method public class MySubject extends SubjectSuperclass { public void doItReally(State newState) { this.modifyMyState(newState); } } © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-21 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Konsequenzen von Observer für Abhängigkeiten Für Abhängigkeitsreduzierung allgemein Für Presentation-Application-Data (PAD) Für Boundary-Controller-Entity (BCE) Für Model-View-Kontroller (MVC) PAD versus BCE versus MVC Nächste Doppelstunde Abhängigkeiten mit und ohne Observer Ohne Observer: Abhängigkeit View Å Model z Ein Ei kkonkretes k t Model M d l kkenntt d das IInterface t f eines i jeden j d kkonkreten k t Vi View und steuert was genau jeder der Views nach einem update tun soll: myGraphView1.setGraph(this.toPieChart()); y p p ( ()); myGraphView1.draw(); y p (); myGraphView2.setGraph(this.toBarChart()); myGraphView2.draw(); … myTextViewN.print(myState.toString()); T tVi N i t( St t t St i ()) :TextViewN GraphView1 p GraphView… … :GraphView1 :Model setState(…) Model update() GraphViewJ setGraph(BarChart tG h(B Ch t p)) draw() TextView1 TextView… print() TextViewN print() print() setState(…) update() p () toPieChart() toBarChart() toString() pie=toPieChart() setGraph(pie) draw() s = toString() print(s) Abhängigkeiten mit und ohne Observer Mit Observer: Abhängigkeit View Æ Model z Ein Ei kkonkretes k t Model M d l kkenntt nur d das abstrakte b t kt Observer-Interface Ob I t f z Ein konkreter View kennt die zustandsabfragenden Methoden des konkreten Models model.getState1(); model.getState2(); <<interface>> Observer 1 * observers Subject :Model :View subject attach(this) attach(o:Observer) detach(o:Observer) notify() update() p () :void setState() for all o in observers { o.update(); } notify() update() View Model {redefines subject} getState() subjectState:State 1 update() :void getState() : State setState(State s) subject.getState(); … © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-24 ROOTS Nettoeffekt: Abhängigkeits- und Kontrollumkehrung Abhängigkeitsumkehrung („Dependency Inversion Inversion“)) Kontrollumkehrung („Inversion of Control Control“)) z Ohne Observer z Ohne Observer Abhängigkeit Model Æ Views z Mit Observer Model steuert alle updates z Mit Observer Abhängigkeit Model Å Views Vergleich Ablauf ohne / mit Observer :TextViewN … :GraphView1 :Model Jeder View steuert sein update :Model :View setState(…) attach(this) setState() update() pie=toPieChart() setGraph(pie) notify() update() draw() getState() s = toString() print(s) Auswirkungen von Observer auf „Presentation Presentation-Application-Data“-Ebenen Application Data Ebenen z n-tier-Architekturen basieren auf der rein hierarchische Anordnung von Presentation Anwendungslogik und Datenhaltung Presentation, Präsentation ConcreteObserver Anwendungslogik Datenhaltung ConcreteSubject AbstractSubject AbstractObserver z Die Aktualisierung der Präsentation bei Änderung Ä der Daten ist durch das Observer-Pattern möglich, ohne dass die Daten von der Präsentation wissen müssen. Sie sind nur von dem AbstractObserver abhängig. Wenn dessen Definition in der Datenschicht angesiedelt ist, wird die Ebenenanordnung nicht verletzt © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-26 ROOTS Auswirkungen von Observer für „Boundary Boundary-Controller-Entity“ Controller Entity Stereotypen z Die Abhängigkeitsreduzierung ist die gleiche wie bei den Presentation- Application Data Ebenen der N Application-Data N-Ebenen-Architekturen Ebenen Architekturen Boundaries ConcreteObserver Controllers Entities ConcreteSubject AbstractSubject AbstractObserver z Der einzige Unterschied zwischen BCE und PAD ist die Gruppierung: BCE beschreibt lediglich die Funktionen einzelner Objekttypen (Es sagt pp g in Ebenen aus)) nichts über ihre Gruppierung PAD sagt etwas über die Gruppierung von Objekttypen gleicher Funktion: Ö Alle Boundaries mit GUI-Funktionalität in der Präsentationsschicht Ö Alle Controller in der Anwendungslogik Anwendungslogik-Schicht Schicht Ö Alle Entities in der Datenhaltungs-Schicht © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-27 ROOTS Auswirkungen von Observer für Model View Controller Model-View-Controller z Views sind immer Boundaries und Observer Sonst S t könnten kö t Sie Si ihre ih F Funktion kti nicht i ht erfüllen füll Das schließt nicht aus, dass sie eventuell noch andere Rollen spielen z Boundaries sind nicht immer Views Beispiel: Tastatur Boundaries / Views ConcreteObserver Controllers / Controllers Entities / Model © 2000-2008 Dr. G. Kniesel ConcreteSubject AbstractSubject Vorlesung „Softwaretechnologie“ (SWT) AbstractObserver Seite 6-28 ROOTS Auswirkungen von Observer für Model View Controller Model-View-Controller z Observer sind nicht immer Views! Auch A hK Kontroller t ll kö können Observer Ob sein! i ! Sie können sich bei einer Menge von Modellelementen als Observer registrieren und deren Veränderungen sammeln, bewerten und gefiltert oder kummuliert weitergeben. Ö Aktive Weitergabe: Aufruf / Steuerung von Aktionen anderer Objekte („Kontroller“-Rolle) Ö Passive Weitergabe: Beachrichtigung von eigenen Observern („Modell“-Rolle) Ö Siehe auch „Mediator-Pattern“ („Vermittler“) Das g gleiche g gilt auch für andere Modellelemente / Entities: auch sie können Observer von anderen Objekten sein. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-29 ROOTS Das Observer Pattern: Konsequenzen z Unabhängigkeit Konkrete K k t Beobachter B b ht können kö hi hinzugefügt fü t werden, d ohne h kkonkrete k t S Subjekte bj kt oder andere konkrete Beobachter zu ändern. Konkrete Subjekte können unabhängig voneinander und von konkreten Beobachtern variiert werden. Konkrete Subjekte können unabhängig voneinander und von konkreten Beobachtern wiederverwendet werden. z Abstrakte Kopplung Subjekte S bj kt aus tieferen ti f S Schichten hi ht eines i S Systems t kö können mit it B Beobachtern b ht aus höheren Schichten kommunizieren, ohne die Schichten zu verletzen. Präsentation ConcreteObserver Anwendungslogik D Datenhaltung h l © 2000-2008 Dr. G. Kniesel C ConcreteSubject t S bj t Ab t AbstractSubject tS bj t Vorlesung „Softwaretechnologie“ (SWT) Ab t AbstractObserver tOb Seite 6-30 ROOTS Das Observer Pattern: Konsequenzen z „Broadcast“-Nachrichten Subjekt S bj kt benachrichtigt b h i hti t alle ll angemeldeten ld t B Beobachter b ht Beobachter entscheiden, ob sie Nachrichten behandeln oder ignorieren z Unerwartete Aktualisierungen Kleine Zustandsänderungen des Subjekts können komplexe Folgen haben. Auch uninteressante Zwischenzustände können unnötige Aktualisierungen auslösen. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-31 ROOTS Das Observer Pattern: Bekannte Anwendungen z Bekannte Anwendungen Model-View-Controller-Framework M d l Vi C t ll F k in i Smalltalk S llt lk Java Foundation Classes / Swing Oberon System y Diverse Client/Server-Modelle, z.B. Java RMI © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-32 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste 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 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 a relation between a certain context, a certain system of forces which occurs repeatedly in that context, context and a certain software configuration which allows these forces to resolve themselves." Richard Gabriel, on the Patterns Home Page © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-37 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: Ein großes OO-System in einem Rechner mit virtuellem Speicher. z Lösung: Führe einige typische Anwendungen durch und stelle fest, welche Objekte häufig miteinander kommunizieren. Plaziere diese Objekte j auf derselben Seite im virtuellen Speicher. p Begründung z Das D iistt kkein i P Pattern tt - es ist i t "nur" " " eine i Lö Lösung fü für ein i P Problem bl iin einem i Kontext. z Damit es zu einem Pattern werden kann,, muss ein Lösungsprinzip g p p abstrahiert werden, das auch für andere wiederkehrende Probleme in ähnlichen Kontexten eingesetzt werden kann. Bestandteile eines Patterns: Kontext, Problem Randbedingungen Problem, z Kontext Die Vorbedingungen unter denen das Pattern benötigt wird 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 b ti bestimmten t Randbedingungen/Kräften R db di /K äft erreicht i ht werden d sollen. ll 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 diese miteinander interagieren und im Konflikt stehen. Die daraus entstehenden Kosten. Typischerweise durch ein motivierendes Szenario illustriert illustriert. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-39 ROOTS Bestandteile eines Patterns: Lösung z Die Lösung wird idb beschrieben hi b d durch h di die T Teilnehmer, il h ih ihre R Rollen, ll ih ihre statischen t ti h Beziehungen und dynamische Zusammenarbeit z Teilnehmer Die Typen (Interfaces und Klassen) die in der Lösung eine Rolle spielen. z Rollen Alle All N Namen iin d der B Beschreibung h ib eines i P Patterns tt b bezeichnen i h nur di die R Rollen ll der entsprechenden 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)! © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-40 ROOTS Bestandteile einer Pattern-Beschreibung z Name des Patterns z Problem, P bl d vom P das Pattern tt gelöst lö t wird id z Kontext, in dem das Pattern angewendet werden kann z Randbedingungen/Kräfte (forces), (forces) die das Pattern beeinflussen z Lösung. Beschreibung, wie das gewünschte Ergebnis erzielt wird z Beispiele p der Anwendung g der Lösung g z Resultierender Kontext aus der Anwendung des Patterns z Erläuterung (rationale), warum das Pattern funktioniert z Bezug zu anderen Patterns z Bekannte Verwendungen des Patterns © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-41 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Klassifikation Danach, was sie modellieren Danach, wie sie es modellieren Danach, wo sie meist eingesetzt werden "Gang of Four"-Patterns: Überblick und Klassifikation Verhalten Struktur z Visitor z Composite z Observer z Flyweight z Command z Template Method Bisher z Chain of Responsibility z Decorator z State z Proxy z Strategy z Adapter z Multiple M lti l V Vererbung b z Bridge z Facade Split Objects z Factory Method z Prototype z Abstract Factory z Singleton z Builder Objekt-Erzeugung Jetzt 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 S lit Object Obj t Patterns P tt Ziel: Dynamisch änderbares Verhalten, gemeinsame Verwendung oder Entkopplung von Teilobjekten Weg: Aufteilung eines konzeptionellen Gesamtobjektes in modellierte Teilobjekte die kooperieren um das Verhalten des konzeptionellen Gesamtobjektes j zu realisieren z Erzeugungs-Patterns Flexibilität indem die Festlegung von konkret zu erzeugenden Objekte (new XYZ()) so weit wie möglich verzögert wird und evtl evtl. sogar zur Laufzeit immer noch verändert werden kann. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-44 ROOTS Klassifikation von Entwurfsmustern (Fortsetzung) z Klassifikation danach was modelliert wird (vorherige Folien) Struktur, St kt Verhalten, V h lt Obj Objekterzeugung kt z Klassifikation danach, wie etwas modelliert wird (vorherige Folien) Whole Objects: 1:1-Entsprechung 1:1 Entsprechung von konzeptuellen Objekten und Implementierungs-Objekten Split Objects: Aufteilung eines konzeptuellen Objektes in verschiedene Implementierungs-Objekte Implementierungs Objekte, dynamisch veränderbare Anteile oder Gemeinsamkeiten verschiedener konzeptueller Objekte darstellen z Klassifikation danach, wo sie meist eingesetzt werden Systementwurf, zur Verbindung / Abgrenzung von Subsystemen Ö Facade, Adapter, Bridge, Proxy, Singleton (zusammen mit Facade) , Observer Objektentwurf j Ö Observer, Command, Factory Method, Abstract Factory, Composite, Visitor Entsprechende Aufteilung der Foliensätze / Kapitel Ö Dieser Foliensatz: Entwurfsmuster-Einführung (Kapitel 4 4.)) Ö Systementwurf und Systementwurfs-Muster (Kapitel 5.) Ö Objektentwurf und Objektenwurfs-Muster (Kapitel 6.) Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Wichtige Design Patterns Patterns, Teil 1 - System Design Patterns - Facade Singleton Adapter Proxy Bridge Patterns für Subsysteme (Æ siehe „Systementwurf Systementwurf“) ) z Facade Subsystem S b t abschirmen b hi z Singleton Nur eine einzige Facade-Instanz Facade Instanz erzeugen z Adapter Anpassung der realen an die erwartete Schnittstelle z Proxy Stellvertreter für entferntes Subsystem z Bridge Entkopplung der Schnittstelle von der Implementierung © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-48 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Facade Pattern Facade Pattern z Absicht Menge g von Interfaces eines Subsystems y zusammenfassen Abhängigkeiten der Clients von der Struktur des Subsystems reduzieren client classes client classes Facade subsystem classes subsystem classes z Motivation / Beispiel p Compiler mit Subsystemen Ö Scanner Ö ... Ö CodeGenerator © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-50 ROOTS Facade Pattern: Beispiel Compiler compiler subsystem classes compile() St Stream BytecodeStream CodeGenerator StackMachineCodeGen StackMachineCodeGen. © 2000-2008 Dr. G. Kniesel S Scanner T k Token Parser Symbol ProgramNodeBuilder StatementNode ProgramNode ExpressionNode VariableNode RISCCodeGenerator Vorlesung „Softwaretechnologie“ (SWT) Seite 6-51 ROOTS Facade Pattern: Anwendbarkeit z Einfaches Interface zu einem komplexen Subsystem Einfache Ei f h Dinge Di einfach i f h realisierbar li i b ((aus Cli Client-Sicht) t Si ht) Anspruchsvolle Clients dürfen auch "hinter die Facade schauen" Ö zB für seltene, komplexe Anpassungen des Standardverhaltens z Viele Abhängigkeiten zwischen Klassen Reduzieren R d i d durch hF Facade-Objekte d Obj kt z Hierarchische Strukturierung g eines System y Eine Facade als Einstiegspunkt in jede Ebene © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-52 ROOTS Facade Pattern z Implementierung: Konfigurierbarkeit einer Facade Eigene Ei F Facade-Subklasse d S bkl pro K Konfiguration fi ti oder andere Subsystem-Objekte y j instantiieren z Abgrenzung: Singleton Facaden sind meist Singletons S (man ( braucht nur eine einzige)) z Abgrenzung: Abstract Factory Zur Erzeugung konsistenter Sätze von Subsystem-Objekten Als Alternative zu Facade Æ "Verstecken" plattform-spezifischer Klassen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-53 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Anwendung von „Facade Facade“ zur Subsystemrealisierung Ein Rückblick auf die Folien 5-22 bis 5-25 Naive System-Dekomposition: nur Gruppierung (mit Packages) Subsystem 1 Subsystem 5 Subsystem 2 Subsystem 3 Subsystem 4 Subsystem y 6 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-55 ROOTS System-Dekomposition: Dienste und Komponenten Subsystem 1 Subsystem 5 Subsystem 2 Subsystem 3 Subsystem 4 Subsystem y 6 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-56 ROOTS System-Dekomposition: DiensteRealisierung mit Facades Subsystem 1 <<Facade>> Subsystem 5 Subsystem 2 Subsystem 3 <<Facade>> <<Facade>> Subsystem 4 Subsystem y 6 <<Facade>> © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-57 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Singleton Pattern Singleton: Motivation z Beschränkung der Anzahl von Exemplaren zu einer Klasse z Meist: nur ein einzelnes Exemplar Z.B. Z B Facade, Facade Repository Repository, System System, Factory (vgl (vgl. Abstract Factory) z Aber auch: feste Menge von Exemplaren Motivation 1: begrenzte Ressourcen. Motivation 2: Teure Objekterzeugung durch „Object Pool“ vermeiden Æ z.B. z B 1000 Enterprise Java Beans vorhalten vorhalten, nach Nutzung zurück in den Pool © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-59 ROOTS Singleton: Struktur + Implementierung Besitzt nur private Konstruktoren: Singleton getInstance() instanceOperation() -instancePool -instanceData private Singleton() { this.Singleton(arg1, ..., argN); } Liefert eine Instanz (typischerweise immer die private Singleton(...) { Selbe): ... } public static Singleton getInstance() { if (instancePool == null) Speichert die einzige instancePool = new Singleton(); return instancePool; Instanz oder begrenzte g } Menge an Instanzen z Nur private Konstruktoren dadurch d d h wird i d verhindert, hi d d dass Cli Clients b beliebig li bi viele i l IInstanzen erzeugen können in Java muss explizit ein privater Konstruktor mit leerer Argumentliste implementiert werden, damit kein impliziter öffentlicher Konstruktor vom Compiler erzeugt wird g y für alle Singleton-Instanzen g z instancePool als Registry lookup-Mechanismus erforderlich um gezielt eine Instanz auszuwählen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-60 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Proxy Pattern Nächste Doppelstunde Proxy Pattern (auch: Surogate, Smart Reference) z Absicht Stellvertreter St ll t t fü für ein i anderes d Obj Objekt kt bietet Kontrolle über Objekt-Erzeugung und -Zugriff z Motivation kostspielige Objekt-Erzeugung verzögern (zB: große Bilder) verzögerte Objekterzeugung O soll Programmstruktur nicht global verändern z Idee Bild-Stellvertreter (Proxy) verwenden Bild-Stellvertreter verhält sich aus Client-Sicht wie Bild Bild-Stellvertreter erzeugt Bild bei Bedarf aTextDocument image anImageProxy file anImage Hauptspeicher © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Platte Seite 6-62 ROOTS Proxy Pattern: Beispiel <<interface>> * Graphic DocumentEditor draw() getExtent() store() load() Image <<creates>> imageData extent draw() getExtent() store() load() © 2000-2008 Dr. G. Kniesel ImageProxy fileName extent image draw() getExtent() store() load() Vorlesung „Softwaretechnologie“ (SWT) if (image == 0){ image = loadImage(filename); } image.draw() if (image == 0){ return extent; } else { return image.getExtent(); } Seite 6-63 ROOTS Proxy Pattern: Schema <<interface>> * Client Subject j request() ... RealSubject realSubject Proxy request() ... request() ... aRealSubject aProxy ← request() © 2000-2008 Dr. G. Kniesel ... realSubject request(); realSubject.request(); ... q () ← request() Vorlesung „Softwaretechnologie“ (SWT) aClient Seite 6-64 ROOTS Proxy Pattern: Verantwortlichkeiten z Proxy bietet bi t t gleiches l i h IInterface t f wie i "S "Subject" bj t" referenziert eine "RealSubject"-Instanz kontrolliert alle Aktionen auf dem "RealSubject" j z Subject definiert f das gemeinsame Interface f z RealSubject das Objekt das der Proxy vertritt eigentliche Funktionalität z Zusammenspiel selektives Forwarding © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-65 ROOTS Proxy Pattern: Anwendbarkeit z Virtueller Proxy verzögerte g Erzeugung g g "teurer" Objekte j bei Bedarf Beispiel: Bilder in Dokument, persistente Objekte z Remote Proxy Zugriff auf entferntes Objekt Objekt-Migration Beispiele: e sp e e CO CORBA,, RMI,, mobile ob e Agenten ge te z Concurrency Proxy nur eine direkte Referenz auf RealSubject locking des RealSubjects vor Zugriff (threads) z Copy-on-Write kopieren k i erhöht höht nur iinternen t "C "CopyCounter" C t " wirkliche Kopie bei Schreibzugriff und "CopyCounter">0 Î Verzögerung teurer Kopier-Operationen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-66 ROOTS Proxy Pattern: Anwendbarkeit z Protection Proxy (Zugriffskontrolle) Schmaleres S h l IInterface t f Ö "Kritische" Operationen ausgeblendet Ö andere via Forwarding implementiert ganz anderes Interface Ö Autorisierung prüfen Ö direkten Zugriff gewähren oder Forwarding Beispiel: "CHOICES" Betriebssystem, JDK © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-67 ROOTS Protection-Proxy im JDK (ab 1.2): GuardedObject z Problem Sichere Weitergabe eines schützenwerten Objektes an unbekannten Empfänger Objektspezifische Zugriffsrechte 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, 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! © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-68 ROOTS Proxy Pattern: Implementierung z „Consultation“ Allgemein: manuell erstellte Forwarding-Methoden Forwarding Methoden C++: Operator-Overloading Ö Proxy redefiniert Dereferenzierungs-Operator:*anImage Ö Proxy redefiniert Member-Accesss-Operator:anImage->extent() Smalltalk: Reflektion Ö Proxy redefiniert Methode "doesNotUnderstand: aMessage" Lava: eigenes Sprachkonstrukt Ö Proxy deklariert "consultee"-Variable class Proxy { private consultee RealImage realImage; ... } z Falls der Typ von "RealSubject„ dem Proxy bekannt sein muß: Je eine spezifische Proxy-Klasse für jeden RealSubject-Typ z ... dem Proxy nicht bekannt sein muß: Nur eine Proxy-Klasse für verschiedene RealSubject-Typen Ö Beispiel: B i i l „Guarded G d d Object“ Obj t“ (vorherige ( h i F Folie) li ) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-69 ROOTS Proxy Pattern: Implementierung z Refenrenzierung des RealSubject vor Instantiierung OrtsO t und dZ Zeit-unabhängige it bhä i "E "Ersatz-Referenzen" t R f " Beispiele Ö Dateinamen Ö CORBA IOR (Interoperable Object Reference) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-70 ROOTS Proxy Pattern: Abgrenzung z Proxy z Decorator gleiches l i h IInterface t f kontrolliert Zugriff p g "Implementierungs-Detail" gleiches l i h IInterface t f zusätzliche / veränderte Funktion "konzeptionelle Eigenschaft" z Adapter verschiedenes Interface ähnlich Protection-Proxy © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-71 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste 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, Rechtecke, ... Ö durch "BoundingBox" beschrieben Textelemente sollen auch möglich sein Ö Klasse TextView vorhanden Ö bietet keine "BoundingBox"-Operation Integration 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 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-73 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() © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-74 ROOTS Adapter Pattern (Objekt-Adapter): Schema adaptee Client Target Adaptee request() other() f() f() Adaptee_N … Adapter … request() f() adaptee.other() :Client :Adapter :Adaptee_N request() other() f() © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-75 ROOTS Adapter Pattern (Objekt-Adapter): Konsequenzen adaptee Client Target Adaptee request() other() f() f() Adaptee_N … Adapter … request() f() adaptee.other() d t th () z Adaptiert eine ganze Klassenhierarchie Beliebige Adapter Adapter-Subtypen Subtypen können mit beliebigen Adaptee-Subtypen 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 p für den f()-Aufruf () aus der Methode other() () verwendet (Æ siehe Objektdiagram auf vorheriger Folie) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-76 ROOTS Adapter Pattern (Object Adapter): Variante Client Target request() q () Adapter Adaptee adaptee other() f() f() … Adaptee_N … …‘‘ Ad t Adaptee_N‘ N‘ …‘‘ f() f() f() request() f() z Object Adapter mit Overriding zu Adaptee und jede Unterklasse des Adaptees eine weitere Unterklasse einfügen, in die das redefinierte Verhalten eingefügt wird (also z.B. f()) Ö Warum neue Unterklassen? Weil die Adaptee-Hierarchie Adaptee Hierarchie nicht veränderbar ist! Problem: Redundanz! Ö Was konzeptionell nur ein mal in Adapter stehen sollte wird in jeder neuen U t kl Unterklasse von Adaptee Ad t redundant d d t eingefügt i fü t Æ Wartungsprobleme! W t bl ! © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-77 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() f() f() Adaptee_N … <<implementation p inheritance>> Adapter request() f() :Client … anAdaptedAdaptee:Adapter request() other() f() Class Adapter Idiom: Konsequenzen Client Target Adaptee request() other() () f() f() Adaptee_N … <<implementation inheritance>> Adapter request() f() :Client … anAdaptedAdaptee:Adapter z O Overriding des 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 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-79 ROOTS Adapter Pattern: Konsequenzen z Class Adapter Client adaptiert nur eine Klasse ... nicht ihre Unterklassen Overriding des Adaptee-Verhaltens leicht möglich keine zusätzliche ä Indirektion (nur ( ein Objekt) O ) z Object j Adapter adaptiert eine ganze Klassenhierarchie Overriding schwieriger :Client Target g request() Adapter request() q () Adaptee f() m() Adapt_N f() m() :Adapter :Adaptee Ö redefiniertes Verhalten in spezifische Unterklasse des Adaptees einfügen Ö 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 O erriding des Adaptee-Verhaltens Adaptee Verhaltens leicht möglich © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-80 ROOTS Adapter Pattern: Pluggable Adapters z Motivation TreeDisplay T Di l sollll beliebige b li bi Baumstrukturen B t kt darstellen d t ll Beispiel: Datei-Hierarchie, Vererbungs-Hierarchie z Idee Schnittstellen-Anpassbarkeit in TreeDisplay "einbauen" Minimales Interface f identifizieren f das TreeDisplay von den angezeigten Entities kennen muss Adaptierbarkeit dieses Interface an verschiedene Hierarchien vorsehen z Implementierungsvarianten Vererbung Vererb ng Simulierte Delegation Parametrisierung mit "Blöcken" © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-85 ROOTS a) Pluggable Adapter mit Vererbung und Abstrakten Operationen <<Client, Target>> TreeDisplay getChildren (Node) createGraphicNode(Node) display() buildTree ((Node n)) z Anpassungs-Interface ist Teil des TreeDisplay Abstrakte Ab t kt M Methoden th d z Adapter sind Unterklassen von TreeDisplay <<Adapter>> DirectoryTreeDisplay <<Adaptee>> FileSystemEntity getChildren (Node) createGraphicNode(Node) getChildren(n) for each child { addGraphicNode( createGraphicNode(child)) buildTree(child) } Was, wenn ich die Art der Anzeige zur La f eit ändern Laufzeit will? b) Pluggable Adapter mit „Delegate Objects Objects“ <<Client>> delegate TreeDisplay <<Target>> TreeAccessorDelegate setDelegate(Delegate) display() buildTree (Node n) getChildren (TreeDisplay, Node) createGraphicNode(TreeDisplay, Node) <<Adapter>> backreference DirectoryBrowser <<Adaptee>> FileSystemEntity getChildren (TreeDisplay, Node) createGraphicNode(TreeDisplay, Node) createFile() () deleteFile() z delegate.getChildren(this,n) for each child { addGraphicNode( d l delegate.createGraphicNode(this,child)) t t G hi N d (thi hild)) buildTree(child) } Eigenes Anpassungs Anpassungs-Interface Interface Abstrakte Methoden z z Adapter implementieren Interface Adapter muessen an TreeDisplay rückfragen können, um dessen Operationen zu nutzen c) Pluggable Adapter Idiom in Smalltalk und Java Smalltalk Pseudo-Java ValueModel ValueModel value: value setValue() getValue() adaptee adaptee PluggableAdaptor Objekt PluggableAdaptor getBlock setBlock getBlock setBlock value: value setValue(Oject val) getValue() Objekt GetBlock getValue(Obj) SetBlock setValue(Obj,Val) ^getBlock value: adaptee return getBlock.getValue(adaptee) Blöcke in Smalltalk und Java z Smalltalk Blöcke Blö k sind i d Obj Objekte kt di die auff di die N Nachricht h i ht „value“ l “ reagieren i Ö Analog zu einem „Command“-Objekt das auf „run“ reagiert Blöcke können auf den Kontext zugreifen, in dem Sie definiert wurden! Ö können z.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). © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-89 ROOTS Adapter Pattern: Pluggable Adapter Implementierung z Vererbung manchmal h l zu starr t z Simulierte Delegation flexibler, da Anpassungsstrategie austauschbar z Parametrisierung mit "Blöcken" flexibelste Variante leider nur Smalltalk-Idiom „Innere Klassen“ in Java haben nicht die Ausdruckskraft von Smalltalk- Blöcken © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-90 ROOTS Adapter Pattern: Abgrenzung z Bridge z Decorator gleiches l i h IInterface t f kontrolliert Zugriff p g "Implementierungs-Detail" gleiches l i h IInterface t f zusätzliche / veränderte Funktion "konzeptionelle Eigenschaft" z Adapter verschiedenes Interface ähnlich Protection-Adapter © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-91 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Bridge Pattern Nächste Doppelstunde Bridge Pattern (auch: Handle / Body) z Absicht Schnittstelle S h itt t ll und d Implementierung I l ti trennen t ... 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: – – – – – © 2000-2008 Dr. G. Kniesel X-Windows, X Wi d IBM Presentation Manager, MacOS, Windows XYZ,, ... Vorlesung „Softwaretechnologie“ (SWT) Seite 6-93 ROOTS Bridge Pattern: Warum nicht einfach Vererbung einsetzen? Neue Fenster-Art: "iconifizierbare" Fenster Window XWindow PMWindow Window XWindow z Probleme dieses Lösungsversuchs PMWindow IconWindow XIconWindow PMIconWindow 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 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-94 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() IconWindow TransientWindow XWindowImp PMWindowImp drawBorder() drawCloseBox() devDrawText() devDrawLine() devDrawLine() devDrawText() XDrawLine() XDrawString() drawRect() drawText() © 2000-2008 Dr. G. Kniesel drawRect() Vorlesung „Softwaretechnologie“ (SWT) Seite 6-95 ROOTS Bridge Pattern: Schema Client Abstraction imp Implementor operation() basicOperation() imp.basicOperation() RefinedAbstraction © 2000-2008 Dr. G. Kniesel ConcreteImplementorA ConcreteImplementorB basicOperation() basicOperation() Vorlesung „Softwaretechnologie“ (SWT) Seite 6-96 ROOTS Bridge Pattern: Anwendbarkeit z Dynamische Änderbarkeit Implementierung I l ti erstt zur Laufzeit L f it auswählen ähl z Unabhängige Variabilität neue Unterklassen in beiden Hierarchien beliebig kombinierbar z Implementierungs-Transparenz für Clients Änderungen der Implementierung erfordern keine Änderung / N üb Neuübersetzung t d der Cli Clients t z Vermeidung von "Nested Generalisations" keine Hierarchien der Art wie in der Motivations-Folie Motivations Folie gezeigt keine kombinatorische Explosion der Klassenanzahl z Sharing mehrere Clients nutzen gleiche Implementierung z.B. Strings © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-98 ROOTS Bridge Pattern: Implementierung Client Abstraction Implementor imp ... Instantiierung des richtigen ConcreteImplementors z Falls Abstraction alle ConcreteImplementor-Klassen kennt: Fallunterscheidung a u te sc e du g im Konstruktor o st u to de der Co ConcreteAbstraction c ete bst act o Auswahl des ConcreteImplementor anhand von Parametern des Konstruktors Alternativ: Default-Initialisierung 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 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-99 ROOTS Bridge Pattern: Abgrenzung z Bridge z Adapter antizipierte ti i i t E Entkopplung tk l von Schnittstelle und Implementierung nachträgliche ht ä li h A Anpassung d der Schnittstelle einer Implementierung z Abstract Factory nutzbar zur Erzeugung und Konfiguration einer Bridge © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-100 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Wichtige Design Patterns Patterns, Teil 2 - Object Design Patterns - Command, Factory Method, Abstract Factory, Composite, Visitor „„Patterns Create Architectures“ Rückblick: „Was nutzen Patterns?“ Das Command Pattern: Motivation z Kontext GUI-Toolkits GUI T lkit mit it Buttons, Menüs, etc. z Forces Vielfalt trotz Einheitlichkeit Ö Einheitlicher Code in allen GUI-Elementen Ö .. trotzdem verschiedene Effekte Wiederverwendung Ö Über verschiedene GUI-Elemente ansprechbare Operationen nur ein mal programmieren Dynamik Ö dynamische Änderung der Aktionen von Menu-Einträgen Ö kontext-sensitive Aktionen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-102 ROOTS Das Command Pattern: Idee z Operationen als Objekte mit Methode execute() darstellen z in i d den GUI GUI-Elementen El t speichern i h Application Menu MenuItem add(Document) add(Menuitem) clicked() Command execute() Document open() close() cut() copy() paste() Einheitlicher Aufruf Command -> execute document Verschiedene Implementierungen p g PasteCommand execute() t () Document -> Paste © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-104 ROOTS Das Command Pattern: Rollen und ihre Verantwortlichkeiten z Command Interface Schnittstelle, S h itt t ll die di festlegt, f tl t was Commands C d tun t können kö Mindestens Execute (s.u.), optional auch Undo, Redo (s.u.) z Execute-Method Methode, die das Ausführen von Kommandos ermöglicht z Undo-Method Methode, die das Rückgängig machen von Kommandos ermöglicht z Redo Redo-Method Method Methode, die ein rückgängig gemachtes Kommando wieder ausführt z Concrete Command Implementiert Command Interface „Controllers Controllers“ sind oft als „Commands Commands“ implementiert © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-106 ROOTS Das Command Pattern: Anwendbarkeit z Operationen als Parameter z Variable Aktionen referenziertes Command-Objekt austauschen z Zeitliche Trennung Befehl zur Ausführung, Protokollierung, Ausführung z Speicherung und Protokollierung von Operationen History History-Liste Liste Serialisierung z "Undo" von Operationen Command-Objekte C O enthalten neben execute() () auch unexecute() () werden in einer History-Liste gespeichert z Recover-Funktion nach Systemabstürzen History-Liste wird gespeichert Zustand eines Systems ab letzter Speicherung wiederstellbar z Unterstützung von Transaktionen Transaktionen können sowohl einfache ("primitive"), als auch komplexe CommandObjekte sein. Implementierung des Command Patterns z Unterschiedliche Grade von Intelligenz Command Command-Objekte Objekte können "nur" nur Verbindung zwischen Sender und Empfänger sein sein, oder aber alles selbstständig erledigen. z Unterstützung von "undo" Semantik S tik Ö 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 werden. Ö Typischerweise: Kopien des alten Zustands der Objekte die wiederhergestellt werden sollen. History History-Liste 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 "tief" Clonen, um sicherzustellen dass sein Zustand nicht verändert wird. Das Command Pattern: Konsequenzen z Entkopplung von Aufruf A f f einer i Operation O ti und d Spezifikation S ifik ti einer i O Operation. ti z Kommandos als Objekte Command Command-Objekte Objekte können wie andere Objekte auch manipuliert und erweitert werden. z Komposition Folgen F l von Command-Objekte C d Obj kt kö können zu weiteren it C Command-Objekten d Obj kt zusammengefasst werden. z Erweiterbarkeit Neue Command-Objekte können leicht hinzugefügt werden, da keine Klassen geändert werden müssen. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-109 ROOTS Patterns-Überblick Verhalten Struktur z Visitor z Composite z Observer z Flyweight z Command z Template Method z Chain of Responsibility z Decorator z State z Adapter z Strategy z Proxy z Multiple Vererbung z Bridge z Facade Split Objects z Factory Method z Prototype yp z Abstract Factory z Singleton z Builder Objekt-Erzeugung Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste Das Command und Observer Pattern in Java 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) : MyPasteCommand ← registerKeyboardAction(ActionListener, KeyStroke, ...) Observer Buttons, Menue-Einträge und Tasten generieren "ActionEvents" Interface "ActionListener" ist vordefiniert Î "ActionListener" ActionListener implementieren Î ... und Instanzen davon bei Buttons, MenuItems, etc registrieren 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 Verbindung von Observer und Command in Java (2) z Zusätzliche Unterstützung für <<interface>> ActionListener "Command" Command Aktivierung Akti i / Deaktivierung von MenuItems d denen di diese "Action" zugeordnet ist ... Parameter können allerdings ll di auch direkt als InstanzVariablen realisiert werden. void actionPerfomed(ActionEvent evt) <<extends>> <<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) <<implements>> AbstractAction // alles ausser void actionPerfomed(ActionEvent evt) <<extends>> MyPasteCommand void actionPerfomed(ActionEvent evt) im m JDK enthalten Interface "Action" und Klasse "AbstractAction" 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(); i () } p private ate Co Component po e t ta target; get; private Color color; } z ColorAction class ActionButton extends JButton { public ActionButton(Action a) { ... addActionListener(a); } } Ändern der Hintergrundfarbe einer GUI-Komponente z ActionButton Buttons die sofort bei Erzeugung mit einer Action verknüpft werden Beispiel: Änderung der Hintergrundfarbe (2) z Nutzung der ColorAction Erzeugung E einer i IInstanz t Registrierung class SeparateGUIFrame extends JFrame { public SeparateGUIFrame() { ... JPanel panel = new JPanel(); Action blueAction = new ColorAction("Blue", ...,..., panel); panel registerKeyboardAction(blueAction panel.registerKeyboardAction(blueAction,...); ); panel.add(new ActionButton(blueAction)); JMenu menu = new JMenu("Color"); menu.add(blueAction); ... } } Beispiel und Erläuterung siehe: "Core Java 2", Kapitel 8, Abschnitt "Separating GUI and Application Code". Fazit 9 Elegante Verbindung von Observer und Command Commands C d sind i d ActionListener A ti Li t von Buttons, B tt Menus, M etc. t Ö 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 k i t t für fü alle ll b betroffenen t ff M MenuItems, It B tt Buttons, etc.??? t ??? Î Strategy gy Pattern! © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-117 ROOTS "Gang of Four"-Patterns: Überblick und Klassifikation Verhalten z Visitor Struktur z Composite z Observer z Flyweight z Command z Template Method z Chain of Responsibility z Decorator z State z Proxy z Strategy z Adapter z Multiple Vererbung z Bridge z Facade Jetzt Split Objects z Factory Method z Prototype yp z Abstract Factory z Singleton z Builder Objekt-Erzeugung Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste Das Factory Method Pattern ROOTS Factory Method z Ziel Entscheidung E t h id über üb konkreter k k t Klasse Kl neuer Objekte Obj kt verzögern ö z Motivation Framework mit vordefinierten Klassen "Document" und "Application" Template-Methode, für das Öffnen eines Dokuments: Ö 1. 1 Ch Check k ob bD Dokument-Art k t A t bekannt b k t Ö 2. Erzeugung einer Document-Instanz !?! Erzeugung von Instanzen noch nicht bekannter Klassen! z Idee aktuelle kt ll Kl Klasse entscheidet t h id t wann Obj Objekte kt erzeugtt werden d Ö Aufruf einer abstrakten Methode Subklasse entscheidet was für Objekte erzeugt werden Ö implementiert abstrakte Methode passend © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-120 ROOTS Factory Method: Beispiel Framework Document * docs Application newDocument() D t() doCreateDocument() MyDocument Document doc = doCreateDocument(); docs.add(doc); doc.open(); MyApplication doCreateDocument() Applikation return new MyDocument() Factory Method: Schema Creator Product anOperation() factoryMethod() ConcreteProduct ... product = factoryMethod(); ... ConcreteCreator factoryMethod() return new ConcreteProduct() z Factory Method kann abstrakt sein kann Default-Implementierung haben z Creator C t (Aufrufer (A f f der d Factory F t M th d) Method) kann Klasse sein, die die Factory Method definiert kann Client-Klasse sein Ö Beispiel: parallele Vererbungs-Hierarchien © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-122 ROOTS Factory Method: Anwendbarkeit z Klasse neuer Objekte unbekannt z Verzögerte Entscheidung über Instantiierung erst in Subklasse erst beim Client z Mehrere M h Hilf Hilfsklassen kl Wissen über konkrete Hilfsklassen an einer Stelle lokalisieren Beispiel: p Parallele Hierarchien ((nächste Folie)) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-123 ROOTS Factory Method: Anwendbarkeit Figure Client Manipulator createManipulator() ... downClick() drag() upClick() Li Fi LineFigure T tFi TextFigure createManipulator() ... createManipulator() ... 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 Code der Figure Figure-Hierarchie Hierarchie und Client-Code Client Code ist völlig unabhängig von spezifischen Manipulators (nur vom Manipulator-Interface) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-124 ROOTS Factory Method: Implementierung z Fester "Produkt-Typ" jede j d U Unterklasse t kl erzeugtt festgelegte Produkt-Art z Codierter "Produkt-Typ" Produkt Typ Parameter oder Objekt-Variable kodiert "Produkt-Typ" Fallunterscheidung g anhand Code Î mehrere Produkte Î mehr Flexibilität z Klassen-Objekt als "Produkt-Typ" Parameter oder Objekt-Variable ist "Produkt Produkt-Typ Typ" direkte Instantiierung Î mehr Flexibilität Î bessere Wartbarkeit Î kein statischer Typ-Check © 2000-2008 Dr. G. Kniesel 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 S ll lk • Java class Creator { Object create(Class prodType) { return prodType.getInstance(); } } Reflektiver Aufruf des parameterelosen Vorlesung „Softwaretechnologie“ (SWT) Default Konstruktors Default-Konstruktors Seite 6-125 ROOTS Factory Method: Konsequenzen z Code wird abstrakter / wiederverwendbarer keine k i ffesten t Abhängigkeiten Abhä i k it von spezifischen ifi h Kl Klassen z Verbindung gp paralleler Klassenhierarchien Factory Method lokalisiert das Wissen über Zusammengehörigkeiten z evtl. künstliche Subklassen nur zwecks Objekterzeugung © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-126 ROOTS Factory Method: Anwendungen z überall in Toolkits, Frameworks, Class Libraries Unidraw: U id B Beispiel i i l "Fi "Figure und dM Manipulator" i l t " MacApp und ET++: Beispiel "Document und Application" z Smalltalk's Model-View-Controller Framework FactoryMethoden-Template: defaultController Hook-Methode: H k M th d defaultControllerClass z Orbix Erzeugung des richtigen Proxy Ö leichte Ersetzung von Standard-Proxy durch Caching Proxy © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-127 ROOTS Factory Method: Abgrenzung z Template Method ruft ft oft ft Factory F t Method M th d auff z Abstract Factory y oft mit Factory Methods implementiert gleiche Motivation z Prototype erfordert keine Unterklassenbildung ... dafür aber explizite initialize()-Methode © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-128 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste Das Abstract Factory Pattern ROOTS Abstract Factory z Ziel zusammengehörige hö i Obj Objekte kt verwandter dt T Typen erzeugen ... ohne deren Klassenzugehörigkeit fest zu codieren z Motivation GUI-Toolkit für mehrere Plattformen Anwendungsklassen nicht von plattformspezifischen Widgets abhängig machen Trotzdem soll die Anwendung g Ö alle Widgets konsistent zu einem "look and feel" erzeugen können Ö "look and feel" umschalten können © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-130 ROOTS Abstract Factory: Beispiel WidgetFactory Client createWindow() createScrollBar() Wi d Window MotifWidgetFactory createWindow() createScrollBar() PMWidgetFactory PMWindow MotifWindow createWindow() createScrollBar() Scrollbar PMScrollbar © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) MotifScrollBar Seite 6-131 ROOTS Abstract Factory: Schema AbstractFactory Client createProductA() createProductB() AbstractProductA ConreteFactory1 createProductA() () createProductB() ConreteFactory2 ProductA2 ProductA1 createProductA() () createProductB() AbstractProductB ProductB2 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) ProductB1 Seite 6-132 ROOTS Abstract Factory: Implementierung z ConcreteFactories sind Singletons z Produkt-Erzeugung Produkt Erzeugung via Factory Factory-Methods Methods z fester Produkt-Typ (eine Methode für jedes Produkt) 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 als "Produkt-Typ" (eine parametrisierte Methode) Vorteil Ö neues Produkt P d kt erfordert f d t keinerlei k i l i Änderungen Ä d der d Factory F t Nachteil Ö Verzicht auf jegliche statische Typinformation / Typsicherheit Abstract Factory: Implementierung z Produktfamilie = Subklasse Vorteil V t il Ö Konsistenz der Produkte Nachteil Ö neue Produktfamilie erfordert neue Subklasse, auch bei geringen Unterschieden z Produktfamilie = von Clients konfigurierte assoziative Datenstruktur Varianten Ö Prototypen P t t und d Cloning Cl i Ö Klassen und Instantiierung Vorteil Ö keine Subklassenbildung erforderlich Nachteil Ö Verantwortlichkeit an Clients abgegeben g g Ö konsistente Produktfamilien können nicht mehr garantiert werden © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-134 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 einer ConcreteFactory erscheint nur ein mal im Code Ö bei ihrer Instantiierung Leicht austauschbar gegen andere ConcreteFactory Beispiel: Dynamisches Ändern des look-and-feel Ö andere d C ConcreteFactory t F t i t tii 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 Abstract Factory: Anwendbarkeit z System soll unabhängig sein von Objekt-Erzeugung Obj kt E Objekt-Komposition Objekt-Darstellung j g 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 Teilprodukt Arten / -Implementierungen Implementierungen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-136 ROOTS "Gang of Four"-Patterns: Überblick und Klassifikation Jetzt Verhalten z Visitor Struktur z Composite z Observer z Flyweight z Command z Template Method z Chain of Responsibility z Decorator z State z Proxy z Strategy z Adapter z Multiple Vererbung z Bridge z Facade Split Objects z Factory Method z Prototype yp z Abstract Factory z Singleton z Builder Objekt-Erzeugung Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Composite Pattern Nächste Doppelstunde Composite Pattern z Ziel rekursive k i A Aggregations-Strukturen ti St kt darstellen d t ll ("i ("istt Teil T il von") ") Aggregat und Teile einheitlich behandeln z Motivation Gruppierung von Graphiken © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-139 ROOTS Composite Pattern: Beispiel Graphic draw() add(Graphic) remove(Graphic) getChildren() children Line Text Picture draw() draw() draw() add(Graphic) remove(Graphic) getChildren() :Line :Text :Text :Picture © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) draw() { for all c in children c.draw() } :Picture Seite 6-140 ROOTS Composite Pattern: Struktur * Client Component operation() add(Component) remove(Component) getChildren() children Leaf Composite operation() add(Component) remove(Component) getChildren() operation() add(Component) remove(Component) getChildren() operation() { for all c in children c.operation() } add() {} oder add() {throw new MessageNotSupportedException()} © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-141 ROOTS Composite Pattern: Verantwortlichkeiten * Component z Component (Graphic) operation() add(Component) remove(Component) getChildren() gemeinsames i IInterface t f aller ll Teilobjekte T il bj kt default-Verhalten children Interface für Zugriff g auf Teilobjekte j ((!)) evtl. Interface für Zugriff auf Elternobjekte z Leaf L f (Rectangle, (R t l Line, Li T Text) t) Leaf Composite "primitive" Teil-Objekte operation() operation() add(Component) remove(Component) getChildren() implementieren p g gemeinsames Interface leere Implementierungen für Teilzugriffs-Interface z Composite C it (Pi (Picture) t ) speichert Teilobjekte implementiert gemeinsames Interface durch forwarding implementiert Teilzugriffs-Interface © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-142 ROOTS Composite Pattern: Implementierung z Wenn Composites wissen sollen wovon sie Teil sind * Component operation() add(Component) remove(Component) getChildren() Explizite Referenzen auf Composite in Component Klasse children 1 gemeinsam nutzen sollen Schließt explizite Referenz der Components pare ent z Wenn mehrere Composites Components Leaf Composite operation() operation() add(Component) remove(Component) getChildren() auf Composite aus oder erfordert, erfordert dass Components wissen, dass sie Teile mehrerer Composites sind z Component p Interface "Sauberes Design": Verwaltungs-Operationen (add, remove) in Composite, da sie für Leafs nicht anwendbar sind. Wunsch nach einheitlicher Behandlung aller Graphic-Objekte Graphic Objekte durch Clients Æ Verwaltungs-Operationen in Component mit default-Implementierung die nichts tut Æ Leaf Leaf-Klassen Klassen sind damit zufrieden zufrieden, Composites müssen die Operationen passend implementieren. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-143 ROOTS Composite Pattern: Alternative Struktur (add / remove nicht in „Component Component“) ) * Client Component children operation() getChildren() Leaf Composite operation() getChildren() operation() add(Component) remove(Component) (C t) getChildren() operation() { for all c in children c.operation() } Component getChildren() { return null } © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-144 ROOTS Composite Pattern: Konsequenzen z Einheitliche Behandlung Teile T il Ganzes z Einfache Ei f h Cli Clients t Dynamisches Binden statt Fallunterscheidungen z Leichte L i ht Erweiterbarkeit E it b k it neue Leaf-Klassen neue Composite-Klassen p ohne Client-Änderung z Evtl. zu allgemein g Einschränkung der Komponenten-Typen schwer „run-time type checks“ (instanceof) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-145 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS Das Visitor Pattern Das Visitor Pattern z Absicht Repräsentation R ä t ti von O Operationen ti auff Elementen El t einer i Objektstruktur Obj kt t kt Neue Operationen definieren, ohne dass die Klassen dieser Objekte zu ändern © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-147 ROOTS Das Visitor-Pattern: Motivation z Beispiel Compiler für eine gegebene Programmiersprache enthalten Klassen für verschiedene Ausdrücke in dieser Sprache. z Problem Zusammengehöriger Code ist über alle Klassen verteilt Es ist schwer, ein neue Facette der Sprache zu implementieren Ö jjede d Kl Klasse d der Obj Objektstruktur kt t kt müsste ü t geändert ä d t werden d ((zB, B um die di Typüberprüfung anzupassen) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-148 ROOTS Das Visitor-Pattern: Idee z Ziel Neue Operationen auf Objekten sollen definiert werden, ... ... ohne dass die Klassen dieser Objekte geändert werden müssen! z Idee Zusammenfassung dieses Codes in Visitor-Objekte... ... und Bereitstellung von "akzeptierenden" akzeptierenden Methoden in der betroffenen Klassenhierarchie. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-149 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) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) ConcreteElementB accept(Visitor v) operationB() v visitConcreteElementB(this) v.visitConcreteElementB(this) Seite 6-153 ROOTS Visitor Pattern: Verantwortlichkeiten / Implementation z Objektstruktur-Hierarchie Einheitliche accept accept-Methode Methode z Visitor-Hierarchie Je eine visit visit-Methode Methode für jede Klasse der Objektstruktur z Accept-Methoden Haben Visitor als Parameter "Welche Operation soll auf mir ausgeführt werden?" z Visit-Methoden Visit 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 (Methode accept(...)) oder Im Visitor Visitor-Objekt Objekt (Method visit...(...)) visit ( )) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-154 ROOTS Das Visitor-Pattern: Zusammenarbeit welche Operation p auf welchem j Objekt ... ist wie implementiert p accept(aVisitor) t( Vi it ) © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-155 ROOTS Das Visitor-Pattern: Zusammenarbeit welche Operation p auf welchem j Objekt ... ist wie implementiert p accept(aVisitor) t( Vi it ) Æ © 2000-2008 Dr. G. Kniesel Æ Double dispatch p Vorlesung „Softwaretechnologie“ (SWT) Seite 6-156 ROOTS Das Visitor-Pattern: Zusammenarbeit welche Operation :anObjectStructure accept(aVisitor) auf welchem Objekt ... ist wie implementiert :aConcreteElementA :aConcreteElementB :aConcreteVisitor accept(aVisitor) visitConcreteElementA(aConcreteElementA) operationA() accept(aVisitor) visitConcreteElementB(aConcreteElementB) operationB ti B() Æ Double dispatch Æ © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-157 ROOTS Das Visitor-Pattern: Konsequenzen z Hinzufügen neuer Operationen ist einfach. Neue Visitor-Klasse Visitor Klasse z Hinzufügen neuer Objektklassen ist sehr aufwendig. Neue Objekt-Klasse Neue visit... - Methode in allen Visitors z Sammeln von Zuständen Visitor-Objekte können Zustände der besuchten Objekte aufsammeln und (evtl. p ) auswerten. später) Eine Übergabe von zusätzlichen Parametern ist dafür nicht nötig. z Verletzung von Kapselung Die Schnittstellen der Klassen der Objektstruktur müssen ausreichend Funktionalität bieten, damit Visitor-Objekte ihre Aufgaben erledigen können. Oft muss mehr preisgegeben werden als (ohne Visitor) nötig wäre wäre. © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-158 ROOTS Das Visitor Pattern: Anwendbarkeit z Funktionale Dekomposition Zusammengehörige Z hö i O Operationen ti sollen ll zusammengefasst f t werden d ... statt in einer Klassenhierarchie verteilt zu sein j z Stabile Objekt-Hierarchie selten neue Klassen aber oft neue Operationen z Heterogene Hierarchie viele Klassen mit unterschiedlichen Schnittstellen Operationen die von den Klassen abhängen z Anwendungsbeispiel Java-Compiler des JDK 1.3 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-159 ROOTS Das Visitor-Pattern: Implementierung z Abstrakter Visitor Jede Objektstruktur besitzt eine (abstrakte) Visitor-Klasse. Für jeden Typ T in der Objektstruktur, enthält die Visitor-Klasse je eine Methode mit einem Parameter vom Typ yp T Æ visitT(T) ( ) z Konkrete Visitors Jede Unterklasse der Visitor-Klasse redefinieren die visit-Methoden, um ihre jeweilige Funktionalität zu realisieren. Jede konkrete visitT(T) Methode benutzt dabei die spezifischen Operationen des besuchten Objekttyps T z Traversierung der Objektstruktur kann in der Objektstruktur (accept(...) Methoden) definiert sein ... oder im Visitor-Objekt (visit...(...) Methoden). © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-160 ROOTS Überblick z Einführung Grundidee, G did Lit Literatur, t MVC-Framework MVC F k als l B Beispiel i i l z Beispiele wichtiger Patterns Observer, Strategy, Command Bridge, Factory Method, Abstract Factory z Patterns Create Architectures Bridge, Abstract Factory, Singleton z Nutzen von Patterns z Zusammenfassung und Ausblick Bestandteile eines Patterns, Definition Arten von Patterns, Abgrenzung Weiterführende Themen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-161 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste ROOTS „Patterns Create Architectures“ Ein Beispiel zum Zusammenspiel von Patterns Bridge & Abstract Factory & Singleton „Patterns Create Architectures“ z Idee Wenn W man Patterns P tt wohlüberlegt hlüb l t zusammen verwendet, d t entsteht t t ht ein i Grossteil einer Software-Architektur aus dem Zusammenspiel der Patterns. z Beispiel Zusammenspiel von Bridge, Factory und Singleton © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-163 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 Bridgeg Pattern angewendet werden PMScrollbar MotifScrollBar Erinnerung ans Bridge Pattern z Trennung von Konzeptueller K t ll Hi Hierarchie hi ImplementierungsHierarchie Client Window imp WindowImp drawText() drawRect() devDrawText() devDrawLine() IconWindow TransientWindow PMWindowImp XWindowImp drawBorder() drawCloseBox() devDrawText() devDrawLine() devDrawLine() devDrawText() © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-165 ROOTS Zusammenspiel: Bridge, Factory, Singleton << konfiguriert >> Client WidgetFactory Singleton WidgetFactory.setFactory(WidgetFactory.MOTIF) WidgetFactory.getFactory() PMWidgetFactory createWindow() createScrollBar() << benutzt >> Window IconWIndow TransientWindow Scrollbar FixedSB imp imp ProportionalSB MotifWidgetFactory WindowImp PMWindow MotifWindow ScrollbarImp PMScrollbar MotifScrollBar Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste Rückblick: Was nützen Patterns? ROOTS Nutzen von Design Patterns (1) z Objekte / Klassen identifizieren Abstraktionen, Ab t kti die di kein k i Gegenstück G tü k in i der d realen l Welt W lt / d dem A Analysel Modell haben Beispiel: Ö Composite Pattern Ö Abstraktionen von Prozessen Ö Strategy Ö State "Strict modelling of the real world leads to a system that reflects t d ' realities today's liti but b t nott necesarilly ill tomorrow's. t ' The Th abstractions b t ti th t that emerge during design are key to making a design flexible." © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-168 ROOTS Nutzen von Design Patterns (2) z Granularität der Objekte festlegen Facade F d Ö ein "Riesen-Objekt" Flyweight y g Ö viele kleine, gemeinsam verwendbare Teilobjekte Builder Ö Komposition K iti von G Gesamt-Objekt t Obj kt aus Teilobjekten T il bj kt Visitor Ö Gruppe von konsistenten Aktionen Command Ö einzelne Aktion © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-169 ROOTS Nutzen von Design Patterns (3) z Schnittstellen identifizieren was gehört hö t d dazu was gehört nicht dazu (Bsp. Memento) z Beziehungen zwischen Schnittstellen festlegen Subtyping Ö Decorator D t Ö Proxy Je eine Methode pro Klasse aus einer anderen Objekthierarchie Ö Abstract Factory Ö Builder Ö Visitor © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-170 ROOTS Nutzen von Design Patterns (4) z Wahl der Implementierung Interface, I t f Abstrakte Ab t kt Klasse Kl oder d konkrete k k t Klasse Kl Ö Grundthema fast aller Patterns Abstrakte Methode oder Hook Methode Ö von template method aufgerufene Methoden Overriding oder fixe Implementierung Ö Factory method Ö Template method Vererbung oder Subtyp-Beziehung Ö Ad Adapter, t Decorator, D t State, St t Strategy, St t C Command, d Ch Chain i off Responsibility: R ibilit Gemeinsamer Obertyp, nicht gemeinsame Implementierung Vererbung oder Aggregation Ö Vererbung ist statisch Ö Es wird oft mehr vererbt als gewünscht Ö Beispiel: alle "split object patterns" © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-171 ROOTS Nutzen von Design Patterns (5): z Patterns verkörpern Grundprinzipien guten Designs z Implementierungen austauschbar machen Typdeklarationen mit Interfaces statt mit Klassen Design an Interfaces orientieren, 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 wiederverwendbar für neue Implementierungen des gleichen I t f Interface z Funktionalität änderbar gestalten Aggregation A ti und d Forwarding F di statt t tt Vererbung V b späte Konfigurierbarkeit, Dynamik weniger implizite Abhängigkeiten (kein "fragile base class problem") © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-172 ROOTS Überblick z Einführung Grundidee, G did Lit Literatur, t MVC-Framework MVC F k als l B Beispiel i i l z Beispiele wichtiger Patterns Observer, Strategy, Command Facade, Singleton, Proxy, Adapter, Bridge Factory Method, Abstract Factory Composite, C Visitor z Patterns Create Architectures Bridge, Bridge Abstract Factory Factory, Singleton z Nutzen von Patterns z Zusammenfassung und Ausblick Arten von Patterns, Abgrenzung Weiterführende Themen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-173 ROOTS Arten von Design Patterns z Analysis Pattern wiederkehrende i d k h d P Problemen bl iin d der A Analysephase l h eines i S Softwareprojekts ft j kt Martin Fowler: "Analysis Patterns", Addison-Wesley, 1997 z Architektur Pattern ... beschreibt mögliche fundamentale Strukturen von Softwaresystemen. ... enthält vordefinierte Subsysteme und ihre Verantwortlichkeiten. ... enthält Regeln und Richtlinien für f die Organisation O ihrer Beziehungen. Beispiel: Das Model-View-Controller Framework z Design Pattern Schema für die Realisation von Subsystemen oder Komponenten eines Softwaresystems z Idiom Idi ( (auch: h C Coding di P Pattern) tt ) low-level design patterns für eine gegebene Programmiersprache. Beispiel: p Wie stelle ich sicher,, dass eine Instanz einer Java-Klasse nur innerhalb dieser Klasse erzeugt werden kann? © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-174 ROOTS Weitere Arten von Pattern z Organizational Patterns Struktur St kt und d Praxis P i von O Organisationen; i ti also l G Gruppen, di die ein i gemeinsames Ziel verfolgen http://www.bell-labs.com/cgiuser/ OrgPatterns/OrgPatterns?OrganizationalPatterns z Anti-Patterns beschreiben typische Fehler ... und bestenfalls auch wie man sie wieder beseitigt © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-175 ROOTS Abgrenzung: Pattern sind keine Algorithmen z Patterns versus Algorithmen Algorithmen Al ith lö lösen ffeinkörnigere i kö i P Probleme bl als l P Patterns tt ((z.B. B S Suchen, h Sortieren) Algorithmen sind deterministischer (weniger ImplementierungsFreiheitsgrade) Komplexität von Algorithmen lässt sich leichter fassen © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-176 ROOTS Abgrenzung: Pattern sind keine Frameworks z Pattern versus Frameworks Framework F k Ö 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, wiederverwendbarer Code – Patterns enthalten nur Beispiele von Code Patterns sind weniger g spezifisch p Ö Frameworks werden für konkrete Anwendungsbereiche eingesetzt – Patterns können fast überall eingesetzt werden © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-177 ROOTS Weiterführende Themen z Pattern Catalogs Sammlungen S l von lose l zusammenhängenden hä d P Patterns tt z Pattern Systems y Sammlungen von stark zusammenhängenden Patterns mit engen Verzahnungen z Pattern Languages verfolgen g ein g gemeinsames Ziel, dass durch die Zusammenarbeit der enthaltenen Patterns erreicht werden kann inkl. einer Art "Grammatik", die alle mögliche Kombinationen aufzeigt © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-178 ROOTS Pattern: Zusammenfassung z Betonung von Praktikabilität Patterns P tt sind i d bekannte b k t Lösungen Lö fü für erwiesenermaßen i ß wiederkehrende i d k h d Probleme Sie sollen Softwareentwickler bei ihrer Arbeit unterstützen, nicht mehr und nicht weniger z "Aggressive Hintanstellung von Originalität" Lösungen, Lösungen die sich noch nicht in der Praxis bewährt haben haben, sind keine Pattern. z Patterns sind kein Allheilmittel Originalität bei der Anwendung von Patterns ist nach wie vor gefragt. 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 © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-179 ROOTS Vorlesung „ Softwaretechnologie“ Kapitel ap te 66: Entwurfsmuster t u s uste 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 nachzuvollziehen. Wenn nicht, schauen Sie sich die Pattern-Beschreibungen noch mal genau an! Nichtfunktionale Anforderungen geben Hinweise e se zur u Nutzung ut u g von o Design es g Patterns atte s z Idee Identifikation Id tifik ti von Design D i P Patterns tt anhand h d von Schlüsselwörtern S hlü l öt iin d der Beschreibung nichtfunktionaler Anforderungen Analog zu Abbots Objektidentifikation durch Textanalyse z Hinweise auf Abstract Factory Pattern “Herstellerunabhängig”, “H t ll bhä i ” “G “Geräteunabhängig”, ät bhä i ” ““muss eine i P Produktfamilie d ktf ili unterstützen” z Hinweise auf Adapter Pattern “muss mit einem existierenden Objekt zusammenarbeiten” z Hinweise auf Bridge Pattern „muss sich i h um di die S Schnittstelle h itt t ll zu unterschiedlichen t hi dli h S Systemen t kü kümmern von denen einige erst noch entwickelt werden.“ „ein erster Prototyp muss vorgeführt werden“ © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-181 ROOTS Nichtfunktionale Anforderungen geben Hinweise zur Nutzung g von Design g Patterns ( (Fortsetzung) g) z Hinweise auf Composite Pattern “komplexe “k l St Struktur”, kt ” “muss “ variable i bl Tiefe Ti f und d Breite B it h haben” b ” z Hinweise auf Façade Pattern “muss muss mit einer Menge existierender Objekte zusammenarbeiten”, zusammenarbeiten , "stellt stellt ...-Dienst bereit" z Hinweise auf Proxy Pattern “muss “ ortstransparent t t t sein” i ” z Hinweise auf Observer Pattern “muss muss erweiterbar sein”, sein , “muss muss skalierbar sein” sein z Hinweise auf Strategy Pattern “muss Funktionalität X in unterschiedlichen Ausprägungen bereitstellen kö können” ” © 2000-2008 Dr. G. Kniesel Vorlesung „Softwaretechnologie“ (SWT) Seite 6-182 ROOTS