K1348.qxd
31.7.2007
13:15
StrÆnka 5
Stručný obsah Část 1: Zahřívací kolo Kapitola 1 Co je a k čemu je návrhový vzor Kapitola 2 Zásady objektově orientovaného programování Kapitola 3 Co konstruktor neumí (Jednoduchá tovární metoda – Simple Factory Method) Kapitola 4 Nehemži se mi pod rukama (Neměnné objekty – Immutable objects) Kapitola 5 Nenos mi to po jednom (Přepravka – Crate) Kapitola 6 Udělám to za tebe (Služebník – Servant) Kapitola 7 I nic může být objekt (Prázdný objekt – Null Object) Část 2: Ovlivňujeme počet instancí Kapitola 8 Žádná instance (Knihovní třída – Library Class) Kapitola 9 Jediná instance (Jedináček – Singleton) Kapitola 10 Předem známé instance (Výčtový typ – Enumerated Type) Kapitola 11 Dvojníky nepotřebujeme (Originál – Original) Kapitola 12 Konečný počet instancí (Fond – Pool) Kapitola 13 Příliš mnoho instancí (Muší váha – Flyweight) Část 3: Nekoukej mi do kuchyně Kapitola 14 Pod ruce mi neuvidíš (Zástupce – Proxy) Kapitola 15 Řekni, až to budeš chtít (Příkaz – Command) Kapitola 16 Moc se mi v tom nehrab (Iterátor – Iterator) Kapitola 17 Příliš mnoho rozhodování (Stav – State) Kapitola 18 Já to umím, upřesni jen detaily (Šablonová metoda – Template Method)
33 39 57 65 83 91 97
103 107 123 135 151 171
189 195 203 221 239
Část 4: Optimalizujeme rozhraní Kapitola 19 Je to zbytečně složité (Fasáda – Facade) Kapitola 20 Je to trochu jinak (Adaptér – Adapter) Kapitola 21 Bloudění strukturou (Strom – Composite)
255 261 271
Část 5: Vytvořte to univerzální Kapitola 22 Střihni mi to na míru (Tovární metoda – Factory Method) Kapitola 23 Baťovy cvičky (Prototyp – Prototype) Kapitola 24 Dosazujeme do vzorečku (Stavitel – Builder) Kapitola 25 Bude toho víc (Abstraktní továrna – Abstract Factory)
279 285 309 329
K1348.qxd
31.7.2007
6
13:15
StrÆnka 6
Stručný obsah
Část 6: Zjednodušujeme program Kapitola 26 Příliš mnoho druhů tříd (Dekorátor – Decorator) Kapitola 27 Horký brambor (Řetěz odpovědnosti – Chain of Responsibility) Kapitola 28 Až se to stane, dám ti vědět (Pozorovatel – Observer) Kapitola 29 Telefonní ústředna (Prostředník – Mediator)
343 361 375 387
Část 7: Já se přizpůsobím Kapitola 30 Příště to může být jinak (Most – Bridge) Kapitola 31 Vyberte si, jak to chcete (Strategie – Strategy) Kapitola 32 Každý chvilku tahá pilku (Model-Pohled-Ovládání – Model-View-Controller) Kapitola 33 Tohle ještě neumíš (Návštěvník – Visitor) Kapitola 34 Zpátky na stromy (Pamětník – Memento) Kapitola 35 Tak si to naprogramuj sám (Interpret – Interpreter)
425 453 467 475
Část 8: Přílohy Příloha A Základy jazyka UML Příloha B Seznam doporučené a nedoporučené literatury
511 517
399 415
K1348.qxd
31.7.2007
13:15
StrÆnka 7
Obsah Poděkování
17
Úvod
18 ČÁST 1
Zahřívací kolo KAPITOLA 1
Co je a k čemu je návrhový vzor Návrhové vzory a jejich katalogy Které vzory budeme probírat Shrnutí – co jsme se naučili
33 34 36 37
KAPITOLA 2
Zásady objektově orientovaného programování Programovat proti rozhraní
39 40
Signatura Kontrakt Jak zásadu dodržovat Návrh vlastního rozhraní
41 42 43 44
Důsledné skrytí implementace
44
Interní × publikované rozhraní Podzásady
Zapouzdření a odpoutání částí kódu, které by se mohly měnit Přednost skládání před dědičností Soudržnost (cohesion): jedna entita → jeden úkol Návrh řízený odpovědnostmi Minimální vzájemná provázanost (coupling) Vyhýbání se duplicitám v kódu Nepodřizovat návrh snahám o maximální efektivitu Shrnutí – co jsme se naučili
45 46
47 48 50 52 52 53 53 55
K1348.qxd
31.7.2007
8
13:15
StrÆnka 8
Obsah
KAPITOLA 3
Co konstruktor neumí (Jednoduchá tovární metoda – Simple Factory Method) Účel Implementace Příklad Shrnutí – co jsme se naučili
57 58 59 61 63
KAPITOLA 4
Nehemži se mi pod rukama (Neměnné objekty – Immutable objects) Účel Hodnotové a referenční datové typy Hodnotové objektové typy Referenční datové typy Neměnnost instancí v praxi
Implementace Příklad Příklad špatně definovaného potomka Shrnutí – co jsme se naučili
65 66 66 67 69 69
73 75 81 81
KAPITOLA 5
Nenos mi to po jednom (Přepravka – Crate) Účel Implementace Příklady ze standardní knihovny Interní přepravka Další příklady v doprovodných programech
Shrnutí – co jsme se naučili
83 84 85 86 87 90
90
KAPITOLA 6
Udělám to za tebe (Služebník – Servant) Účel Implementace Příklad: Přesouvač Shrnutí – co jsme se naučili
91 92 92 94 95
K1348.qxd
31.7.2007
13:15
StrÆnka 9
Obsah
9
KAPITOLA 7
I nic může být objekt (Prázdný objekt – Null Object) Účel Implementace Příklad Shrnutí – co jsme se naučili
97 98 98 99 99
ČÁST 2
Ovlivňujeme počet instancí KAPITOLA 8
Žádná instance (Knihovní třída – Library Class) 103 Účel Implementace Příklad Shrnutí – co jsme se naučili
104 104 105 105
KAPITOLA 9
Jediná instance (Jedináček – Singleton) Účel Základní implementace Časná inicializace = inicializace v deklaraci Námitky proti veřejné konstantě Odložená inicializace
Vícevláknové aplikace Serializovatelnost Speciální případy Vlastní zavaděče tříd Chyba v prvních verzích Javy Jedináček s dědici
Shrnutí – co jsme se naučili
107 108 109 109 111 112
114 116 117 117 117 117
120
KAPITOLA 10
Předem známé instance (Výčtový typ – Enumerated Type) Účel Implementace
123 124 125
K1348.qxd
31.7.2007
10
13:15
StrÆnka 10
Obsah
Starší verze Javy Java 5.0
125 128
Funkční výčtové typy Výčtové podtypy Shrnutí – co jsme se naučili
131 132 133
KAPITOLA 11
Dvojníky nepotřebujeme (Originál – Original) Účel Implementace Příklad Shrnutí – co jsme se naučili
135 136 137 140 149
KAPITOLA 12
Konečný počet instancí (Fond – Pool) Účel Implementace
151 152 153
Univerzální fond
153
Příklad: Molekuly Shrnutí – co jsme se naučili
163 169
KAPITOLA 13
Příliš mnoho instancí (Muší váha – Flyweight) Účel Implementace Příklad – hra Diamanty Shrnutí – co jsme se naučili
171 172 172 173 186
ČÁST 3
Nekoukej mi do kuchyně KAPITOLA 14
Pod ruce mi neuvidíš (Zástupce – Proxy) Účel Implementace Vzdálený zástupce Virtuální zástupce Ochranný zástupce
189 190 191 191 191 192
K1348.qxd
31.7.2007
13:15
StrÆnka 11
Obsah
Chytrý odkaz
Příklad Shrnutí – co jsme se naučili
11
193
193 194
KAPITOLA 15
Řekni, až to budeš chtít (Příkaz – Command) Účel Implementace Příklad Shrnutí – co jsme se naučili
195 196 196 197 202
KAPITOLA 16
Moc se mi v tom nehrab (Iterátor – Iterator) Účel Implementace Příklad Prázdný iterátor a iterovatelný objekt
Shrnutí – co jsme se naučili
203 204 204 209 218
220
KAPITOLA 17
Příliš mnoho rozhodování (Stav – State) Účel Implementace Příklad Shrnutí – co jsme se naučili
221 222 223 225 237
KAPITOLA 18
Já to umím, upřesni jen detaily (Šablonová metoda – Template Method) Účel Proč nemůže být šablonovou metodou konstruktor
Implementace Příklad Shrnutí – co jsme se naučili
239 240 244
245 250 251
K1348.qxd
31.7.2007
12
13:15
StrÆnka 12
Obsah
ČÁST 4
Optimalizujeme rozhraní KAPITOLA 19
Je to zbytečně složité (Fasáda – Facade) Účel Implementace Příklad Shrnutí – co jsme se naučili
255 256 258 259 259
KAPITOLA 20
Je to trochu jinak (Adaptér – Adapter) Účel Implementace
261 262 262
Univerzální adaptér Adaptér obsahující adaptovaný objekt Adaptér jako potomek adaptované třídy
Příklad Shrnutí – co jsme se naučili
263 266 267
269 269
KAPITOLA 21
Bloudění strukturou (Strom – Composite) Účel Implementace Příklad Shrnutí – co jsme se naučili
271 272 273 275 276
ČÁST 5
Vytvořte to univerzální KAPITOLA 22
Střihni mi to na míru (Tovární metoda – Factory Method) Účel Implementace Příklad Shrnutí – co jsme se naučili
279 280 283 284 284
K1348.qxd
31.7.2007
13:15
StrÆnka 13
Obsah
13
KAPITOLA 23
Baťovy cvičky (Prototyp – Prototype) Klonování a jeho vlastnosti Účel vzoru Prototyp Implementace Příklad: Mnohotvar Shrnutí – co jsme se naučili
285 286 290 293 294 306
KAPITOLA 24
Dosazujeme do vzorečku (Stavitel – Builder) Účel Implementace Příklad
309 310 312 314
Způsoby zadávání textu Sázecí stroje Definice sazeče Testovací autor Možná rozšíření
315 317 322 325 327
Shrnutí – co jsme se naučili
327
KAPITOLA 25
Bude toho víc (Abstraktní továrna – Abstract Factory) Účel Implementace Příklad Shrnutí – co jsme se naučili
329 330 333 334 339
ČÁST 6
Zjednodušujeme program KAPITOLA 26
Příliš mnoho druhů tříd (Dekorátor – Decorator) Účel Implementace Příklad Shrnutí – co jsme se naučili
343 344 346 348 360
K1348.qxd
31.7.2007
14
13:15
StrÆnka 14
Obsah
KAPITOLA 27
Horký brambor (Řetěz odpovědnosti – Chain of Responsibility) Účel Implementace Příklad Shrnutí – co jsme se naučili
361 362 363 364 373
KAPITOLA 28
Až se to stane, dám ti vědět (Pozorovatel – Observer) Účel Implementace Příklad Shrnutí – co jsme se naučili
375 376 377 379 385
KAPITOLA 29
Telefonní ústředna (Prostředník – Mediator) Účel Implementace Příklad Shrnutí – co jsme se naučili
387 388 389 389 396
ČÁST 7
Já se přizpůsobím KAPITOLA 30
Příště to může být jinak (Most – Bridge) Účel Implementace Příklad Shrnutí – co jsme se naučili
399 400 402 403 413
KAPITOLA 31
Vyberte si, jak to chcete (Strategie – Strategy) Účel Implementace
415 416 416
K1348.qxd
31.7.2007
13:15
StrÆnka 15
Obsah
Příklad Shrnutí – co jsme se naučili
15
419 424
KAPITOLA 32
Každý chvilku tahá pilku (Model-Pohled-Ovládání – Model-View-Controller) 425 Účel Implementace Příklad: Reversi (Othello) Shrnutí – co jsme se naučili
426 428 429 452
KAPITOLA 33
Tohle ještě neumíš (Návštěvník – Visitor) Účel Implementace Příklad Shrnutí – co jsme se naučili
453 454 454 460 466
KAPITOLA 34
Zpátky na stromy (Pamětník – Memento) Účel Implementace Příklad: Reversi s návraty Shrnutí – co jsme se naučili
467 468 468 469 474
KAPITOLA 35
Tak si to naprogramuj sám (Interpret – Interpreter) Účel Implementace Definice jednotlivých částí interpretu
Příklad: Aritmetické výrazy Rozhraní IAritmVýraz Třída Kontext Konstanty a proměnné Binární operátory Třída Překladač Použití interpretu v programu
475 476 477 480
488 489 490 494 497 501 505
K1348.qxd
31.7.2007
16
13:15
StrÆnka 16
Obsah
Shrnutí – co jsme se naučili
507 ČÁST 8
Přílohy PŘÍLOHA A
Základy jazyka UML Jazyk UML Diagramy tříd Datové typy Vztahy mezi datovými typy Diagramy tříd v prostředí BlueJ
511 512 512 513 514 515
PŘÍLOHA B
Seznam doporučené a nedoporučené literatury 517 Co nečíst Co číst Jazyk UML Návrhové vzory Objektově orientované programování Java Jednotlivé články
Rejstřík
518 518 518 518 519 520 520
521