Florian Siebler
Design Patterns mit Java
Eine Einführung in Entwurfsmuster
Inhalt
7
Mae govannen!
15
1 Singleton Pattern
19
1.1?Was Design Patterns sind
19
1.2?Die GoF und deren Verdienst
20
1.3?Die Musterkategorien der GoF
21
1.3.1?Erzeugungsmuster
21
1.3.2?Verhaltensmuster
21
1.3.3?Strukturmuster
21
1.3.4?Bewertung der Kategorisierung
22
1.4?Beschreibung der Muster
22
1.5?Was ist ein Pattern?
23
1.6?Objektorientierte Programmierung
24
1.7?Muster in der Praxis
27
1.8?Das Singleton Pattern
28
1.8.1?Aufgabe von Singleton und Beispiele
28
1.8.2?Realisierung des Patterns
29
1.8.3?Die Zugriffsmethode synchronisieren
30
1.8.4?Eine andere Lösung: Double-checked locking
31
1.8.5?Letzter Ansatz: early instantiation – frühes Laden
32
1.9?Antipattern
33
1.9.1?Kritik an Singleton
33
1.9.2?Ist Singleton ein Antipattern?
34
1.10?Zusammenfassung
34
2 Template Method Pattern
37
2.1?Die Arbeitsweise von Template Method
37
2.1.1?Der erste Ansatz
37
2.1.2?Der zweite Ansatz
38
2.1.3?Das Hollywood-Prinzip
39
2.1.4?Einführen von Hook-Methoden
39
2.2?Das Interface „ListModel“
41
2.3?Der patternCoder
42
2.3.1?Der patternCoder aus Anwendersicht
43
2.4?Zusammenfassung
52
3 Observer Pattern
53
3.1?Einleitung
53
3.2?Eine erste Realisierung
53
3.3?Den ersten Ansatz erweitern
55
3.4?Observer in der Klassenbibliothek
56
3.5?Nebenläufiger Zugriff
57
3.5.1?Zugriffe synchronisieren
58
3.5.2?Die Datenbasis kopieren
58
Einsatz einer thread-sicheren Liste
59
3.6?Observer als Listener
60
3.7?Listener in der GUI-Programmierung
61
3.8?Das Model-View-Controller Pattern
66
3.9?Zusammenfassung
67
4 Mediator Pattern
69
4.1?Abgrenzung zum Observer Pattern
69
4.2?Aufgabe des Mediator Patterns
69
4.3?Mediator in Aktion – ein Beispiel
70
4.3.1?Definition eines Consumers
70
4.3.2?Definition eines Producers
71
4.3.3?Interface des Mediators
72
4.3.4?Test des Mediator-Patterns
73
4.4?Mediator in Aktion – das zweite Beispiel
74
4.4.1?Mediator in der GUI-Programmierung
74
4.4.2?Aufbau der GUI
75
4.5?Kritik an Mediator
77
4.6?Zusammenfassung
77
5 Chain of Responsibility
79
5.1?Ein Beispiel aus der realen Welt
79
5.2?Beispiel 1: Lebensmitteleinkauf
79
5.2.1?Die benötigten Lebensmittel
80
5.2.2?Die Verkäufer der Lebensmittel
80
5.2.3?Der Client
82
5.2.3.1?Erweiterung des Projekts
82
5.2.3.2?Variationen des Patterns
83
5.3?Ein Beispiel aus der Klassenbibliothek
85
5.4?Zusammenfassung
86
6 State Pattern
87
6.1?Exkurs: das Enum Pattern
87
6.1.1?Einen Zustand durch Zahlenwerte darstellen
87
6.1.2?Einen Zustand durch Objekte darstellen
88
6.1.3?Umsetzung in der Java-Klassenbibliothek
89
6.2?Den Zustand eines Objekts ändern
90
6.2.1?Den Zustand ändern – erster Ansatz
90
6.2.2?Den Zustand ändern – zweiter Ansatz
91
6.3?Prinzip des State Patterns
93
6.3.1?Die Rolle aller Zustände definieren
93
6.3.2?Das Projekt aus der Sicht des Client
95
6.3.3?Veränderung des Projekts
96
6.3.3.1?State-Objekte zentral im Kontext verwalten
97
6.3.3.2?State-Objekte als Rückgabewerte von Methodenaufrufen
97
6.4?Das State Pattern in der Praxis
98
6.5?Zusammenfassung
99
Command Pattern
101
7.1?Befehle in Klassen kapseln
101
7.1.1?Version 1 – Grundversion
101
7.1.2?Weitere Anbieter treten auf
103
7.1.3?Einen Befehl kapseln
104
7.2?Command in der Klassenbibliothek
107
7.2.1?Beispiel 1: Nebenläufigkeit
107
7.2.2?Beispiel 2: Event-Handling
108
7.3?Befehlsobjekte wiederverwenden
109
7.3.1?Das Interface „Action“
109
7.3.2?Verwendung des Interface „Action“
109
7.4?Undo und redo von Befehlen
110
7.4.1?Ein einfaches Beispiel
111
7.4.2?Ein umfangreicheres Beispiel
113
7.4.2.1?Besprechung des Source Codes
114
7.4.2.1.1?Die beteiligten Klassen
114
7.4.2.1.2?Aufgabe der GUI
114
7.4.2.1.3?Arbeitsweise der Command-Klassen
115
Undo und redo
115
7.4.3?Undo und redo grundsätzlich betrachtet
115
7.5?Zusammenfassung
116
8 Strategy Pattern
117
8.1?Ein erster Ansatz
117
8.2?Strategy in Aktion – Sortieralgorithmen
119
8.2.1?Das gemeinsame Interface
119
8.2.2?Prinzip des Selection Sort
120
8.2.3?Prinzip des Merge Sort
121
8.2.4?Prinzip des Quick Sort
121
8.2.5?Der Kontext
122
8.2.6?Bewertung des Ansatzes und Variationen davon
123
8.3?Das Strategy Pattern in der Praxis
124
8.4?Abgrenzung zu anderen Mustern
125
8.5?Zusammenfassung
126
9 Iterator Pattern
127
9.1?Zwei Möglichkeiten, Daten zu speichern
127
9.1.1?Daten in einem Array speichern
127
9.1.2?Daten in einer Kette speichern
129
9.2?Aufgabe eines Iterators
131
9.3?Das Interface „Iterator“ in Java
132
9.3.1?Der Iterator der Klasse „MyArray“
132
9.3.1.1?Test des Iterators
133
9.3.1.2?Kritik am Iterator
133
9.3.2?Der Iterator der Klasse „MyList“
133
9.3.2.1?Test des Iterators
134
9.3.2.2?Nutzen des Iterators
135
9.4?Das Interface „Iterable“
135
9.5?Zusammenfassung
136
10 Objektorientierte Entwurfsprinzipien
139
10.1?Gegen Schnittstellen programmieren
139
10.2?Single Responsibility Principle (SRP)
141
10.3?Inheritance is evil
142
10.4?Open/Closed Principle (OCP)
143
10.5?Prinzip des rechten Augenmaßes
144
11 Abstract Factory Pattern
145
11.1?Gärten anlegen
145
11.1.1?Der erste Ansatz
145
11.1.2?Der zweite Ansatz – Vererbung
147
11.1.3?Der dritte Ansatz – die abstrakte Fabrik
147
11.1.4?Vorteil der abstrakten Fabrik
149
11.1.5?Einen neuen Garten definieren
150
11.2?Diskussion des Patterns und Praxis
151
11.3?Gespenster jagen
152
11.3.1?Die erste Version
152
11.3.1.1?Der Spieler
152
11.3.1.2?Die vier Himmelsrichtungen
153
11.3.1.3?Die Bauteile des Hauses
154
11.3.1.4?Die Klasse „Haus“ steuert das Spiel
156
11.3.2?Die zweite Version des Projekts
158
11.3.3?Version 3 – Einführung einer weiteren Fabrik
160
11.3.3.1?Erweiterung in dieser Programmversion
160
11.3.3.2?Die neue Fabrik „TuerMitZauberspruchFabrik“
160
11.3.3.3?Das neue Bauteil „TuerMitZauberspruch“
161
11.3.4?Version 4 – das Geisterhaus
162
11.4?Zusammenfassung
163
12 Factory Method Pattern
165
12.1?Ein erstes Beispiel
165
12.2?Variationen des Beispiels
167
12.3?Praktische Anwendung des Patterns
168
12.3.1?Rückgriff auf das Iterator Pattern
168
12.3.2?Bei der Abstract Factory
169
12.4?Ein größeres Beispiel – ein Framework
170
12.4.1?Das Projekt, das erstellt werden wird
170
12.4.2?Die Schnittstellen für Einträge und deren Editoren
171
12.4.3?Die Klasse „Kontakt“ als Beispiel für einen Eintrag
172
12.4.4?Die Klasse „FactoryMethod“ als Client
173
12.5?Unterschied zur Abstract Factory
174
12.6?Zusammenfassung
175
13 Prototype Pattern
177
13.1?Objekte klonen
177
13.1.1?Kritik an der Realisierung
178
13.1.1.1?Das Interface „Cloneable“
178
13.1.1.2?Das Problem gleicher Referenzen
179
13.1.1.3?Was passiert beim Klonen?
180
13.1.2?In Vererbungshierarchien klonen
181
13.2?Ein größeres Projekt
184
13.2.1?Besprechung der ersten Version
185
13.2.2?Die zweite Version – deep Copy
187
13.2.3?Eigene Prototypen definieren
188
13.3?Zusammenfassung
189
14 Composite Pattern
191
14.1?Prinzip von Composite
191
14.2?Umsetzung 1: Sicherheit
192
14.3?Umsetzung 2: Transparenz
195
14.4?Betrachtung der beiden Ansätze
197
14.5?Einen Schritt weitergehen
199
14.5.1?Einen Cache anlegen
199
14.5.2?Die Elternkomponenten referenzieren
201
14.5.3?Knoten verschieben
204
14.6?Realisierung eines TreeModel
204
14.6.1?Die Methoden der Schnittstelle „TreeModel“
205
14.6.2?Knoten rendern und editieren
207
14.6.2.1?Knoten rendern
207
14.6.2.2?Knoten editieren
210
14.7?Zusammenfassung
213
15 Builder Pattern
215
15.1?Ein Objekt erzeugt andere Objekte
215
Umsetzung 1: Telescoping Constructor Pattern
215
15.1.2?Umsetzung 2: JavaBeans Pattern
217
15.1.3?Umsetzung 3: Builder Pattern
218
15.2?Ein komplexerer Konstruktionsprozess
220
15.2.1?XML-Dateien in ein TreeModel konvertieren
221
15.2.2?XML-Dateien als HTML darstellen
224
15.3?Zusammenfassung
227
16 Visitor Pattern
229
16.1?Ein einfaches Beispiel
229
16.1.1?Das Aggregat
229
16.1.2?Der Visitor
231
16.1.3?Der Client
232
16.1.4?Ein weiterer Visitor
233
16.1.5?Kritik am Projekt
233
16.2?Zusammenfassung
234
17 Memento Pattern
235
17.1?Aufgabe des Memento Patterns
235
17.2?Eine mögliche Realisierung
236
17.3?Ein größeres Projekt – der GrafikEditor
239
17.4?Zusammenfassung
240
18 Flyweight Pattern
243
18.1?Aufgabe des Patterns
243
18.2?Die Realisierung
244
18.3?Ein komplexeres Projekt: Pizza
246
18.3.1?Der erste Ansatz
246
18.3.2?Intrinsischer und extrinsischer Zustand
247
18.4?Flyweight in der Praxis
249
18.5?Zusammenfassung
251
19 Facade Pattern
253
19.1?Ein Beispiel außerhalb der IT
253
19.2?Die Fassade in einem Java-Beispiel
254
19.2.1?Einführung einer Fassade
256
19.2.2?Der Begriff „System“ genauer betrachtet
257
19.3?Die Fassade in der Klassenbibliothek
258
19.4?Das „Gesetz von Demeter“
259
19.5?Zusammenfassung
260
20 Adapter Pattern
261
20.1?Ein einleitendes Beispiel
261
20.1.1?Ein klassenbasierter Entwurf
261
20.1.2?Ein objektbasierter Entwurf
263
20.1.3?Kritik am Adapter Pattern
264
20.2?Ein Praxisbeispiel und falsche Namen
265
20.2.1?Ein Adapter im patternCoder
265
20.2.1.1?Objektbasierter Ansatz des Adapters
265
20.2.1.2?Klassenbasierter Ansatz des Adapters
266
20.2.2?Zum Schluss noch ein Etikettenschwindel
267
20.3?Zusammenfassung
268
21 Proxy Pattern
269
21.1?Virtual Proxy
269
21.2?Security Proxy
270
21.3?Smart Reference
271
21.3.1?Die Grundversion „Proxy_1“
271
21.3.2?Einführung eines Proxys im Projekt „Proxy_2“
273
21.3.3?Einen zweiten Proxy einführen
275
21.3.4?Dynamic Proxy
276
21.3.4.1?Das Reflection API
277
21.3.4.2?Der InvocationHandler
278
21.3.4.3?Die Proxy-Klasse
279
21.4?Remote Proxy
280
21.4.1?Aufbau von RMI grundsätzlich
280
21.4.2?Der RMI-Server
281
21.4.2.1?Die Schnittstelle „PiIF“
281
21.4.2.2?Die Serverklasse „PiImpl“
282
21.4.2.3?Die Klasse „ApplStart“ startet den Server
282
21.4.3?Der RMI-Client
283
21.4.4?Das Projekt zum Laufen bringen
285
21.5?Zusammenfassung
285
22 Decorator Pattern
287
22.1?Autos bauen – ein erstes Beispiel
287
22.1.1?Ein Attribut für jede Sonderausstattung
287
22.1.2?Mit Vererbung erweitern
288
22.1.3?Dekorieren nach dem Matroschka-Prinzip
288
22.1.3.1?Definieren der Grundmodelle
289
22.1.3.2?Definieren der Sonderausstattungen
289
22.1.3.3?Der Client steckt die Komponenten zusammen
290
22.1.4?Praxisbeispiele
291
22.1.4.1?Die Klasse „JScrollPane“
291
22.1.4.2?Streams in Java
292
22.2?Zusammenfassung
295
23 Bridge Pattern
297
23.1?Zwei Definitionen
297
23.1.1?Was ist eine Abstraktion?
297
23.1.2?Was ist eine Implementierung?
298
23.1.3?Ein Problem beginnt zu reifen
300
23.2?Das Bridge Pattern im Einsatz
301
23.2.1?Bridge Pattern – erster Schritt
302
23.2.2?Bridge Pattern – zweiter Schritt
303
23.2.2.1?Die Abstraktion erweitern
303
23.2.2.2?Die Implementierung erweitern
304
23.3?Diskussion des Bridge Patterns
306
23.3.1?Die Bridge in freier Wildbahn
306
23.3.2?Abgrenzung zu anderen Patterns
307
23.4?Zusammenfassung
307
24 Interpreter Pattern
309
24.1?Die Aufgabe in diesem Kapitel
309
24.2?Der Scanner
310
24.2.1?Die definierten Symbole
311
24.2.2?Der Scanner wandelt Strings in Symbole um
312
24.3?Der Parser
314
24.3.1?Abstrakte Syntaxbäume
314
24.3.2?Expressions für den Parser
315
24.3.3?Strichrechnung parsen
317
24.3.4?Punktrechnung parsen
319
24.3.5?Klammern berücksichtigen
321
24.4?Diskussion des Interpreter Patterns
322
24.5?Zusammenfassung
323
Index
325
© 2009-2024 ciando GmbH