Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
21
33
67
109
139
197
217
259
297
335
403
447
517
595
629
Skorowidz
649
22
23
Metapoznanie
25
27
30
Podzikowania
31
Pamitaj,
opanowanie takich
zagadnie, jak
abstrakcyjno, dziedziczenie
i polimorfizm, nie zrobi jeszcze
z Ciebie dobrego projektanta
systemw zorientowanych
obiektowo. Prawdziwy guru zawsze
myli o stworzeniu elastycznego
projektu, ktry bdzie atwy
do serwisowania i bdzie
sobie w stanie poradzi ze
zmieniajcymi si
warunkami.
34
37
38
40
42
43
50
52
54
55
56
60
61
64
Rozwizania wicze
66
Encaps
y beh
ulated
ZG
avior
Twj M
ace>>
<<interf
FlyBeh
avior
y()
ay
FlyNoW
FlyWith
Duck
ying
FlyBeha
ehavior
QuackB
ulated
Encaps
swim()
)
display(
Quack()
perform
Fly()
perform
)
ehavior(
setFlyB
ior()
kBehav
setQuac
e methduck-lik
// OTHER
<<interf
quack
ior
MuteQuack
Squeak
Quack
Decoy
Object
that holds
state
Mallard
Redhead
Duck
Duck
{
display()
}
a redhead
// looks like
{
display()
}
a mallard
// looks like
Su
bje
int
t
ct Objec
Rubber
behavio
ace>>
QuackBehav
quack()
Duck
Duck
){
display(
like a decoy
// looks
{
display()
ck }
a rubberdu
// looks like
{
quack)
nts duck
// impleme
g
quackin
{
quack()
duckie
// rubber
{
quack()
- cant
// do nothing
quack!
squeak
OBSERWATOR
8
8
8
Dog Objec
8
Duck Objec
Mo
Automatic update/notication
Cat Object
ct
use Obje
Observers
oller
Contr
Depend
Objects ent
y() {
- cant y!
// do nothing
y() {
nts duck
// impleme
vior;
vior yBeha
ehavquackB
Client
Wings
est
Requ
View
MVC
l
Mode
az ju cakiem
Twj Kod, ter
cony poprzez
nowy i wzboga
wzorcw
zastosowanie
projektowych.
Wzorzec Obserwator
Abstr
ja
Hermetyzac
m
fiz
Polimor
g ra m
R eg u y p ro
o
ob ie kt ow eg
ow a ni a
ie
Dziedziczen
o
obiektoweg
ramowania
Reguy prog
ienia.
to, co si zm
rmetyzacji
he
aj
w
da
Pod
dziczenie.
cj nad dzie
aj kompozy
Przedkad
ejsw,
zeniu interf
si na twor
uj
tr
en
nc
ko
S
entacji.
a nie implem
h
ty, w ktryc to
orzy projek
i, o ile
Staraj si tw b luno powizane
ze so
zajemnie.
obiekty s
na siebie w
e oddziauj
moliwe, ni
69
74
75
78
81
83
86
87
94
101
104
Rozwizania wicze
107
RELACJA JEDEN-DO-WIELU
Ob
iekt
int
an y
obserwo
8
8
Obie
8
Obie
Automatyczna aktualizacja
(powiadamianie)
kt Pies
kt Kaczk
Obie
Obie
kt Kot
kt Mysz
Obiekty obserwujce
(Observers)
Ob iek ty za le ne
Pod st a w y
ow eg o
a ni a ob ie kt
p ro g ra m ow
akcyjno
Wzorzec Dekorator
Dekorowanie zachowania obiektw
W zasadzie niniejszy rozdzia moemy rwnie dobrze zatytuowa
Otwieranie oczu programistom z nadmiernymi skonnociami
do naduywania dziedziczenia. W tym rozdziale sprbujemy krytycznie przyjrze si
zwyczajowym skonnociom do naduywania mechanizmu dziedziczenia oraz nauczymy Ci sposobw
dekorowania zachowania klas w czasie dziaania programu przy uyciu pewnej formy kompozycji
obiektw. Dlaczego? Po zapoznaniu si z technikami dekoracji zachowania klas bdziesz mg wyposaa
swoje (i nie tylko) obiekty w nowe moliwoci bez koniecznoci dokonywania jakichkolwiek modyfikacji
w kodzie klas podstawowych.
Zawsze sdziem,
e prawdziwi mczyni tworz
podklasy dla wszystkiego, co si tylko
do tego nadaje. Tak byo do czasu,
gdy dowiedziaem si o korzyciach,
jakie daje moliwo rozszerzania
moliwoci aplikacji na poziomie
dziaania, a nie kompilacji. A teraz
spjrzcie tylko na mnie!
110
Regua otwarte-zamknite
116
118
119
121
122
125
130
132
135
Rozwizania wicze
136
Wzorzec Fabryka
Pizzeria zorientowana obiektowo
Przygotuj si do stworzenia kilku projektw, w ktrych zastosujemy
lune powizania pomidzy poszczeglnymi obiektami. Stworzenie
nowego obiektu to duo wicej ni tylko proste zastosowanie operatora new. Niebawem przekonasz si,
e proces ten jest operacj, ktra nie zawsze powinna by publicznie dostpna, a co wicej, jest operacj,
ktra czsto moe prowadzi do powanych problemw z powizaniami midzyobiektowymi. A tego by
nie chcia, prawda? Przekonaj si, w jaki sposb wzorzec Factory moe uratowa Ci z takiej opresji.
<<interfejs>>
Ciasto
GrubeChrupkieCiasto
CienkieChrupkieCiasto
<<interfejs>>
FabrykaSkadnikwPizzy
utwrzCiasto()
utwrzSos()
utwrzSer()
utwrzWarzywa()
utwrzPepperoni()
utwrzMae()
<<interfejs>>
Sos
SosPomidorowy
WoskaFabrykaSkadnikwPizzy
utwrzCiasto()
utwrzSos()
utwrzSer()
utwrzWarzywa()
utwrzPepperoni()
utwrzMae()
AmerykaskaFabryka
SkadnikwPizzy
utwrzCiasto()
utwrzSos()
utwrzSer()
utwrzWarzywa()
utwrzPepperoni()
utwrzMae()
SosMarinara
<<interfejs>>
Ser
SerMozzarella
SerReggiano
<<interfejs>>
Mae
MrooneMae
10
wieeMae
140
Pizza w Obiektowie
142
144
145
147
150
151
Tworzymy Pizzeri
153
155
161
162
164
167
168
170
174
Rodziny skadnikw
175
176
Fabryka Abstrakcyjna
183
Za kulisami
184
186
190
192
Rozwizania wicze
193
Wzorzec Singleton
Obiekty jedyne w swoim rodzaju
Kolejnym przystankiem w naszej podry jest wzorzec Singleton,
czyli nasza przepustka do kreowania jedynych w swoim rodzaju
obiektw, posiadajcych tylko jedn instancj. By moe ucieszysz si na wie
o tym, e Singleton jest najprostszym z istniejcych wzorcw projektowych (przynajmniej pod wzgldem
kategorii stopnia zoonoci jego diagramu klas); jak by na to nie patrze, jego diagram skada si tylko
z jednej klasy! Ale nie wpadaj w eufori; niezalenie od prostoty diagramu klas tego wzorca na drodze
prowadzcej do jego implementacji napotkamy cakiem sporo wybojw i dziur. Lepiej zapnij mocno pasy
to nie bdzie takie proste jakby mogo si wydawa.
Hershey, PA
198
May Singleton
199
201
202
Fabryka czekolady
203
205
206
207
208
212
214
Rozwizania wicze
216
iektowego
mowania ob
ra
og
pr
e
rc
nWzo
konuje relacj jede
, doiektami
y ob
dzw
algoryitm
zmieielaniniae
zye.dz
ymob
iennkt
fininiuyje pomaj si na
eiepr
dedz
onmeraicwnyzn
finiuje ro
yb
j
w
dy
st
s do
y
na
erwdeator wodujpo
e
ed
a
orrfmyejda
ki
e,
al
otety
StrateOgybs
go
inat
, e
or
zw
a
ne
aj
b
ek
cz
st
da
D
os
po
y
.
i
ar
zo
j
sp
ji
st
e
a
ac
or
ki
ac
do
n
ik
ta
yf
ch
leow
w at
od
ekor
poyczwh alajc
hjnyzaaza
D
ielu
kt
nibe,rfzaejlesn
udz
na
yc
iecy
lute
-wyz
ajebs
wak
tm
ichze
doet
alow
ich herm
trmob
no
yc
ry
i
go
in
zw
on
ie
e.
go
je
A
ni
po
al
dz
an
ie
iu
a
w
kt
yma tylko
je
tk
gy
go
ie
ow
yk
fin
re
ys
te
dn
te
da
ob
liz de
ok
asdrz
ydz
raan
uszbr
k
sp
kl
ua
Fa
w
r
m
,
St
ja
h
kt
in
a
kt
j,
ne
ic
po
za
ec
ia
c
a,
a
te
da
st
m
rz
ie
uj
ro
ni
om
nt
j
do
ie
zo
zn
yk
ie
klaet
W sw
yc
on
reallaanaklasklasa bdz .
bny
at
Fabr
okzw
do
mca
eiod
ach
zeporz
nino
to
ni
zseci
od
aupo
ze
ro, alo
or
iewzn
M
ez
ne
da
ny
ni
tw
nieldo
iocz
ko
u ia
obalny
mtye
zac
asal
orzo
ktec
iezn
ianinbe
mw
eznob
pewnia,ktezostanieiektutuwi za
pow
algorytm
pewnia gl
iezakt
ze
or
o za
dnieak
iestancj ob
leton ejklza
jesieb
naobwtw
ob
ng
c
od
y
Si
uj
as
er
of
a.
powiedzialn
in
ki
od
ja
.
je
,
uyw
dn
ch
zu
a
je
ty
w
ka
.
ie
is
do
ze
zywdecy i wyczn y Methodjpr
alno
rzec
instancji.
funkcjon
ecnkFatctdoorstpu do klteas podrzdnych.
Wzorzpu
do
w
kt
ie
ob
e
tworzeni
11
Wzorzec Polecenie
Hermetyzacja wywoa
W niniejszym rozdziale przeniesiemy hermetyzacj na
zupenie nowy poziom: mamy zamiar dokona hermetyzacji
wywoa metod. Zgadza si, dziki hermetyzacji wywoa metod moemy
wykrystalizowa pewne fragmenty oblicze tak, e obiekt wywoujcy obliczenia nie musi
si martwi, w jaki sposb je wykona; po prostu wykorzystuje nasz metod. Z takimi
hermetyzowanymi wywoaniami metod moemy rwnie dokonywa wielu zadziwiajco
sprytnych operacji, takich jak na przykad zapisywanie ich do dziennikw czy te ponowne
wykorzystywanie w celu zaimplementowania mechanizmu Cofnij (ang. Undo) w naszej aplikacji.
Poprosz
z
ada si
enie sk
w
Zamwi wybranych enia.
pozycji iecie zamwi
oraz z
nk
wienia
e na bla
u zam y zapisan
iet
nk
sta
bla
zo
ktre
menu,
utwrz
Zamwi
enie()
z serem
zapiekank sodowy.
i napj
rem
z se
owy
sod
a
kank
ie
Zap
j
Nap
, czego
ju
Klient wie
chce,
ie.
zamwien
i skada
pobierzZam
wienie()
si
klienta i kiedy ju
Zamwienie od
Metoda ta
Kelnerka przyjmuje metod realizujZamwienie().
uje
przez klienta.
z tym upora, wywo
wienia zoonego
s realizacji Zam
rozpoczyna proce
12
pro
du
kt
(),
apiekank
przygotujZ apj()
przygotujN
cow
r
Burge lt
Ma
ko
duj
znaj
ieniu kcje
amw stru y
Na Z szelkie in tego, ab y
si w dne do waciw eruje
b
niez towa ienie ki ujc
ug
go
w
przy k. Zam rza, pos k
ja
e
posi Kucha takimi, ).
i
prac etodam iekank(
si m gotujZap
przy
re
ali
zu
jZa
ien
ie(
cje
Kucharz realizuje instruk
i
podane w Zamwieniu
edni
przygotowuje odpowi
posiek.
218
219
220
223
224
225
227
229
232
234
Implementujemy SuperPilota
236
238
241
246
250
Zastosowanie makropolece
251
254
255
256
Rozwizania wicze
258
Adapter
260
261
265
267
268
271
272
273
276
279
282
285
288
289
294
Rozwizania wicze
296
Klient
danie
()
wy
celo
do
rfejs
inte
an
m
ieTu
()
one
acz
Adapter
Obiekt
adaptowany
interfejs
obiektu
adaptowa
nego
Indyk to interfejs
adaptowanego.
mentuje
imple
dapter
IndykA Kaczka.
y
docelow
obiektu
s
interfej
13
Hermetyzacja algorytmw
Jestemy jak w transie: hermetyzowalimy ju proces tworzenia
obiektw, wywoania metod, zoone interfejsy, kaczki, indyki,
pizze ciekawe, co bdzie nastpne? Ot, teraz mamy zamiar zaj si
hermetyzacj fragmentw algorytmw, tak aby klasy podrzdne mogy podczepia si w rnych
miejscach wykonywanych oblicze. Co wicej, zajmiemy si rwnie regu projektowania, ktrej korzenie
wywodz si w prostej linii z Hollywood.
Zauwaylimy, e dwie
receptury s bardzo do siebie
podobne, chocia niektre
ich etapy wymagaj rnych
implementacji. Dziki temu
spostrzeeniu moglimy
uoglni receptur i umieci j
w klasie bazowej.
Herbata
2
3
Napoje
zawierajce
kofein
uoglnienie
He
Podklasa
rbata
niektre etapy
delegowane s do
klasy podrzdneja
W torebk herbaty do
Dodaj cytryn.
14
Zaparz napj.
wrztku.
Kawa
Zagrzej
odpowied
ni ilo
wody.
Zalej wrz
tkiem od
mierzon
porcj ka
Nalej kawy
wy.
do filiank
i.
Dodaj cu
kier i ml
eko do sm
aku.
y.
edni ilo wod
Zagrzej odpowi
wrztku.
bk herbaty do
2 W tore
i.
baty do filiank
3 Nalej her
do smaku.
ryn
cyt
aj
4 Dod
uoglnienie
niektre etapy
delegowane s do
klasy podrzdneja
Podklas
a Kawa
2
4
zon porcj
Zaparz odmier
kawy.
mleko.
Dodaj cukier i
299
302
303
304
Czego ju dokonalimy?
307
308
309
310
311
312
314
Zastosowanie haczyka
315
316
Regua Hollywood
318
319
321
322
323
324
326
Zabawy z ramkami
328
Aplety Java
329
330
332
Rozwizania wicze
333
Zarzdzanie kolekcjami
Jest wiele sposobw grupowania obiektw w kolekcje. Mona
utworzy obiekty Array, Stack, List, Hashtable. Kady z nich ma swoje zalety i wady. Jednak w pewnym
momencie klient rozpocznie iteracyjne przetwarzanie elementw kolekcji. Czy wtedy ujawnisz mu swoj
implementacj? Mam nadziej, e nie. To nie byoby profesjonalne. Nie musisz si jednak obawia,
Twoja kariera zawodowa nie jest zagroona. W tym rozdziale przedstawimy metod, ktra umoliwia
klientom przetwarzanie iteracyjne bez wiedzy o tym, jak obiekty s przechowywane. Przedstawimy te
technik tworzenia superkolekcji (ang. super collections) obiektw, ktre pozwalaj na obsug bardzo
rozbudowanych struktur danych. Bdziemy te pisa o odpowiedzialnoci obiektw.
Pa
nc
ake
en u
Wszystkie menu
House M
Din
erMenu
UJ
acka Menu
Po z
ycjaMenu
Po z
ycjaMenu
Po z
ycjaMenu
klucz
klucz
Po z
ycjaMenu
klucz
2
Po z
ycjaMenu
ArrayList
Menu deserw
klucz
Po z
ycjaMenu
Po z
ycjaMenu
Po z
ycjaMenu
Hashtable
Po z
ycjaMenu
Po z
ycjaMenu
4
Po z
ycjaMenu
Po z
ycjaMenu
3
Po z
ycjaMenu
Po z
ycjaMenu
336
338
343
Wzorzec Iterator
345
347
351
353
355
356
359
Iteratory i kolekcje
368
369
373
376
379
382
Powracamy do iteratora
388
IteratorPusty
392
394
399
Rozwizania wicze
400
15
10
Wzorzec Stan
Stan obiektu
Mao znany fakt: wzorce Strategy i State to bliniaki, rozdzielone
zaraz po narodzinach. Jak ju wiemy, wzorzec Strategy umoliwi przeprowadzenie wielu
niezwykle udanych przedsiwzi opartych na zamiennie stosowanych algorytmach. Wzorzec State ma
inn rol. Jest ni wspomaganie obiektw w kontrolowaniu ich wasnych zachowa poprzez wewntrzn
zmian stanu. atwo usysze, jak mwi swoim podopiecznym: Powtarzaj za mn: jestem wystarczajco
zdolny, jestem wystarczajco dobry, dam rad to zrobi.
Krtka narada
405
406
Piszemy kod
408
412
414
417
419
420
428
429
435
Niemal zapomnielimy!
438
441
Rozwizania wicze
442
J e st
a
monet
lic
16
aGum
zb
=0
aG
ze
kr
an
ni e m on
a
N ie m
y
monet
li c z b
pr
et y
w k ad an
ie m on et
Brak
gum
um
>
zw ra ca
Automaty Sprzedajce SA
autom atu
konce pcj pracy kontr olera
nie
Poni ej przed staw iamy nasz
y nadz iej, e zaimp lemen towa
Mam
.
ucia
do
gum
ego
sprze dajc
przys zoc i
spraw i Wam trudn oci. W
kt
proje
tego schem atu w Javie nie
o
my
nowe zacho wani a, wic prosi
bdz iemy zape wne doda wa
mody fikow ania.
do
y
atw
i
yczny
elast
moli wie
maty Sprz edaj ce
Inyn ierow ie firmy Auto
a n ie
w yd a w
g um y
Guma na
da
sp r z e
ie
ga
ki
11
Wzorzec Proxy
Kontrola dostpu do obiektu
Prbowae kiedy stosowa metod dobrego i zego?
Ty jeste tym
dobrym, ktry zrobi wszystko, o co si go poprosi, ktry jest zawsze miy i uprzejmy. Nie chcesz jednak,
eby kady mg prosi o Twoje usugi. To jest miejsce dla zego, ktry bdzie kontrolowa dostp do
Ciebie. Takie jest wanie zadanie porednikw (ang. proxy) w modelu obiektowym kontrolowanie
i zarzdzanie dostpem. Jak si przekonamy, istnieje bardzo wiele schematw takiego porednictwa.
Obiekty Proxy mog przekazywa wywoywanie metody obiektowi w innym wle internetu; bywa te,
e zastpuj wyjtkowo leniwe obiekty.
Brzydk
adny
448
452
455
468
476
478
Porednik wirtualny
480
482
488
492
496
497
ZOO porednikw
506
508
Rozwizania wicze
509
<<interface>>
Przedmiot
<<interface>>
InvocationHandler
danie()
invoke()
skadaj si
Na porednika
dwie klasy.
PrawdziwyPrzedmiot
danie()
Proxy
danie()
teraz
InvocationHandler
invoke()
17
12
Wzorce zoone
czenie wzorcw
Przyszoby Ci do gowy, e wzorce mog pracowa razem? Bylimy ju
wiadkami wielu niespokojnych Pogawdek przy kominku (a omin Ci Death Match wzorcw, ktry
wydawca kaza wyrzuci*) czy wsuchujc si w ich ton mona jeszcze liczy na to, e wzorce bd ze
sob wsppracowa? Moesz wierzy lub nie, ale najbardziej wyszukane projekty obiektowe wykorzystuj
wiele wzorcw jednoczenie. Przygotuj si na kolejny poziom wiedzy o wzorcach projektowych. Czas na
wzorce zoone.
Klikamy przycisk
zwikszajcy
szybko
Widok
co powoduje wywoanie
kontrolera.
Kontroler da od modelu
zwikszenia wartoci
BPM o jeden.
Controler
Pasek beatu
pulsuje co p
sekundy.
Widok
tM
Bea odel
start()
ustawBPM()stop()
zBPM()
pobier
Widok zostaje
uaktualniony, aby
wywietla 120 BPM.
18
zmianie BPM.
Widok jest powiadamiany o
BPM().
Wywouje metod modelu pobierz
Wzorzec zoony
518
Powrt kaczek
519
522
524
526
531
534
Co zrobilimy?
541
542
Model-Widok-Kontroler piosenka
544
546
550
552
555
Widok
557
A teraz kontroler
560
563
Adaptowanie modelu
564
565
567
575
578
Rozwizania wicze
579
13
na nowe
Przewodnik
ami
rc
ycie z wzo
ir porad,
podrczny zb towymi
osz, nasz
mi projek
ca
Przy jmij, pr
or
wz
z
Ci y
ktre pomog acy i zmaganiach.
pr
w codziennej
jektowy;
wi o:
wzorzec pro
my w nim m
z terminem
Bdzie
mog Ci si
zwizanych
, jak bardzo
ozumieniach
ych i o tym
tow
niepor
jek
pro
w
gach wzorc
rzebne;
katalo
nie jest to pot
przyda;
tam, gdzie
a wzorcw
iu stosowani
w;
orc
wz
unikan
to zajcie
niu
wa
, e nie jest
ym klasyfiko
ych i o tym
orem
waciw
jak zosta aut
w projektow
waniu wzorc branych. Dowiesz si,
definio
wy
dla
ane
zarezerwow
jak
,
ag
n pow
wzorcw;
ktujemy z rw
u, ktre tra
niach umys
of Four.
wicze
iczego Gang
Zen.
ch tajemn
mistrzowie
ere
w
Czt
wnik wzorc
o Gangu
kady uytko
imy tosam
inien mie
Ujawn
pow
ki
ksi
imy, jakie
stosujc
,
tw
mis
Zdradz ych.
na progra
i wpywa
projektow
ych.
by przyjaci
iemy, jak zdo gi wzorcw projektow
Opow
terminolo
precyzyjn
ard
Richlm
He
578
597
599
600
Katalog wzorcw
601
604
605
607
Mylenie wzorcami
612
615
617
618
619
620
621
622
624
626
Opuszczamy Obiektowo
627
Ralph Johnson
Gang czterech
John
Vlissides
Erich Gamma
19
14
ska
Dodawanie nowych metod
zW j()
klasy Go nie wpywa na obier otne rie()
()
p ow alo ()
any
r
kompozyt.
Zd bierzK iaka wod
o
B
l
z
o
p bier
g
po bierzW
po
wo wywoania
Klasa Go musi mie moli
j z klas. Jest
metody pobierzStan() kade
wadzi nowe metody,
miejscem, gdzie mona wpro
y.
klient
z ktrych bd korzysta
632
634
636
Interpreter (interpreter)
638
Mediator (mediator)
640
Memento (memento)
642
Prototype (prototyp)
644
Visitor (go)
646
pobierzStan()
pob
ierzS
tan(
)
po
bie
rzS
Pozycja
tan
Menu
()
()
tan
rzS
bie
po
Klient i Obiekt
przechodzenia
erser)
Obiekt przechodzenia (Trav
przez ca
umie przeprowadzi gocia
struktur kompozytow.
S
20
Builder (budowniczy)
Chain of Responsibility (acuch odpowiedzialnoci)
Stan()
pobierz
Go
Skadnik
Skorowidz
630
Menu
Pozycja
Menu
Skadnik
649
Dekorowanie
zachowania obiektw
Zawsze sdziem, e
prawdziwi mczyni tworz podklasy
dla wszystkiego, co si tylko do tego
nadaje. Tak byo do czasu, gdy
dowiedziaem si o korzyciach, jakie
daje moliwo rozszerzania moliwoci
aplikacji na poziomie dziaania, a nie
kompilacji. A teraz spjrzcie
tylko n a mnie!
109
akcyjna, ktrej
Napoje to klasa abstr
jw
zeglne rodzaje napo
podklasami s poszc
j kafejce.
oferowanych w nasze
w kadej
Zmienna obiektowa opis jest ustawiana
h
lnyc
czeg
posz
opisy
uje
podklasie; przechow
y
palon
o
mocn
ty,
komi
Zna
np.
jak
jw,
napo
gatunek kawy!.
Napj
opis
StarCafeSpecial
koszt()
pobierzOpis()
koszt()
// Inne uyteczne
metody...
MocnoPalona
koszt()
ca
Metoda pobierzOpis() jako rezultat zwra
warto zmiennej opis.
Bezkofeinowa
koszt()
Espresso
koszt()
Kada podklasa posiada zaimplementowan metod koszt(), ktra zwraca cen danego napoju.
110
Rozdzia 3
Wzorzec Dekorator
Do kadej kawy moesz rwnie zamwi szereg dodatkw, takich jak mleko,
mleczko sojowe, mocha* (znana rwnie pod nazw czekolada). Moesz pokry
to wszystko bit mietan. Star Caf za kady z tych dodatkw dolicza niewielk
opat, wic, chcc nie chcc, waciciele sieci musieli informacje o dodatkach (i ich
moliwych kombinacjach) wbudowa w swj system zamwie.
Ich pierwsza prba wygldaa mniej wicej tak
Napj
opis
pobierzOpis()
koszt()
// Inne uyteczne metody...
Bezkofeinowa
ZCzekolad
MocnoPalona
NapojeMocnoPalonaZMlekiem
koszt()
koszt()
koszt()
MocnoPalonaZCzekolad
koszt()
MocnoPalonaZMlekiemCzekoladMl
koszt()
eczkiemSojowym
koszt()
koszt()
cost()
BezkofeinowaZMlekiem
koszt()
BezkofeinowaZMlec
koszt()
StarCafeSpecialZMlekiemCzekoladEspr
Espresso
essoWithSteamedMilk
koszt()
cost()
EspressoZMlekiem
DarkRoastWithSoy
cost()
BezkofeinowaZMlekiem
koszt()
StarCafeSpecialZBitmietan
DarkRoastWithSoy
NapojeBezkofeinowaZBitmietan
koszt()
DecafWithSoyCzekoladMleczkiemSojowym
koszt()
MleczkiemSojowym
MocnoPalonaZBitmietan
cost()
BezkofeinowaZCzekoladNapoje
cost()
CzekoladMleczkiemSojowym
koszt()
koszt()
cost()
MocnoPalonaZCzekolad
MleczkiemSojowym
koszt()
EspressoZMlekiemCzekolad
BezkofeinowaZCzekolad
MleczkiemSojowym
koszt()
EspressoZBitmietanEspressoWith
StarCafeSpecial
koszt()
koszt()
MocnoPalonaZCzekolad
koszt() MocnoPalonaZBitmietan
koszt()
koszt()
Bezkofeinowa
StarCafeSpecialZCzekolad
MleczkiemSojowym
koszt()
Bezkofeinowa
koszt()
ZMlekiemCzekolad
BezkofeinowaZMlekiemCzekolad
NapojeMocnoPalonaZBitmietan
MleczkiemSojowym
koszt()
StarCafeSpecialZMlekiemCzekolad
MleczkiemSojowym
StarCafeSpecial
ZCzekolad
MocnoPalonaZBitmietan
CzekoladMleczkiemSojowym
koszt()
koszt()
koszt()
MocnoPalonaZMlekiemCzekolad
koszt()
StarCafeSpecialZMlekiem
Czekolad
StarCafeSpecial
ZMlekiem
BezkofeinowaZBitmietan
BezkofeinowaZBitmietanNapoje
koszt()
koszt()
koszt()
EspressoZMlekiemCzekolad
MleczkiemSojowym
BezkofeinowaZCzekoladMleczkiem
StarCafeSpecialZCzekolad
cost()
Sojowym
EspressoZCzekoladMleczkiem
MleczkiemSojowym
StarCafeSpecialZMlekiemCzekolad
Sojowym
cost()
BezkofeinowaZMlekiem
cost()
MleczkiemSojowym
MleczkiemSojowym
koszt()
koszt()
koszt()
Uuuaaa!
To si dopiero
nazywa eksplozja
klas!
koszt()
koszt() obliczaj
Poszczeglne metody
zy uwzgldnieniu
cen danego napoju pr
z wszystkich
ora
odpowiedniej kawy
w.
tk
da
do
h
zamwionyc
* Pod nazw Mocha (lub Arabica Mocha) kryje si rwnie znakomity gatunek kawy arabskiej,
odznaczajcy si wybitnie czekoladowym aromatem i redni moc napoju; polecam! przyp. tum.
jeste tutaj
111
Wysil szare
komrki
Chyba dla wszystkich jest oczywiste, e projektanci ze Star Caf sami sobie narobili kopotw,
tworzc struktur aplikacji, ktra z punktu widzenia serwisowania, modyfikacji i rozbudowy jest po
prostu koszmarnym snem szalonego programisty. Wyobra sobie tylko, co oni powinni zrobi, jeli
cena mleka pjdzie w gr? Albo co maj zrobi, jeli firma wprowadzi now polew karmelow?
Sprbuj pomyle nieco szerzej, nie tylko o problemie serwisowania aplikacji ktre spord
omawianych do tej pory regu projektowania zostay pogwacone podczas tworzenia tego projektu?
Wskazwka: dwie z tych regu zostay tutaj kompletnie podeptane!
Przecie to gupie po co nam
te wszystkie klasy? Czy nie moemy
po prostu uy zmiennych obiektowych
oraz mechanizmu dziedziczenia z klasy
nadrzdnej do obsugi wszystkich
dodatkw?
112
Rozdzia 3
oraz ustawiaj
Te metody pobieraj
logicznych dla
ch
ny
wartoci zmien
tkw.
poszczeglnych doda
Wzorzec Dekorator
Napj
opis
mleko
mleczko sojowe
czekolada
bita mietana
sie
plementowana w kla
Metoda koszt() zaim
szt
ko
ty
wi
ko
ca
wyliczaa
nadrzdnej bdzie
ju dodatkw,
po
na
go
ne
da
do
h
onyc
wszystkich zamwi
() w klasach
niajce metody koszt
sa
ze
pr
y
gd
s
za
dc
po
, pozwalajc
o
aln
jon
kc
erz jej fun
podrzdnych rozsz
wego.
go napoju podstawo
doczy cen dane
pobierzOpis()
koszt()
zMlekiem()
dodajMleko()
zMleczkiemSojowym()
dodajMleczkoSojowe()
zCzekolad()
dodajCzekolad()
zBitmietan()
dodajBitmietan()
napoju
() musi policzy cen
Kada metoda koszt
datkw,
do
n
ce
stpnie doda
podstawowego, a na
sy
kla
z
()
szt
ko
lu metod
wywoujc w tym ce
nadrzdnej.
MocnoPalona
StarCafeSpecial
Bezkofeinowa
koszt()
koszt()
koszt()
Espresso
koszt()
Zaostrz owek
Sprbuj napisa kod implementujcy metod koszt() dla nastpujcych klas
(moesz uy w zapisie pseudokodu Java):
public class Napj {
public MocnoPalona() {
opis = "Znakomity, mocno palony gatunek
kawy!"
}
public double koszt() {
}
}
}
}
jeste tutaj
113
Wpyw zmian
Zobaczmy,
w sumie wyszo z tego pi
klas. Czyli definitywnie jest to
kierunek, w ktrym powinnimy si
dalej porusza.
Nie jestem tego taki
pewny; jeeli sobie pomyl,
jakie zmiany moe przechodzi ten
projekt w przyszoci, przewiduj
kilka potencjalnych problemw.
Zaostrz owek
Jakie wymagania (bd inne czynniki) mog si zmienia tak, e bd miay wpyw na nasz projekt?
Zmiana cen poszczeglnych dodatkw bdzie nas zmuszaa do modyfikacji istniejcego kodu.
Wprowadzanie do oferty nowych dodatkw bdzie nas zmuszao do dodawania nowych metod oraz modyfikacji kodu metody koszt()
w klasie nadrzdnej.
Moe si okaza, e w ofercie pojawi si nowe napoje. Dla niektrych napojw (na przykad dla mroonej herbaty) pewne dodatki
mog by nieodpowiednie, aczkolwiek mimo wszystko podklasa Herbata powinna dziedziczy takie metody, jak np. zBitmietan().
A co w sytuacji, kiedy klient zayczy sobie podwjn porcj czekolady?
ko
Twoja
114
lej:
Rozdzia 3
przeko
Jak ju i
s
n a li m y le 1 .,
ia
z
w rozd d
aw
to napr obry
d
nie jest
!
s
pomy
Wzorzec Dekorator
Mistrz i ucze
Mistrz: Od naszego ostatniego spotkania upyno ju cakiem
sporo czasu, mody czowieku Czy spdzae duo czasu
pogrony gboko w rozwaaniach nad istot dziedziczenia?
Ucze: Tak, Mistrzu. Dziedziczenie jest zaiste potn broni,
nauczyem si jednak, e nie zawsze jej uycie prowadzi do wystarczajco
elastycznych i atwych w modyfikacji projektw.
Mistrz: O, co za niespodzianka! Poczynie, widz, pewne postpy! A zatem
powiedz mi, mj mody adepcie, w jaki sposb moemy uzyska kod,
ktrego da si uywa wielokrotnie, inaczej ni poprzez dziedziczenie?
Ucze: Mistrzu, nauczyem si, e istniej sposoby, ktre podczas dziaania
programu daj takie same efekty, jakie normalnie daje dziedziczenie;
naley zatem skorzysta z odpowiedniej kompozycji i delegacji.
Mistrz: Prosz, kontynuuj
Ucze: Kiedy dziedzicz dane zachowania poprzez tworzenie klasy podrzdnej,
takie zachowanie jest tworzone statycznie podczas kompilacji programu. Co wicej,
wszystkie klasy podrzdne musz dziedziczy te same zachowania. Jeeli jednak
mog rozszerzy zakres zachowa obiektu poprzez kompozycj, takiej operacji
mog dokona dynamicznie podczas dziaania programu.
Mistrz: Bardzo dobrze, mj mody adepcie, jeste ju bliski ujrzenia potgi i mocy
kompozycji.
Ucze: Tak, Mistrzu. Obecnie mog ju przy uyciu tej techniki dodawa nowe
zadania do poszczeglnych obiektw, wczajc w to zadania, o ktrych nawet
si nie nio projektantom klasy nadrzdnej. Co wicej, nie musz w aden sposb
modyfikowa ich kodu!
Mistrz: A czego nauczye si o wpywie, jaki zastosowanie kompozycji wywiera
na moliwo zarzdzania i modyfikacji kodu programu?
Ucze: To jest wanie to, do czego zmierzaem, Mistrzu. Wykorzystujc
dynamiczn kompozycj obiektw, mog im nadawa nowe cechy poprzez proste
tworzenie nowego kodu, a nie modyfikacj kodu istniejcego. Zatem, poniewa nie
bd modyfikowa istniejcego kodu, szanse na wprowadzenie nowego bdu czy
te zaistnienie nieoczekiwanych efektw ubocznych zdecydowanie malej.
Mistrz: Bardzo dobrze. Wystarczy na dzisiaj, mody czowieku. Teraz chciabym,
aby si oddali i odda dalszym medytacjom i rozwaaniom na ten temat
Pamitaj, kod powinien by tak zamknity (na zmiany), jak kwiat lotosu
o zmierzchu, ale jednoczenie tak otwarty (na rozbudow), jak kwiat lotosu o wicie.
jeste tutaj
115
Regua otwarte-zamknite
Regua otwarte-zamknite
Nasz mody adept sztuki projektowania jest teraz na najlepszej drodze do poznania
jednej z najwaniejszych regu projektowania:
Regua projektowania
Klasy powinny by otwarte
na rozbudow, ale zamknite
na modyfikacje.
OTWARTE
ZAMK NITE
GODZIN Y PR
ACY
PON. OD __
__ _DO __ __
_
W T. OD __
__ _ DO __ __
_
R . OD __
__ _ DO __ __
_
CZW. OD __
__ _ DO __ __
_
PI . OD __
__ _ DO __ __
_
Przepraszamy,
zamknite. To
prawda, spdzamy mas czasu, pracujc
nad tym, aby kod aplikacji by stabilny i wolny od
bdw, wic nie moemy pozwoli Ci go ot, tak
sobie modykowa. Kod musi, niestety, pozosta
zamknity na wszelkie modykacje. Jeeli Ci si to
nie podoba, moesz porozmawia z przeoonym.
Naszym celem jest umoliwienie atwej rozbudowy poszczeglnych
klas poprzez dodawanie im nowych zachowa, ale bez koniecznoci
modyfikacji ich istniejcego kodu. Co otrzymamy w zamian za nasze
wysiki po osigniciu tego celu? Struktury, ktre bd si atwo
adaptoway do zmian i bd wystarczajco elastyczne, aby przyj nowe
zachowania speniajce nowe wymagania.
116
Rozdzia 3
Wzorzec Dekorator
P:
P:
O:
O:
Otwarte na rozbudow
i zamknite na modyfikacje?
To wyglda na swego rodzaju
sprzeczno. W jaki sposb mona
osign tak struktur?
To jest bardzo dobre pytanie.
Faktycznie, na pierwszy rzut oka wyglda
to na sprzeczno. W kocu, jak by na to
nie patrze, im mniejsze s moliwoci
modyfikacji danego czego, tym trudniej
jest to co rozbudowa, prawda?
Jak si jednak okazuje, w programowaniu
zorientowanym obiektowo istnieje kilka
pomysowych technik pozwalajcych na
rozbudow istniejcych systemw nawet
w sytuacji, kiedy nie moemy modyfikowa
zasadniczego kodu aplikacji. Przypomnij
sobie wzorzec Obserwator (o ktrym
mwilimy w rozdziale 2.) Dodajc
nowe obiekty obserwujce, moemy
rozbudowa obiekt obserwowany bez
koniecznoci dodawania nowego kodu
do tego ostatniego. Niebawem poznasz
kilka nowych sposobw rozbudowy czy
te dodawania kolejnych zachowa przy
uyciu innych technik programowania
zorientowanego obiektowo.
P:
No dobrze, rozumiem
zasady funkcjonowania
wzorca Observer, ale w jaki
sposb, oglnie mwic, mona
zaprojektowa co, co bdzie
podatne na rozbudow, ale
jednoczenie zamknite na
modyfikacje?
O:
P:
Bd wiedzia, ktre
obszary zmian s najwaniejsze?
O:
jeste tutaj
117
We obiekt MocnoPalona.
1
2
118
Rozdzia 3
Wzorzec Dekorator
a
cnoPalon
biekt Mo lasy Napj
o
e
j,
a
t
Pami
szt(),
ania z k
y zachow owan metod ko
t
dziedzicz
n
e
m
le
zaimp
i posiada a koszt napoju.
licz
y
w
ktra
M o c n o Pa l o na
m. Jego typ
jest dekoratore
Obiekt Czekolada
wanego, czyli
ro
ko
p obiektu de
ty
a
dl
ie
rc
ie
zw
od
Napj (przez
dku obiektu klasy
taj, e po prostu
w naszym przypa
tu
a rozumiemy
dl
ie
rc
ie
w
dz
o
sowo
o typu).
jest tego sameg
a swoj metod
rwnie posiad u moemy
da
la
ko
ze
C
,
Jak wida
polimorfizm
wasnociom
Czekolad,
koszt() i dziki
rego dodamy
kt
do
j,
em
p
na
y
d
da jest podtyp
traktowa ka
iewa Czekola
on
(p
j
p
na
y
jako kolejn
.
klasy Napoje)
koszt()
koszt()
M o c n o Pa l o na
Czekolada
3
koszt()
Bi
koszt()
koszt()
M o c n o Pa l
tam
Mocha
o na
ietana
jeste tutaj
119
Charakterystyki dekoratora
A teraz nadszed wreszcie czas na obliczenie kwoty, jak powinien zapaci klient za
swoje zamwienie. Dokonamy tego poprzez wywoanie metody koszt() najbardziej
zewntrznego dekoratora, Bitamietana, ktry z kolei bdzie delegowa obliczanie
kosztw do obiektw, ktre dekoruje. Po uzyskaniu wynikw ich oblicze dekorator ten
dodaje swj koszt (bitej mietany) i dziki temu otrzymujemy cakowity koszt napoju.
Po pierwsze, wywoujemy
ej
metod koszt() najbardzi
a, jakim
zewntrznego dekorator
jest Bitamietana.
1.29z 0,10 z
koszt()
koszt()
0,20 z
to robi,
(O tym, jak on
a stron dalej).
lk
ki
dowiesz si
2 Dekorator Bitamietana
zt()
wywouje metod kos
.
ada
kol
Cze
a
tor
dekora
koszt()
na
ocnoPalo
0,99 zM
zekolada
Bit
amie ana
t
Obiekt MocnoPalona
zwraca swj koszt,
czyli 99 groszy.
swj koszt,
Dekorator Czekolada dodaje
jaki uzyska
czyli 20 groszy, do wyniku,
nastpnie
od obiektu MocnoPalona, a
z.
1,19
li
czy
zwraca ca sum,
Jeden obiekt podstawowy moe zosta zawinity zarwno w jeden, jak i w wiksz ilo
dekoratorw.
Przy zaoeniu, e dekorator jest tego samego typu, co obiekt dekorowany, moemy przekazywa
obiekt owinity dekoratorem zamiast obiektu oryginalnego.
Kluczow
Rozdzia 3
ienie
e zagadn
Wzorzec Dekorator
Powysza denicja opisuje nam jedynie przeznaczenie wzorca Dekorator, ale nie daje nam niemal
adnych wskazwek, w jaki sposb moglibymy zaimplementowa ten wzorzec w naszej aplikacji.
Rzumy okiem na diagram klas, ktry nieco rozjani nam ca sytuacj (na nastpnej stronie
zobaczymy t sam struktur, wykorzystan do rozwizania naszego problemu z napojami).
uyty samodzielnie
Kady skadnik moe by
oratorem.
bd te w poczeniu z dek
Skadnik
skadnik
metodaA()
metodaB()
// inne metody
SkadnikPodstawowy to obiekt,
ktremu bdziemy dynamicznie
dodawali nowe zachowania. Obiekt
dziedziczy z klasy Skadnik.
SkadnikPodstawowy
metodaA()
metodaB()
// inne metody
iada zmienn
DekoratorPodstawowy pos
odwoanie
uje
ow
ech
prz
ra
obiektow, kt
wanego.
do danego obiektu dekoro
Dekorator
metodaA()
metodaB()
// inne metody
y
zaimplementowan
Dekoratory maj
s
kla
d
js b
taki sam interfe
ie
obiekt, ktry bdz
abstrakcyjn, jak
dekorowany.
DekoratorPodstawowyA
DekoratorPodstawowyB
Skadnik obiektDekorowany
Skadnik obiektDekorowany
Obiekt nowyStan
metodaA()
metodaB()
noweZachowanie()
// inne metody
metodaA()
metodaB()
// inne metody
owywa
Dekoratory mog rozbud
nika)
ad
(sk
u
ekt
obi
ego
stan dan
dekorowanego.
jeste tutaj
121
Dekorujemy napoje
skadnik
opis
pobierzOpis()
koszt()
// Inne uyteczne metody...
SkadnikDekorator
MocnoPalona
StarCafeSpecial
pobierzOpis()
koszt()
koszt()
Bezkofeinowa
Espresso
koszt()
koszt()
w
adnik
klasy sk o jednym na .
y
r
e
t
z
p
y
C
h,
nek kaw
wowyc
podsta rowany gatu
e
f
kady o
Mleko
Czekolada
Bitamietana
MleczkoSojowe
Napj napj
Napj napj
Napj napj
Napj napj
pobierzOpis()
koszt()
pobierzOpis()
koszt()
pobierzOpis()
koszt()
pobierzOpis()
koszt()
Wysil szare
komrki
Zanim przejdziesz dalej, pomyl, w jaki sposb zaimplementowaby
metod koszt() dla poszczeglnych gatunkw kawy oraz dodatkw.
Zastanw si rwnie, jak zaimplementowaby metod pobierzOpis()
dla poszczeglnych dodatkw.
122
Rozdzia 3
Wzorzec Dekorator
aria
Sandra: Prawda. Myl jednak, e najwaniejsz spraw jest fakt, e dekoratory s tego samego typu
co obiekty, ktre maj by dekorowane. Krtko mwic, uywamy tutaj dziedziczenia po to, aby osign
zgodno typw, a nie po to, aby otrzyma okrelone zachowania.
Maria: No dobrze, rozumiem, e dekoratory potrzebuj tego samego interfejsu co skadniki
dekorowane, poniewa w zasadzie wystpuj one w miejsce rzeczywistych skadnikw. Ale skd w takim
razie pochodz poszczeglne zachowania?
Sandra: Kiedy tworzymy (metod kompozycji) nowy dekorator dla danego skadnika, wtedy wanie
dodajemy nowe zachowania. Krtki mwic, nowe zachowania tworzone s nie poprzez dziedziczenie
z klasy nadrzdnej, ale przez kompozycj poszczeglnych obiektw.
Maria: OK, czyli tworzymy klasy podrzdne dla superklasy Napj nie po to, aby dziedziczy zachowania,
ale po to, aby uzyska zgodno typw poszczeglnych obiektw. Dane zachowania bior si
z kompozycji dekoratorw z poszczeglnymi obiektami, jak rwnie i z innymi dekoratorami.
Sandra: Zgadza si.
Maria: Ooooo, teraz to rozumiem. A poniewa uywamy kompozycji obiektw, dysponujemy o wiele
wiksz elastycznoci w czeniu i dobieraniu dodatkw z napojami. Sprytne.
Sandra: Tak to ju jest, e jeli polegamy tylko na mechanizmie dziedziczenia, wszystkie zachowania
mog by ustalane statycznie w czasie kompilacji programu. Innymi sowy, otrzymujemy wtedy wycznie
zachowania, ktre daje klasa nadrzdna lub ktre zostaj przesonite przez metody w klasach
podrzdnych. Natomiast przy uyciu kompozycji moemy miesza i dobiera dekoratory w niemal
dowolny sposb i to dynamicznie, w trakcie dziaania programu.
Maria: I jeeli dobrze rozumiem, w dowolnym momencie moemy zaimplementowa nowe dekoratory,
ktre zapewni nam nowe zachowania. Jeeli polegalibymy tylko na mechanizmie dziedziczenia,
musielibymy modykowa istniejcy kod za kadym razem, kiedy chcielibymy dooy nowe
zachowania.
Sandra: Niby mona, ale pamitaj, e kiedy otrzymalimy ten kod od rmy Star Caf, abstrakcyjna
klasa Napoje ju bya tam zdeniowana. Tradycyjnie wzorzec Dekorator nie wymienia skadnika
abstrakcyjnego, ale w jzyku Java oczywicie moglibymy uy interfejsu. Pamitaj jednak, e zawsze
staramy si unikn modykacji istniejcego kodu, wic nie starajmy si tego naprawi tak dugo,
jak klasa abstrakcyjna spenia swoje zadanie.
jeste tutaj
123
na wywouje
2 Dekorator Bitamieta
olada.
a Czek
metod koszt() dekorator
pierwsze, wywoujemy
1 Po
metod koszt() najbardziej
zewntrznego dekoratora,
jakim jest Bitamietana.
0.10z
1.29z
koszt()
koszt()
koszt()
0.99z
0.20z
Czekolada
na
MocnoPalo
Bit
amietana
Deko
rator
Bita
swj
m
ko
wynik szt, czyli ietana do
daje
10 gro
u uzy
Czek
sk
szy, d
aneg
ola
koszt da i zwra o od deko o
ratora
ca ca
napo
kow
ju
ity
1,29
z.
imy dla
przygotowal
Ten schemat mocno palon kaw
na
zamwienia t mietan.
i bi
ad
z czekol
Obiekt MocnoPalona
zwraca swj koszt, czyli
99 groszy.
swj koszt,
Dekorator Czekolada dodaje
jaki uzyska od
czyli 20 groszy, do wyniku,
nie zwraca
obiektu MocnoPalona, a nastp
ca sum, czyli 1,19 z.
Zaostrz owek
Star Caf
Kawy
Star Cafe
Special
Mocno Palona
Bezkofeinowa
Espresso
0,89 z
0,99 z
1,05 z
1,99 z
Dodatki
Mleko
10
Czekolada
20
Mleczko sojowe
15
Bita mietana
10
Caf Sta
,
kolad
cze moesz
jn
z pod mietan wy
kaw
ka
it
wka: wym i b porcj leczka
z
a
Wsk kiem sojo rc jedn orcj m z
a
p
z
io
mlec zdzi, b ial, jedn kolady or
e
r
c
przy afe Spe porcje cz y.
C
n
Star ego, dwie ej mieta
sojow porcj bit
jedn
Ca
f Star Ca
124
Star Caf
f
Caf
S
tar
r
Sta
Rozdzia 3
gr
gr
gr
gr
Wzorzec Dekorator
jeste tutaj
125
Implementacja napojw
dziczy
a Espresso dzie
Poniewa klas
tpliwie
, sama jest niew
po klasie Napj
napojem.
y warto
Aby dooy opis do napoju, ustawiam
. Pamitaj,
klasy
tej
e
torz
truk
kons
w
zmiennej opis
zona z klasy
dzic
e zmienna obiektowa opis jest dzie
nadrzdnej Napj.
i
artwi o dodatk
ie musimy si m
N
.
so
es
i
pr
yl
Es
cz
y
,
t kaw
presso
y wyliczy kosz
i cen kawy Es
W kocu musim
camy bezporedn
ra
zw
tu
os
pr
c po
i ich koszty, wi
dku 1,99 z.
pa
zy
pr
ym
sz
na
w
126
Rozdzia 3
Star Caf
Kaw y
afe
Star C
0,89 z
l
a
i
c
e
Sp
0,99 z
Palona ,05 z
Mocno
1
einowa
Bezkof
1,99 z
o
s
s
e
r
p
Es
i
10 gr
Dodatk
o
k
e
20 gr
Ml
ada
l
r
o
k
e
z
C
we 15 g
o sojo
r
g
0
1
Mleczk
ietana
m
a
t
Bi
Wzorzec Dekorator
jpierw
tkiem czekolady. Na
cen napoju z doda
zy
tak
lic
tu,
wy
y
iek
ob
sim
go
mu
z
ne
ra
Te
szt() do dekorowa
ko
y
tod
me
nie
na
do
ko
delegujemy wy
y koszt czekolady
, a nastpnie dodajem
aby uzyska jego koszt
uzyskanego rezultatu.
Zaostrz owek
jeste tutaj
127
Testowanie napojw
Podajemy kaw
Gratulacje. Nadszed czas, aby spokojnie usi, zamwi kilka lianek
aromatycznej kawy i w caej rozcigoci podziwia elastyczno projektu,
ktry stworzylimy przy wykorzystaniu wzorca Dekorator.
Oto prosty kod, ktry umoliwia przeprowadzenie testw* naszej aplikacji:
public class StarCafe {
atkw)
d
o (bez do
Espress .
w
a
k
ia
w
Zama
az cen
jej opis or
i drukuje
}
}
128
Rozdzia 3
Wzorzec Dekorator
P:
Zastanawiam si nad
funkcjonowaniem kodu, ktry
testowaby tylko wybrane skadniki
powiedzmy, kaw StarCafeSpecial
i wykonywa jak operacj, np.
udziela rabatu na ten gatunek kawy.
W sytuacji, kiedy taki kod zostaby
zawinity w jeden lub wicej
dekoratorw, przestaby przecie
dziaa.
O:
P:
O:
P:
O:
Zaostrz owek
Nasi przyjaciele ze Star Caf wprowadzili do menu wielkoci kawy.
Obecnie moesz kupi kaw w trzech rozmiarach: ma, redni i du.
Specjalici ze Star Caf stwierdzili, e takie elementy powinny by
nieodczn czci klasy opisujcej napoje, std dodali do klasy Napj
dwie metody: ustawWielko() oraz pobierzWielko(). Chcieli rwnie,
aby poszczeglne dodatki byy wyceniane w zalenoci od wielkoci napoju,
przykadowo, MleczkoSojowe bdzie kosztowao 10 gr, 15 gr oraz 20 gr
odpowiednio dla maej, redniej i duej kawy.
W jaki sposb naleaoby zmodykowa klasy opisujce dekoratory,
aby mogy one sobie poradzi z powyszym zadaniem?
jeste tutaj
129
Li
Bu
ne
Num
Obiekt LineNumberInputStream
rwnie jest dekoratorem, ktrego
zadaniem jest umoliwienie
policzenia iloci odczytywanych
wierszy danych.
F il e I n p u t S t r e a m
ffe
redIn
putStream
ber I n p u t S t r eam
Obiekt BufferedInputStream jest
ream
dekoratorem. Klasa BufferedInputSt
:
owa
zach
ych
now
aje
rodz
dodaje dwa
danych
ia
mien
stru
anie
row
bufo
wnia
zape
caego
wejciowych, co polepsza wydajno
interfejs,
uje
udow
rozb
nie
procesu, jak rw
Line(),
dodajc do niego now metod read
pliku
z
ch
dany
ktra pozwala na odczyt
z.
tekstowego po jednym wierszu nara
.
skadnikiem
orowanym
ek
d
st
je
ug
m
s
ch ob
InputStrea
pewniajcy dnych
Obiekt File
ka Java, za
ezb
zy
ni
j
s
a
eg
kl
er
Biblioteka
zawiera sz
,
ia
c
yj
-w
cia
Stream,
operacji wej ch jak klasy FileInput
m
ki
yInputStrea
, ta
ByteArra
,
skadnikw
m
ea
tr
S
rInput
StringBuffe
.
ch
ny
in
i wiele
130
Rozdzia 3
Wzorzec Dekorator
a
Oto nasz sk
kcyjny.
dnik abstra
Klasa FilterInputStream
jest dekoratorem
abstrakcyjnym.
InputStream
FileInputStream
StringBufferInputStream
PushbackInputStream
FilterInputStream
ByteArrayInputStream
BufferedInputStream
DataInputStream
LineNumberInputStream
entacje
I wreszcie tutaj mamy implem
w.
poszczeglnych dekorator
Jak sam zapewne zauwaye, powyszy diagram klas wcale tak bardzo
nie rni si od naszego projektu aplikacji dla Star Caf. Obecnie nie
powiniene mie ju wikszych trudnoci ze zrozumieniem podrcznikw
uytkownika pakietu java.io API, jak rwnie z samym tworzeniem
dekoratorw dla rnych strumieni danych wejciowych.
Niebawem przekonasz si, e strumienie danych wyjciowych maj tak sam
struktur. Zapewne zorientowae si ju, e strumienie Reader oraz Writer
(odpowiednio dla wejcia i wyjcia danych znakowych) s niemal dokadnym
odzwierciedleniem struktury klas strumieni (z kilkoma wprawdzie drobnymi
rnicami i niekonsekwencjami, ale na tyle maymi, e mona bez trudu
zrozumie zasady ich funkcjonowania).
Z drugiej strony, pakiet java.io odsania rwnie jedn z najciemniejszych stron
wzorca Dekorator: projekty budowane z wykorzystaniem tego wzorca czsto
charakteryzuj si powstawaniem duej iloci niewielkich klas, ktre pniej
mog stanowi powane utrudnienie dla projektanta chccego skorzysta
z opartego na tym wzorcu API. Teraz jednak, kiedy ju doskonale znasz zasady
funkcjonowania wzorca Dekorator, moesz na takie zjawisko zwraca wiksz
uwag; kiedy za bdziesz korzysta z czyjego API przepenionego rnymi
dekoratorami, z pewnoci atwiej bdzie Ci si zorientowa w caej strukturze
klas i wykorzystywa poszczeglne dekoratory w sposb zapewniajcy
osignicie optymalnych, danych rezultatw.
jeste tutaj
131
pakietu
importowa
za
j
ni
om
p
e zosta
Nie za
iedni kod ni
ow
p
d
(o
.io
java
ny).
tutaj pokaza
bdzie
Przede wszystkim musimy utworzy now podklas, ktra
torze
dekora
m
kcyjny
abstra
am,
utStre
FileInp
dziedziczy po klasie
).
tream
InputS
(xxxxx
owych
wejci
ieni
strum
klas
tkich
wszys
132
Rozdzia 3
Wzorzec Dekorator
tStream
klasy FileInpu
kt
ie
ob
zy
Twor
iektami
koruje go ob
de
e
ni
ym nowym
p
st
i na
m oraz nasz
ea
tr
S
ut
np
BufferedI
Stream.
erCaseInput
filtrem Low
in.close();
} catch (IOException e) {
e.printStackTrace();
}
Korzystajc ze strumienia danych,
odczytujemy dane z pliku i na bieco
drukujemy je na ekranie.
Odpalamy program:
plik test.txt
orzy ten
Musisz utw
elnie.
plik samodzi
jeste tutaj
133
Dekorator: Tak. Wiem, e wszyscy naokoo widz mnie jako wspaniay wzorzec projektowy, podczas
gdy sam wiesz, jak to jest musz sobie radzi z rnymi problemami, tak jak kady z nas.
mao przyjaznych i trudnych do zrozumienia na pierwszy rzut oka. Jeeli jednak oni zrozumieliby, e cay
ten zestaw rnych klas to po prostu zestaw dekoratorw zbudowanych dookoa klas InputStream, ich ycie
staoby si o wiele atwiejsze.
HeadFirst: Ale to przecie nie wyglda le. W niczym nie zmienia to faktu, e nadal jeste wspaniaym
wzorcem, a caa reszta to po prostu kwestia odpowiedniej edukacji i szkolenia, prawda?
Dekorator: No... niestety, obawiam si, e jest co jeszcze. Mam pewne problemy z kodem: widzisz,
niektrzy ludzie po prostu bior odpowiedni fragment kodu klienta, ktry operuje na okrelonych typach
obiektw, i wprowadzaj dekoratory, nie mylc ju o niczym innym. Jedn z moich naprawd wspaniaych
cech jest to, e w wikszoci przypadkw dekoratory moesz wstawi w sposb cakowicie przezroczysty
i klient nigdy nie musi by poinformowany, e je wykorzystuje. Ale, niestety jak ju wspomniaem
niektre partie kodu s uzalenione od okrelonych typw obiektw i kiedy zaczniesz wprowadza
do takiego ukadu dekoratory, robi si mae Bum!. I zaczyna by naprawd le.
HeadFirst: Wiesz co, myl jednak, e wszyscy doskonale zdaj sobie spraw, e przy wprowadzaniu
dekoratorw do kodu naley zachowa pewn ostrono. Nie sdz, aby by to wystarczajcy powd
do robienia sobie powanych wyrzutw.
Dekorator: No wiem, wiem, i mimo wszystko staram si tego nie robi. Innym problemem, z ktrym
si musz boryka, jest to, e wprowadzenie dekoratorw do aplikacji moe spowodowa wzrost stopnia
zoonoci kodu niezbdnego do prawidowego tworzenia obiektw poszczeglnych klas skadnikw.
Kiedy korzystasz z dekoratorw, musisz nie tylko utworzy sam obiekt danej klasy, ale jeszcze dodatkowo
opakowa go Bg wie iloma dekoratorami.
HeadFirst: Na przyszy tydzie mam ju zaplanowany wywiad z wzorcami Fabryka oraz Builder
syszaem, e one mog by wielce pomocne przy rozwizywaniu tego problemu?
tworzenie elastycznych projektw pozostajcych w zgodzie z regu otwarte-zamknite, wic nie przejmuj
si niczym, gowa do gry i myl pozytywnie!
134
Rozdzia 3
Wzorzec Dekorator
programoPo d s t a w y
ktowego
w a n ia o b ie
o
gramowaReguy pro
wego
n ia o b ie k t o zacji to, co si zmienia.
h e r m e ty
Po d d a w a j
z ie d z ic z e y c j n a d d
z
o
p
m
o
k
j
da
P r z e d k a
w,
n ie .
in te r fe js
tw o r z e n iu
a
n
si
j
u
S k o n c e n tr n ta c ji .
me
a n ie im p le
w k t r y c h
p r o je k ty,
y
z
r
o
tw
o w i z a n e
S ta r a j si
b lu n o p u j n a
so
e
z
s
o b ie k ty
ie o d d z ia
m o li w e , n
i, o il e to
je m n ie .
si e b ie w z a
te
twar
in n y b y o
K la s y p o w , a le z a m k n i t e
ow
n a r o z b u d je .
ac
n a m o d y f ik
A b st r a k c
y jn
a c ja
H e r m e ty z
m
Po li m o r fi z
e n ie
D z ie d z ic z
ego
o b ie k t o w
a m o w a n ia
r
g
o
r
p
e
c
zy
Wzor
jeinpyo m i d
iu
z
in
f
d
e
o
d
r
je
wd ytnaakmi ic z n e
lu
w adteofrin iu d e n - d o -ewraiem
r
e
s
b
e
a
y
n
O
g
e
la
t
je
h
a
w
Str
r icahpnoyz o b ieb iek tk tzomwiei n- o w y c h
m,iedrkoeola
kroacnjtuoje
btiemk taw
o
D
w
y
r
y
a lg o s p o s b, prez ykddiezudiejela, nieyebdrsatnieae mjjeugsyooidoabjieeklat ys t y c z n o
o w o , aws. zDyesktokcr aSt otrr a toemgioyiendez ici z e n ie ,
t y z a cnjiia ispw zj asctha.onwW
zdooorttzyeemj, japkowdiaa jed d z n ie r o z s z e e
n
n
j
ie
a
t
m
s
n
y
o
n e .z n a c z
o n e wz a le n epzo d o b
t ukawli zzoawmaia n
c zunjiec jez adkn a
a u t o m aotfye r f u n k c jo n a ln o .
rzon
ktry spenia
ec projektowy,
rz
zo
w
y
sz
w
nasz pier
naprawd by
A tutaj mamy
te. Czy jednak
i
kn
y,
am
-z
te
ar
otw
o ju uywalim
wymogi reguy
wzorzec, ktreg
ny
in
ki
ja
st
je
pierwszy? Czy
regu?
by zgodny z t
a ktry rwnie
KLUCZOWE
ZAGADNIENIA
jeste tutaj
135
Rozwizania wicze
Rozwizania wicze
public class Napj {
// deklaracje zmiennych obiektowych mlekoKoszt,
// mleczkoSojoweKoszt, czekoladaKoszt, bitamietanaKoszt
dodatekKoszt += mlekoKoszt;
}
if (zMleczkiemSojowym()) {
dodatekKoszt += mleczkoSojoweKoszt;
if (zCzekolad()) {
dodatekKoszt += czekoladaKoszt;
}
if (zBitmietan()) {
dodatekKoszt += bitamietanaKoszt;
}
return dodatekKoszt;
}
}
or Bitamietana
2 Dekorat
ratora Czekolada.
koszt() deko
metod koszt()
Dekorator Czekolada wywouje
metod
Po pierwsze, wywoujemy
znego
koszt() najbardziej zewntr
mietana.
dekoratora, jakim jest Bita
wywouje
Drugi dekorator Czekolada
ojowe.
koszt() dekoratora MleczkoS
5
r
Sta Ca
f
Ca
ar
Star
Caf
0,10 z
koszt()
0,20 z
koszt()
koszt()
koszt()
0,15 z
0,20 z
St
Ml
a
Bit
m
ie
Cz
Rozdzia 3
ze stosu.
koszt()
0,89 z
Star
CafeSpecial
ecz
koS
Cz
ojow
eko
e
lada
eko
lada
tana
136
1,54 z
metod
ratora
Metoda koszt() drugiego deko
swoje
Czekolada dodaje do kosztu
cji
20 gr, zwraca wynik tej opera
i schodzi ze stosu.
Wzorzec Dekorator
Rozwizania wicze
Nasi przyjaciele ze Star Caf wprowadzili do menu wielkoci kawy. Obecnie
moesz kupi kaw w trzech rozmiarach: ma, redni i du. Specjalici ze Star Caf
stwierdzili, e takie elementy powinny by nieodczn czci klasy opisujcej napoje,
std dodali do klasy Napoje dwie metody: ustawWielko() oraz pobierzWielko().
Chcieli rwnie, aby poszczeglne dodatki byy wyceniane w zalenoci od wielkoci
napoju, przykadowo, MleczkoSojowe bdzie kosztowao 10 gr, 15 gr oraz 20 gr
odpowiednio dla maej, redniej i duej kawy.
W jaki sposb naleaoby zmodykowa klasy opisujce dekoratory, aby mogy one sobie
poradzi z powyszym zadaniem?
jeste tutaj
137