Kapitel 6 Entwurfsmuster (Design Patterns)

Werbung
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
Herunterladen