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