Decorator Pattern

Werbung
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Decorator Pattern
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Jan-Ole Giebel
Hochschule für angewandte Wissenschaften Hamburg
Fortgeschrittenes Programmieren mit Java
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
9. Dezember 2011
Verwendung in
Java
File I/O
Swing
Quellen
1 / 30
Inhalt
Decorator Pattern
Intro - UML
Intro - UML
Problemstellung
Szenario
Analyse
Problemstellung
Mögliche Lösungen
Vererbung
Decorator Pattern
Mögliche Lösungen
Implementierung
Bewertung des Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
Verwendung in Java
File I/O
Swing
Quellen
Quellen
2 / 30
Beziehung zwischen Klassen
Decorator Pattern
Intro - UML
Problemstellung
Assoziation
Szenario
Analyse
Mögliche Lösungen
I
A-Kennt-B-Beziehung
I
Implementierung: Übergabe einer Referenz
I
Lebenszeit: Entkoppelt
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Abbildung: UML-Datstellung einer Assoziation
Verwendung in
Java
File I/O
Swing
Quellen
3 / 30
Beziehung zwischen Klassen
Decorator Pattern
Intro - UML
Problemstellung
Aggregation
Szenario
Analyse
Mögliche Lösungen
I
A-Besitzt-B-Beziehung
I
Implementierung: Erzeugen einer Referenz
I
Lebenszeit: Entkoppelt
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Abbildung: UML-Datstellung einer Aggregation
Verwendung in
Java
File I/O
Swing
Quellen
4 / 30
Beziehung zwischen Klassen
Decorator Pattern
Intro - UML
Problemstellung
Komposition
Szenario
Analyse
Mögliche Lösungen
I
A-Ist-Teil-Von-B-Beziehung
I
Implementierung: Erzeugen einer Referenz
I
Lebenszeit: Gekoppelt
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Abbildung: UML-Datstellung einer Komposition
Verwendung in
Java
File I/O
Swing
Quellen
5 / 30
Beziehung zwischen Klassen
Decorator Pattern
Intro - UML
Problemstellung
Spezialisierung
Szenario
Analyse
Mögliche Lösungen
I
A-Ist-Spezialfall-Von-B-Beziehung
I
Implementierung: Vererbung
I
Lebenszeit: Entkoppelt
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Abbildung: UML-Datstellung einer Spezialisierung
Verwendung in
Java
File I/O
Swing
Quellen
6 / 30
Das Subwaysche Chaos
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Beispiel: Tagesangebote
I
Jeden Tag ein Tagesangebot
I
8 verschiedene Extrabeläge
I
8 verschiedene Soßen
I
5 verschiedene Brotsorten
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
7 / 30
Decorator Pattern
Problembeschreibung
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Let’s do the math...
Vererbung
Decorator Pattern
I
7 Basissubs
I
Jedes Basissub mit einer aus 5 Brotsorten
I
Jedes Basissub mit bis zu 8 Extrabelägen wählbar
I
Jedes Basissub mit bis zu einer Soße wählbar
I
Anzahl der Möglichkeiten: 7 · 9 · 5 ·
Implementierung
28
= 80640
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
8 / 30
Klassische Vererbung
Implementierung
I
Definition einer Klasse Sub des Tages
I
Das belegte Sub des Tages ableiten
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Auswirkungen
I
Eine Klasse pro Kombinationsmöglichkeit → 80640
Klassen
I
Aufwand für Maintenance extrem hoch
I
Keine Flexibilität (Sub ohne Oliven, dafür doppelt
Chillis)
I
Keine Änderung zur Laufzeit möglich (Hinzufügen eines
Subs) d.h. keine Dynamik
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
9 / 30
Decorator Pattern - Motivation
Decorator Pattern
Intro - UML
Problemstellung
Konzept(Theorie)
I
I
I
I
Klassen stellen einzelne Bestandteile dar (Basis- und
Erweiterungsklassen)
Basisobjekte können durch Erweiterungen zu
kompletten Darstellungen ergänzt werden
Ziel: Basisobjekte zur Laufzeit ausschmücken → erzeugt
Dynamik
Ziel: Basisobjekte ändern → erzeugt Flexibilität
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
10 / 30
Decorator Pattern - Design
Decorator Pattern
Intro - UML
Problemstellung
Bestandteile
Szenario
Analyse
Mögliche Lösungen
I
Abstract Component: Beschreibt Gemeinsamkeiten von
Component und Decorator
I
Concrete Component: Basisobjekt, das dekoriert werden
soll
I
Abstract Decorator: Rahmenbeschreibung des Concrete
Decorators, abgeleitet von Abstract Component
I
Concrete Decorator: Objekt, das das Basisobjekt mit
neue Eigenschaften schmückt
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
11 / 30
Decorator Pattern - Darstellung in UML
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
Abbildung: UML-Datstellung des Pattern
File I/O
Swing
Quellen
12 / 30
Decorator Pattern - Darstellung in UML
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
Abbildung: UML-Datstellung des Pattern
File I/O
Swing
Quellen
Komposition ohne Instanzen? - Stay tuned.
12 / 30
Decorator Pattern - Verketteter Methodenaufruf
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Abbildung: Methodenaufruf bei dekoriertem Objekt [PB]
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
13 / 30
Decorator Pattern - Analyse
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Auswirkung auf unser Problem
I
Reduzierung der Klassen auf 8 + 5 + 8 + 1 + 1 + 1 = 24
Klassen
I
Gewinn von Flexibilität und Dynamik
I
Viele Objekte müssen erzeugt werden → Einsatz von
Factory Pattern hilft
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
14 / 30
Implementierung des Subwayschen Chaos - UML
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
Abbildung: Klassendiagramm des Subwayschen Chaos (vereinfacht auf ein
Sub)
15 / 30
Implementierung des Subwayschen Chaos Sourcen
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Wie sieht das nun aus?
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
16 / 30
Die Komposition
Decorator Pattern
Intro - UML
Erzeugen des dekorierten Objektes
Problemstellung
Szenario
Analyse
1
2
3
4
public static void main(String[] args) {
ISub sdt = new SauceChipotleSouthwest(new VegOnion(new VegSpicedCuke(new
VegPaprika(new VegJalapeno(new VegCuke(new VegSalad(new
BreadCheeseOregano(new SubOfTheDay()))))))));
System.out.println(sdt.buildSub());
}
I
Was passiert, wenn die Jalapenos gelöscht werden?
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
17 / 30
Die Komposition
Decorator Pattern
Intro - UML
Erzeugen des dekorierten Objektes
Problemstellung
Szenario
Analyse
1
2
3
4
public static void main(String[] args) {
ISub sdt = new SauceChipotleSouthwest(new VegOnion(new VegSpicedCuke(new
VegPaprika(new VegJalapeno(new VegCuke(new VegSalad(new
BreadCheeseOregano(new SubOfTheDay()))))))));
System.out.println(sdt.buildSub());
}
I
Was passiert, wenn die Jalapenos gelöscht werden?
I
Keine Referenz mehr auf das Sub bis zur Gurke
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
17 / 30
Die Komposition
Decorator Pattern
Intro - UML
Erzeugen des dekorierten Objektes
Problemstellung
Szenario
Analyse
1
2
3
4
public static void main(String[] args) {
ISub sdt = new SauceChipotleSouthwest(new VegOnion(new VegSpicedCuke(new
VegPaprika(new VegJalapeno(new VegCuke(new VegSalad(new
BreadCheeseOregano(new SubOfTheDay()))))))));
System.out.println(sdt.buildSub());
}
I
Was passiert, wenn die Jalapenos gelöscht werden?
I
Keine Referenz mehr auf das Sub bis zur Gurke
I
Garbage Collector räumt das herumliegende Sub auf
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
17 / 30
Die Komposition
Decorator Pattern
Intro - UML
Erzeugen des dekorierten Objektes
Problemstellung
Szenario
Analyse
1
2
3
4
public static void main(String[] args) {
ISub sdt = new SauceChipotleSouthwest(new VegOnion(new VegSpicedCuke(new
VegPaprika(new VegJalapeno(new VegCuke(new VegSalad(new
BreadCheeseOregano(new SubOfTheDay()))))))));
System.out.println(sdt.buildSub());
}
I
Was passiert, wenn die Jalapenos gelöscht werden?
I
Keine Referenz mehr auf das Sub bis zur Gurke
I
Garbage Collector räumt das herumliegende Sub auf
I
Kopplung der Lebensdauer zwischen nachfolgend
erzeugten Objekten → Die gesuchte Komposition
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
17 / 30
Implementierung von Charakterklassen
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Priester, Krieger und Templer
I
Krieger kann heroische Schlachten schlagen
I
Priester wirken Wunder, meiden aber das Schlachtfeld
I
Templer sind eine Mischung aus Krieger und Priester
I
Alle sind jedoch Menschen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
18 / 30
Implementierung der Charakterklassen - UML
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Abbildung: Klassendiagramm der Charakterklassen
Quellen
19 / 30
Implementierung der Charakterklassen - Sourcen
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Zur nächsten Livedemo
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
20 / 30
Vor- und Nachteile
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Vorteile
I
Dynamisch und flexibel
I
Kurze Vererbungshierarchie
I
Client kann jedes dekorierte Objekt gleich behandeln →
KISS ( Keep it simple stupid“)1 , Reuseable Client
”
Starke Orientierung an Do only one thing“ 1 → Clean
”
Code, geringer Aufwand bei Maintenance
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
I
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
1
[RCM]
21 / 30
Vor- und Nachteile
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Nachteile
I
Potentiell sehr viele Objekte
I
Aufwändiges Debugging bei stark verketteten
Methodenaufrufen
I
Umfangeiche API nötig um Decorator zu beschreiben
I
Komplexität des Systems steigt mit Anzahl der
Decorator
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
22 / 30
Decorator Pattern
Zusammenfassung
Intro - UML
Problemstellung
Wie gut ist die Lösung mit Decorator?
Szenario
Analyse
I
Maintenance stellt Großteil des Zeitaufwandes im
Software Lifecycle
I
Erzeugung von reuseable code“hilft in zukünftigen
”
Entwicklungen
I
Problem bei der Erstellung von vielen Objekten über
Factory lösbar
I
1
skin“ 1
Changing the guts vs changing the
→ zentrale
”
Algorithmen nicht über Decorator wechseln → Strategy
Pattern besser
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
[GoF]
23 / 30
Bewertung
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Wann ist der Einsatz sinnvoll?
I
Darstellung von ähnlichen Dingen in vielen
verschiedenen Klassen
I
Ähnliche Klassen arbeiten nicht mehr nach Do only
”
one thing “
I
Maintenance teuer (meist oft ändernde Systeme)
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
24 / 30
Decorator Patter und File I/O
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Decoratorstruktur in der File I/O
I
Abstrakte Component → InputStream
I
Konkrete Component → ObjectInputStream,
ByteArrayInputStrea, FileInputStream,...
I
Abstrakter Decorator → FilterInputStream
I
Konkrete Decorator → BufferedInputStream,
DataInputStream, LineNumberInputStream,...
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
25 / 30
Java File I/O - Schematische Darstellung
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
Abbildung: UML-Darstellung der Java File I/O [PB]
File I/O
Swing
Quellen
26 / 30
Java File I/O - Verkettete Struktur
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Abbildung: Zugriff auf InputStream der Java I/O [PB]
Verwendung in
Java
File I/O
Swing
Quellen
27 / 30
Decorator Patter in Java Swing
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mit Swing dekorieren
I
Wir brauchen eine GUI → JPanel (Component)
I
Wir wollen einen Text eingeben → Textfeld mit
Scrollbar dekorieren
I
Die Box soll scrollen können → Textfeld mit Scrollbar
dekorieren
I
Kaskadiertes zeichnen der GUI mit add()
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
28 / 30
Swing - Schematische Darstellung
Decorator Pattern
Intro - UML
Problemstellung
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
Abbildung: UML-Darstellung von Swing [PB]
29 / 30
Quellen
Decorator Pattern
Intro - UML
Problemstellung
I
I
I
I
[GoF] Erich Gamma, Richard Helm, Ralph Johnson,
John Vlissides: Design Patterns. Elements of Reusable
”
Object-Oriented Software.“, Addison-Wesley Longman,
Amsterdam, 1st ed., Reprint. (31. Oktober 1994)
[RCM] Robert C. Martin, Clean Code. A Handbook of
”
Agile Software Craftmanship.“, Prentice Hal, 1st
ed.,(1.August 2008)
[PB] http://www.philipphauer.de/study/se/
design-pattern/
[JavaP] http://javapapers.com/design-patterns/
decorator-pattern/
Szenario
Analyse
Mögliche Lösungen
Vererbung
Decorator Pattern
Implementierung
Hinzufügen von
Eigenschaften
Hinzufügen von
Verhalten
Bewertung des
Pattern
Vor- und Nachteile
Bewertung
Verwendung in
Java
File I/O
Swing
Quellen
30 / 30
Herunterladen