Design Patterns mit Java - Eine Einführung in Entwurfsmuster

Florian Siebler

Design Patterns mit Java

Eine Einführung in Entwurfsmuster

2014

359 Seiten

Format: PDF, Online Lesen

E-Book: €  23,99

E-Book kaufen

E-Book kaufen

ISBN: 9783446441118

 

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