Professional Documents
Culture Documents
Spis treci
Przykadowy rozdzia
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
Kontakt
Helion SA
ul. Kociuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
Helion 19912010
Wzorce projektowe.
Rusz gow!
Autorzy: Elisabeth Freeman, Eric Freeman,
Bert Bates, Kathy Sierra
Tumaczenie: Adam Balcerzak, Marcin Jdrysiak,
Tomasz Wasilewski
ISBN: 978-83-246-2803-2
Tytu oryginau: Head First Design Patterns
Format: 200230, stron: 656
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
6
! spis_tresci_00.indd 6
2005-06-29 10:10:32
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
ulated
Encaps
avior
y beh
ZG
Twj M
ace>>
<<interf
avior
FlyBeh
y()
ay
FlyNoW
Wings
y() {
- cant y!
// do nothing
FlyWith
y() {
nts duck
// impleme
Duck
FlyBeha
QuackB
swim()
perform
quack
ulated
Encaps
display(
behavio
ace>>
<<interf
ior
QuackBehav
Quack()
quack()
Fly()
)
ehavior(
ior()
kBehav
setQuac
e methduck-lik
// OTHER
perform
setFlyB
MuteQuack
Squeak
Quack
Decoy
Rubber
Object
that holds
state
Redhead
Mallard
Duck
Duck
{
display()
}
a redhead
// looks like
{
display()
}
a mallard
// looks like
Su
bje
int
t
ct Objec
Duck
Duck
){
display(
like a decoy
// looks
{
display()
k}
a rubberduc
// 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
ying
vior;
vior yBeha
ehavquackB
ehavior
Client
MVC
l
est
Requ
View
Mode
az ju cakiem
Twj Kod, ter
cony poprzez
nowy i wzboga
wzorcw
zastosowanie
projektowych.
7
! spis_tresci_00.indd 7
2005-06-29 10:10:32
Wzorzec Obserwator
Jak sprawi, by Twoje obiekty byy
zawsze dobrze poinformowane
Pod st a w y
ow eg o
a ni a ob ie kt
p ro g ra m ow
o
ak
tr
bs cyjn
A
69
74
75
ja
Hermetyzac
78
Polimorfizm
ie
Dziedziczen
81
83
86
87
hermetyz
Poddawaj
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
94
101
104
Rozwizania wicze
107
RELACJA JEDEN-DO-WIELU
Ob
iekt
int
an y
w
obserwo
8
8
Obie
8
Obie
Automatyczna aktualizacja
(powiadamianie)
kt Pies
kt Kaczk
Obie
Obie
kt Kot
kt Mysz
Ob iek ty za le ne
a
g ra m ow a ni
R eg u y p ro
o
ob ie kt ow eg
zmienia.
acji to, co si
Obiekty obserwujce
(Observers)
8
! spis_tresci_00.indd 8
2005-06-29 10:10:35
Wzorzec Dekorator
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
9
! spis_tresci_00.indd 9
2005-06-29 10:10:35
Wzorzec Fabryka
<<interfejs>>
Ciasto
GrubeChrupkieCiasto
<<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
140
Pizza w Obiektowie
142
144
145
147
150
151
CienkieChrupkieCiasto
<<interfejs>>
FabrykaSkadnikwPizzy
utwrzCiasto()
utwrzSos()
utwrzSer()
utwrzWarzywa()
utwrzPepperoni()
utwrzMae()
wieeMae
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
10
! spis_tresci_00.indd 10
2005-06-29 10:10:36
Wzorzec Singleton
Hershey, PA
198
May Singleton
199
201
202
Fabryka czekolady
203
205
206
207
208
212
214
Rozwizania wicze
216
ramowania
Wzorce prog
obiektowego
jeden, doieko
amjei relacj e
ktnu
y ob
gomryitm
dzw
e.dz
yjealpo
laninia
ie
in
ie
nn
ie
dz
zm
ro
zy
ym
iu
kt
w
je
ie
pr
fin
e
iu
e
ob
onmraicnyzn
fin de
na
ysidyw
yb
ajed
j
stki
s do
na
erwdeator wodujpo
e
rfmyejda
a
or
e,
ty
al
te
at
StrateOgybs
o
go
e
in
,
or
zw
a
ne
aj
b
ek
cz
st
da
D
os
po
y
.ar
jleow
estzo
ki sp
n
doa
taor
yf
ch
wiat
za
od
ekjior
lu
poyczwh alajc
mob
e,rfzaejlesn
hjnikyzaaac
D
ieac
kt
b
ni
cy
u
na
yc
ie
lu
-wyz
ze
a
ak
w
h
tm
ic
doet
al
ich herm
tr
te
no
yc
ry
dz
i
go
in
bs
zw
on
ie
e.
go
je
je
A
ow
ni
po
dz
anfiniu
yma tylko
jew
tkktaie
ow
re
dn
da
liz
brysieyk
de
ydz
z
uszob
k
spaalok
ua
wFa
r
jago
h klpoasdr
kt
kt
j,tein
nete,mgy
icom
za
ec jStda
ia
c
a,
a
te
straan
m
ie
uj
ro
ni
nt
do
ie
zn
ie
yk
as
la
ch
kl
dz
kl
Wzorzsw
yc
on
br
y
re
bn
a
b
at
rz
od
Fa
ok
ca
al
do
a
m oda
eize
zepozw dana klas
nino
toaet
ni
zseci
aupo
ro, alo
altye
or
iewzn
M
ez
ne
ny.
alny
ni
tw
nieldo
iocz
ko
u ia
zac
asm
orzo
ktec
iezn
mw
eznob
pewnia,ktezostanieiektutuwi za
pow
algorytm
pewnia glob
iezakt
zeianinbe
or
n za
dnieak
naobwtw
c
od jesieb
yobiniestancj ob je odpowiedzialno za
Si.ngle, to
as
kl
ej
ki
ja
uywa. oferuj
chwa
jedn
tydo
zekazu
zywde.iscy
alno
rzec
i wycctznoriey Metdohotedjpr
instancji.
funkcjon
ecnkFat dostpu klas podrzdnych.
Wzorzpu
do
w
kt
obie
tworzenie
11
! spis_tresci_00.indd 11
2005-06-29 10:10:38
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
m
an
za
pis
u
za
blankiet re zostay
kt
menu,
utwrz
Zamwi
enie()
rem
z se
nka
ka
apie
owy
od
j s
Nap
z serem
zapiekank sodowy.
i napj
Klient wie
ju, czego
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
proce
czyna
rozpo
ien
ie(
cje
Kucharz realizuje instruk
i
podane w Zamwieniu
edni
przygotowuje odpowi
218
219
220
223
224
225
227
229
232
234
Implementujemy SuperPilota
236
238
241
246
250
Zastosowanie makropolece
251
254
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
posiek.
255
256
Rozwizania wicze
258
12
! spis_tresci_00.indd 12
2005-06-29 10:10:41
Zdolno do adaptacji
W niniejszym rozdziale mamy zamiar dokona paru niesamowitych
wyczynw z dziedziny rzeczy niemoliwych, takich jak na przykad
woenie kwadratowego koka do okrgego otworu. Brzmi nierealnie? Nie
wtedy, kiedy mamy pod rk odpowiednie wzorce projektowe. Pamitasz wzorzec Dekorator? Podczas
pracy z nim owijalimy obiekty innymi obiektami tak, aby nada im nowe zachowania. Teraz mamy zamiar
postpowa tak samo, ale w nieco innym celu: chcemy sprawi, by ich interfejsy wyglday jak co, czym
nie s. Dlaczego jednak mielibymy to robi? Na przykad po to, aby zaadaptowa projekt oczekujcy
danego interfejsu do klasy, ktra implementuje zupenie inny interfejs. To jeszcze nie wszystko; skoro
ju jestemy przy tym temacie, przyjrzymy si rwnie innemu wzorcowi, ktry owija obiekty w celu
uproszczenia ich interfejsw.
Adapter
260
261
265
267
268
271
272
273
276
279
282
285
288
289
294
Rozwizania wicze
296
Klient
danie
()
Obiekt
adaptowany
()
one
acz
um
nieT
da
Adapter
interfejs
obiektu
adaptowa
nego
Indyk to interfejs
adaptowanego.
y
low
rfejs
inte
doce
obiektu
fejs
uje inter
nt
impleme
dapter
IndykA Kaczka.
y
docelow
13
! spis_tresci_00.indd 13
2005-06-29 10:10:42
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
niektre etapy
delegowane s do
klasy podrzdnej
Podklasa
2
4
Herbata
W torebk herbaty do
Dodaj cytryn.
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
y do wrztku.
bat
her
bk
2 W tore
i.
baty do filiank
3 Nalej her
do smaku.
4 Dodaj cytryn
Zaparz napj.
wrztku.
Kawa
uoglnienie
niektre etapy
delegowane s do
klasy podrzdnej
Podklas
a Kawa
zon porcj
Zaparz odmier
kawy.
mleko.
i
Dodaj cukier
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
14
! spis_tresci_00.indd 14
2005-06-29 10:10:44
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
2
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
! spis_tresci_00.indd 15
2005-06-29 10:10:45
Wzorzec Stan
10
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
Brak
gum
lic
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
J e st
a
monet
um
a n ie
w yd a w
g um y
>
ie
ga
ki
zw ra ca
Automaty Sprzedajce SA
autom atu
konce pcj prac y kontr olera
Poni ej przed staw iamy nasz
lemen towa nie
. Mam y nadz iej, e zaimp
sprze dajc ego gum do ucia
zoc i
przys
spraw i Wam trudn oci. W
tego schem atu w Javie nie
my o proje kt
nowe zacho wani a, wic prosi
wa
doda
wne
zape
iemy
bdz
y do mody fikow ania.
moli wie elast yczny i atw
maty Sprz edaj ce
Auto
firmy
ie
ierow
Inyn
Guma na
da
sp r z e
16
! spis_tresci_00.indd 16
2005-06-29 10:10:45
Wzorzec Proxy
11
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.
i
Brzydk
adny
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()
Na porednika
dwie klasy.
PrawdziwyPrzedmiot
danie()
448
Proxy
danie()
az
skadaj si ter
InvocationHandler
invoke()
17
! spis_tresci_00.indd 17
2005-06-29 10:10:46
Wzorce zoone
12
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.
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
18
! spis_tresci_00.indd 18
2005-06-29 10:10:46
13
na nowe
Przewodnik
rcami
ycie z wzo
ir porad,
podrczny zb towymi
osz, nasz
ojek
pr
i
m
ca
Przy jmij, pr
or
Ci y z wz
ktre pomog acy i zmaganiach.
pr
w codziennej
jektowy;
wi o:
wzorzec pro
my w nim m
z terminem
Ci si
W Bdzie
zwizanych
dzo mog
tym, jak bar
ozumieniach
o
i
por
ych
nie
C
w projektow
gach wzorc
rzebne;
C katalo
pot
to
jest
nie
przyda;
tam, gdzie
a wzorcw
iu stosowani
w;
C unikan
to zajcie
waniu wzorc
, e nie jest
ym klasyfiko
ych i o tym
tow
C waciw
jek
ta autorem
pro
wzorcw
sz si, jak zos
wie
niu
Do
wa
h.
inio
nyc
bra
C def
ane dla wy
zarezerwow
, jak
n powag
wzorcw;
ktujemy z rw
u, ktre tra
niach umys
icze
of Four.
w
C
iczego Gang
Zen.
mn
ie
taje
ow
trz
mis
Czterech
orcw
o Gangu
tkownik wz
imy tosam
kady uy
mie
n
inie
W Ujawn
ki pow
c
imy, jakie ksi
tw, stosuj
W Zdradz ych.
na programis
i wpywa
projektow
ych.
by przyjaci
iemy, jak zdo gi wzorcw projektow
ow
Op
W
terminolo
precyzyjn
ard
Richlm
He
596
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
! spis_tresci_00.indd 19
2005-06-29 10:10:47
14
a
sk
Dodawanie nowych
rzW j() )
metod klasy Go nie
bie tne ie(
()
po owo alor ()
any
r
wpywa na kompozyt.
Zd bierzK iaka wod
o
po bierzB gl
po bierzW
po
wo wywoania
Klasa Go musi mie moli
j z klas. Jest
metody pobierzStan() kade
wadzi nowe metody,
wpro
a
miejscem, gdzie mon
y.
z ktrych bd korzysta klient
Bridge (most)
630
Builder (budowniczy)
632
634
636
Interpreter (interpreter)
638
Mediator (mediator)
640
Memento (memento)
642
Prototype (prototyp)
644
Visitor (go)
646
Stan()
pobierz
pobierzStan()
pob
ierzS
tan(
)
po
bie
rzS
Pozycja
tan
Menu
()
Go
()
tan
rzS
bie
po
Klient i Obiekt
przechodzenia
erser)
Obiekt przechodzenia (Trav
przez ca
umie przeprowadzi Gocia
w.
struktur kompozyto
Skadnik
Skorowidz
Menu
Pozycja
Menu
Skadnik
649
20
! spis_tresci_00.indd 20
2005-06-29 10:10:47
Jak sprawi, by Twoje
obiekty byy zawsze
dobrze poinformowane
Cze, Jarek,
wanie dzwoni po kolei do
wszystkich z informacj, e spotkanie
naszej grupy uytkownikw wzorcw
zostao przeniesione na sobotni
wieczr. Bdziemy omawia wzorzec
Obserwator. Tak, ten wzorzec jest
najlepszy. Jarek, on jest po
prostu NAJLEPSZY!
rozdzial_02_kor_II.indd 67
67
2005-06-29 09:49:22
Stacja meteorologiczna
Gratulacje!
Wasz zesp wanie wygra kontrakt na budow Pogodynki 2,
najnowszej generacji internetowej stacji sprawdzajcej
i podajcej aktualn pogod.
.o .
ka sp . z o
Po go d yn
25
a
w
zo
ul . D es zc
ie gowo
0 0 -0 0 0 n
y
spprac
enie o w
wiadcz
a
ez Pastw
rania prz
g
cji
y
a
w
st
ji
j
z
e
a
rnetow
cje z ok
racji inte
e gratula
e
n
n
z
e
c
g
e
j
e
rd
wsz
se
szej najno
my zoy
ym
Chcieliby ktu na budow na
tentowan
a
tr
itym, opa
owe
m
d
o
rm kon
o
k
g
a
o
n
p
j!
z
e
i
giczn
naszym
warunk
a
e
n
c
ie
my,
z
ie
y
d
b
meteorolo
b
i
li
arta b
ledz
Chcie
giczna op ry automatycznie
eryczne). za zadanie
lo
sf
ro
o
o
tm
te
a
e
t
ienie
iaa
Stacja m
odowe, k
oraz cin
bdzie m
ach
DanePog
wilgotno ktra pocztkowo biecych warunk stkie
,
ia
obiekcie
n
e
z
c
,
to
y
o
o
j
sz
c
j
a
w
c
ra
,
k
a
y
tu
li
a ap
inform
pogod
(tempera
a utworzy wne elementy:
zyma
prognoz
tr
rm
o
e
st
a
w
ro
o
sz
p
a
d
g
z
aby W
nePogo
zie ora
nie trzy
a
d
o
ra
D
g
k
t
e
o
k
p
a
ie
n
o
b
o
e
wywietla , dane statystyczn tym w chwili, gdy
ych
zywis
c
e
rz
.
h
e
c
pogodow
si
y
a
z
cji
pomiarow
wane w c
wersja sta a rynek
aktualizo dczyty z urzdze
n
ktywiczna
e
i
p
c
rs
u
o
e
p
p
e
y
e jest to
szoci w
najnowsz
y
,
tworzenie
rz
m
p
ty
m
j
e
o
to
sz
najbli
rojektan
pamita
p
w
k
e
m
a
c
y
takich
n
h
n
c
d
in
a
je
n
oliwi
ocza ie
d
m
Musimy
asza rm
u
e
N
tw
ra
j.
e
a
t
i
n
k
z
gic
ka 2,
odzie
sza rma
meteorolo o stacji Pogodyn
acji o pog
y, aby Wa
rm
m
fo
y
b
in
li
d
I
ia
ie
n
P
. Chc
wersj A
wywietla
nia stacji
sposobw
gramowa
ro
p
I.
o
owy
P
o
wasnych
A
g
e
isaniu um
takiego
do gwn
wersj
: po podp
n
sz
l
la
moduw
e
rw
n
sp
a
ie
e
p
p
n
y biz
kady
a nam
znakomit
sztami za
dostarczy
my,
a realizuje dodatkowymi ko
oczekuje
:
rm
a
z
c
sz
a
a
o
n
g
sz
ej
e
p
a
sz
e
,
a
jl
y
n
a
i
akcji
iar obc
teraz n
Uwaam
na zakup
stacji. A
amy zam
j
je
m
e
c
p
sz
m
o
a
te
n
n
d
z
acje
z klie
oci b
jcy inform
rm patn
jcej.
wywietla an przez Was fo
acji steru
w
alfa aplik
j
rs
e
e akcepto rmy!
w
z
ora
j
jekt stacji
wspaniae
my na pro
je
u
k
e
z
c
liwoci o
Z niecierp
niem,
Z powaa
ktu
nego obie
atentowa
p
.
y
o
c
o
o
g
n
e
w
sz
dzi
od na
m jeszcze
ierajce k
re
w
e
a
ri
z
u
e
k
w
a
astw
rdo
emy do P
P.S. Pliki
dowe wyl
o
g
o
P
e
n
Da
onsun,
Janusz M
68
Prezes
Rozdzia 2
rozdzial_02_kor_II.indd 68
2005-06-29 09:49:31
Wzorzec Obserwator
Czujnik
wilgotnoci
wywietla
pobiera dane
Warunki
biece
Temp. 22 OC
Wilgotno 60%
Cinienie
Termometr
Obiekt DanePogodowe
Stacja meteorologiczna
Wywietlacz
Barometr
Elementy dostarczane przez firm
Pogodynka sp. z o.o.
jeste tutaj
rozdzial_02_kor_II.indd 69
69
2005-06-29 09:49:32
Klasa DanePogodowe
PogodaDane
pobierzTemperatur()
pobierzWilgotno()
pobierzCinienie()
odczytyZmiana()
// inne metody
w,
z czujnik
odczyty nienia
e
ln
a
u
t
k
racaj a gotnoci oraz ci
etody zw
wil
Te trzy m : temperatury,
io
n
d
ie
w
o
odp
h
toci tyc
a
ycznego.
e s war i sposb otrzym
atmosfer
n
ia
w
a
t
s
k
u
ja
K
w
A
,
J
y o to,
ane wie
gicznej.
Nie dbam obiekt PogodaD stacji meteorolo
;
e
h
z
c
y
zmienn
formacje
owane in
zaktualiz
e
DanePogodow
ojektanci klasy
co
,
go
te
at
Jak wida, pr
m
te
wskazwk na
zostawili nam
y
o
musimy tutaj do
Warunki
biece
Temp. 22 C
Wilgotno 60%
Cinienie
/*
* Ta metoda jest wywoywana
* za kadym razem, kiedy zostan
zaktualizowane
* odczyty z czujnikw pogody
*
*/
public void odczytyZmiana() {
// tutaj umie odpowiedni kod
}
plik DanePogodowe.java
Wywietlacz
70
Rozdzia 2
rozdzial_02_kor_II.indd 70
2005-06-29 09:49:33
Wzorzec Obserwator
pobierzWilgotno()
pobierzCinienie()
odczytyZmiana()
Statystyka
rednia
temp.: 16,6 C
Min. temp.: 10 C
Max. temp.: 25,5 C
Warunki
biece
Temp. 22 C
Wilgotno 60%
Cinienie
Prognoza
Pierwszy tryb
wywietlania
Trzeci tryb
wywietlania
?
Przysze tryby
wywietlania
jeste tutaj
rozdzial_02_kor_II.indd 71
71
2005-06-29 09:49:33
Aktualizacja
wywietlanych
informacji
}
// w tym miejscu mona wstawi inne metody obiektu PogodaDane
}
element
y wywietlany
Wywouje kad wywietlania najbardziej
u do
go
i przekazuje m
z odpowiednie
ci odczytw
to
aktualne war
czujnika.
Zaostrz owek
Opierajc si na pierwszej implementacji naszego systemu, okrel, ktre z wymienionych
zdarze s prawdziwe. (Zaznacz wszystkie poprawne odpowiedzi).
72
A.
D.
B.
E.
F.
C.
Rozdzia 2
rozdzial_02_kor_II.indd 72
2005-06-29 09:49:34
Wzorzec Obserwator
mentacji
W przypadku tworzenia poszczeglnych imple
ani
a
wani
doda
nie mamy adnych moliwoci
ywania
usuwania wywietlanych elementw bez dokon
.
ramu
prog
e
kodzi
w
ji
modyfikac
uywa
Wyglda na to, e przynajmniej staramy si
ych
ietlan
wyw
dla
fejsu
inter
litego
wsplnego, jedno
d
meto
daj
posia
stkie
Wszy
ntw
eleme
oci
aktualizacja(), ktrej argumentami s wart
nia
cinie
oraz
i
tnoc
wilgo
enia,
temperatury otocz
o.
czneg
atmosfery
Hmmmm, ja
wiem, e jestem tutaj nowy,
ale poniewa znajdujemy si wanie
w rozdziale dotyczcym wzorca
Obserwator, moe w kocu
zaczlibymy z niego korzysta?
jeste tutaj
rozdzial_02_kor_II.indd 73
73
2005-06-29 09:49:34
Jeeli nie chcesz wicej otrzymywa danej gazety lub czasopisma, po prostu
wypowiadasz prenumerat i od tego momentu nowe wydania przestaj do Ciebie
dociera.
Jak dugo dany wydawca (czy te dany tytu prasowy) istnieje na rynku, tak dugo
rni ludzie, firmy, hotele, linie lotnicze itp. bd ustawicznie dokonyway nowych
prenumerat i wypowiaday stare prenumeraty.
74
Rozdzia 2
rozdzial_02_kor_II.indd 74
2005-06-29 09:49:34
Wzorzec Obserwator
Wydawca + Prenumerator
= wzorzec Obserwator
Jeeli rozumiesz zasady prenumerowania gazet i czasopism, oznacza to,
e cakiem dobrze rozumiesz zasady funkcjonowania wzorca Obserwator,
z tym tylko, e we wzorcu zamiast wydawcy wystpuje PODMIOT
(obiekt obserwowany), a zamiast prenumeratorw wystpuj OBIEKTY
OBSERWATORZY (obiekty obserwujce).
j
Obiekty obserwujce posiadaj subskrypc
ch
dany
ch
wany
alizo
zaktu
anie
myw
na otrzy
za kadym razem, kiedy informacje, jakie
nie.
posiada obiekt obserwowany, ulegaj zmia
obserwowanym ulegn
Kiedy dane w obiekcie
ty
iek
(ob
e
iekty obserwujc
zmianie, wszystkie ob
.
ne
wa
mo
or
inf
j o tym po
Obserwatorzy) zosta
dzania
Podmiot zarz
mi.
ny
da
i
m
pewny
Obiekt Pies
2
2
liczba
O b i e k t Kaczk
t obserwatorem,
Ten obiekt nie jes
poinformowany
wic nie zostaje
zachodz
ie
o zmianach, jak
obserwowanego.
tu
iek
w danych ob
Obiekt Kot
Obie
kt Mysz
Obiekty obserwujce
jeste tutaj
rozdzial_02_kor_II.indd 75
75
2005-06-29 09:49:35
Obiekt Pies
Obiek
t Kacz
Obie
ka
kt Mysz
Obiekty obserwujce
2
liczba
cakowita
Ob i
ekt o wowa
bser
ny
Obiekt Kot
Obiekty obserwujce
8
liczba
cakowita
Ob i
ekt o wowa
bser
ny
Obiekt obserwowany
otrzymuje nowe dane!
8
8
8
Obiekt Pies
8
Obie
kt kaczk
Obie
Obiekt Kot
kt Mysz
Obiekty obserwujce
76
Rozdzia 2
rozdzial_02_kor_II.indd 76
2005-06-29 09:49:35
Wzorzec Obserwator
8
liczba
cakowita
Obi
ek t o
Obiekt Pies
an u s
u
bserwow
m
nie
z li
sty
sub
Obie
skr
ybe
nt
kt kaczk
Obiekt Kot
w
Obie
kt Mysz
Obiekty obserwujce
8
Obi
ek t o
Obiekt Pies
an
bserwow
liczba
cakowita
Obie
Obie
kt kaczk
Obiekt Kot
kt Mysz
Obiekty obserwujce
Obiekt obserwowany
ponownie zmieni stan.
14
liczba
cakowita
14
Ob i
ekt o wowa
bser
ny
Obiekt Pies
14
14
Obie
Obie
kt kaczk
Obiekt Kot
kt Mysz
Obiekty obserwujce
jeste tutaj
rozdzial_02_kor_II.indd 77
77
2005-06-29 09:49:36
Piciominutowe przedstawienie
Piciominutowe przedstawienie
obserwowany kontra obserwujcy
W dzisiejszym skeczu dwch zakrconych projektantw oprogramowania
spotyka prawdziwego owc talentw
Mwi Robert.
Szukam nowego miejsca pracy
w charakterze projektanta systemw
opartych na Javie. Mam picioletnie
dowiadczenie oraz
Hmmm,
oczywicie, Ty
i kto tylko jeszcze bdzie
chcia, mj chopcze. Wanie
umieszczam Ci na mojej licie
projektantw systemw Java.
Nie dzwo do mnie, to ja do
Ciebie oddzwoni!
2
owca talentw (Podmiot)
Umieszcz
Twoje nazwisko na
mojej licie. Dziki temu
bdziesz informowana
na bieco, razem
z pozostaymi
obserwatorami.
Projektant nr 1
Cze,
mam na imi Joanna,
napisaam ju wiele
systemw wykorzystujcych EJB.
Jestem zainteresowana dowolnym
stanowiskiem pracy w dziale
zajmujcym si projektowaniem
systemw Java.
4
3
Projektant nr 2
Obiekt obserwowany
(Podmiot)
78
Rozdzia 2
rozdzial_02_kor_II.indd 78
2005-06-29 09:49:36
Wzorzec Obserwator
W midzyczasie ycie Roberta i Joanny biego swoim
zwykym torem; jeeli pojawiaa si jaka oferta pracy
dla projektantw Javy, otrzymywali informacje krtko
mwic, zostali obserwatorami.
Dziki! Za
chwil wysyam
swoje CV.
Hej,
obserwatorzy,
wanie si dowiedziaem,
e firma JavaBeans ma
kilka wakatw na stanowiskach
zwizanych z projektowania
systemw Java bierzcie si
za to!
Buehehehe,
masz to jak w banku,
kochanie!
7
Obserwator
Obserwator
Arghhh!
Zapamitaj moje sowa,
Joasiu, e jeeli tylko bd
mg uczyni co w tym kierunku,
nigdy wicej nie uda Ci si
znale pracy w tym miecie.
Skrelam Ci z mojej listy!!!
Obiekt obserwowany
8
Obserwator
Obiekt obserwowany
jeste tutaj
rozdzial_02_kor_II.indd 79
79
2005-06-29 09:49:36
80
Rozdzia 2
rozdzial_02_kor_II.indd 80
2005-06-29 09:49:37
Wzorzec Obserwator
Wzorzec Obserwator
definiuje relacj jeden-do
-wielu pomidzy obiektami
danego zbioru obiektw.
RELACJA JEDEN-DO-WIELU
Obiekt, ktrego
stan jest
obserwowany
bserwow
Obiekt Pies
8
Obie
kt kaczk
Obie
Obiekt Kot
kt Mysz
zalene
an
liczba
cakowita
Obi
ek t o
8
8
8
Obiekty
Obiekty obserwujce
Obiekt obserwowany oraz obiekty obserwujce s ze sob powizane relacj jeden-do-wielu. Obiekty obserwujce
s zalene od obiektu obserwowanego, co przejawia si w ten sposb, e jeeli obiekt obserwowany zmienia swj
stan, to wszystkie obiekty obserwujce zostaj o tym powiadomione. W zalenoci od sposobu, w jaki realizowane jest
powiadamianie, obiekty zalene mog by rwnie automatycznie aktualizowane (mog otrzymywa nowe dane od
obiektu obserwowanego).
Jak si niebawem sam przekonasz, wzorzec Obserwator moe by implementowany na kilka rnych sposobw,
aczkolwiek wikszo z nich obraca si dookoa tworzenia osobnych klas, ktre posiadaj interfejsy Podmiot oraz
Obserwator.
Rzumy na to okiem
jeste tutaj
rozdzial_02_kor_II.indd 81
81
2005-06-29 09:49:37
Lune zalenoci
lnymi
bdce potencja
Wszystkie obiekty
a interfejs
w
to
sz implemen
mu
i
am
or
at
rw
se
ob
tylko jedn
interfejs posiada
Obserwator. Ten
wywoywana,
cja(), ktra jest
metod, aktualiza
swj stan.
i
rwowany zmien
kiedy obiekt obse
rwnie
rwowany moe
Dany obiekt obse
do
e
e metody suc
posiada odrbn
(wicej
u
an
st
erania jego
ustawiania i pobi
imy nieco
w
ta
ds
ze
pr
n temat
informacji na te
niej).
pobierzStan()
ustawStan()
Nie istniej
gupie pytania
P:
Co to wszystko
ma wsplnego z relacj
jeden-do-wielu?
O:
82
Rozdzia 2
P:
O:
Wzorzec Obserwator
Nowych obserwatorw moemy dodawa w dowolnym momencie. Poniewa jedynym elementem, na ktrym
opiera si dziaanie obiektu obserwowanego, jest lista zarejestrowanych obiektw implementujcych interfejs
Obserwator, nowe obiekty obserwujce mog by dodawane w dowolnie wybranej chwili. W praktyce
w czasie dziaania programu moemy wymieni dowolny, zarejestrowany obiekt obserwujcy na inny
a obiekt obserwowany niezalenie od tego bdzie sobie funkcjonowa tak samo, jak do tej pory.
Jak atwo si domyli, w analogiczny sposb moemy usun w dowolnej chwili dowolny obiekt obserwujcy.
Dodawanie nowych typw obserwatorw nigdy nie pociga za sob koniecznoci modykacji obiektu
obserwowanego. Powiedzmy, e pojawia nam si (nie wnikamy, skd) nowa klasa, ktrej obiekty musz
by obserwatorami. Aby doda je do listy subskrybentw, nie musimy modykowa kodu obiektu
obserwowanego wszystko, czym musimy si zaj, to implementacja w nowym obiekcie interfejsu
Obserwator i zarejestrowanie nowego obserwatora na licie obiektu obserwowanego. Ten ostatni zupenie
nie bdzie si tym przejmowa; jego zadaniem jest po prostu dostarczanie okrelonych informacji
do wszystkich obiektw, ktre zostay zarejestrowane i implementuj interfejs Obserwator.
Ile r
n
moes ych rodza
j
z tuta
j nalic w zmian
zy?
Jedyn informacj, jak obiekt obserwowany posiada o obiekcie obserwujcym, jest to, e obiekt
obserwujcy posiada pewien okrelony interfejs (interfejs Obserwator). Obiekt obserwowany nie musi nawet
wiedzie, do jakiej klasy naley obiekt obserwujcy i czym si on zajmuje. Nie musi te zna adnej tego typu
informacji.
Zarwno obiekty obserwowane, jak i obiekty obserwujce mog by niezalenie od siebie wielokrotnie
wykorzystywane. Jeeli dla ktrego z obiektw obserwowanych lub obserwujcych znajdziesz inne
zastosowanie, moesz je atwo wykorzysta, poniewa s one ze sob bardzo luno powizane.
Zarwno zmiany wprowadzane do obiektu obserwowanego, jak do obiektw obserwujcych nie maj
wzajemnie na siebie adnego wpywu. Poniewa wspomniane dwa rodzaje obiektw s ze sob luno
powizane, moemy je niemal dowolnie modykowa tak dugo, jak dugo poszczeglne obiekty bd
speniay zaoenie posiadania poprawnie zaimplementowanego interfejsu Podmiot bd Obserwator.
Regua projektowania
Staraj si tworzy projekty, w ktrych obiekty
s ze sob luno powizane i, o ile to moliwe,
nie oddziauj na siebie wzajemnie.
rozdzial_02_kor_II.indd 83
83
2005-06-29 09:49:38
Zaostrz owek
Zanim przejdziesz do kolejnej sekcji, sprbuj naszkicowa struktur klas,
jakiej bdziesz potrzebowa do zaimplementowania oprogramowania stacji
meteorologicznej, wczajc w to klas DanePogodowe oraz jej elementy
odpowiadajce za wywietlanie. Upewnij si, e rysowany diagram pokazuje,
w jaki sposb poszczeglne elementy s ze sob poczone, a take wyjania,
w jaki sposb inny programista lub projektant moe doczy swj wasny, nowy
tryb wywietlania.
Jeeli potrzebujesz maej pomocy, przeczytaj to, co zamiecilimy na nastpnej
stronie; wyglda na to, e Twoje koleanki z boksu obok ju rozpoczy dysput
na temat tego projektu.
84
Rozdzia 2
rozdzial_02_kor_II.indd 84
2005-06-29 09:49:38
Wzorzec Obserwator
Sa
a:
ndr
A wic, w jaki
sposb bdziemy to co
budowa?
Maria: Dobrze wiedzie, e bdziemy si posugiwa wzorcem Obserwator.
To zdecydowanie pomaga.
Sandra: Taak ale w jaki sposb go zaimplementujemy?
Maria: Hmmm rzumy jeszcze raz okiem na definicj tego wzorca:
Wzorzec Obserwator definiuje pomidzy obiektami relacj jeden-do-wielu w taki sposb, e kiedy wybrany obiekt zmienia swj stan,
to wszystkie jego obiekty zalene zostaj o tym powiadomione i automatycznie zaktualizowane.
Maria: Jak si nad tym spokojnie zastanowi, wychodzi na to, e taka definicja ma sens. Nasza klasa,
DanePogodowe, jest wanie tym jednym, a wieloma s poszczeglne tryby wywietlania informacji o pogodzie.
Sandra: Racja. Klasa DanePogodowe posiada rwnie swoje stany to znaczy, mam na myli temperatur otoczenia,
wilgotno oraz cinienie atmosferyczne, a te wartoci definitywnie bd si zmienia na przestrzeni czasu.
Maria: Fakt, a kiedy odczyty tych parametrw bd si zmieniay, bdziemy musieli poinformowa o tym
wszystkie elementy odpowiedzialne za wywietlanie, tak aby mogy przetwarza nowe wartoci zgodnie ze swoim
przeznaczeniem.
Sandra: wietnie! Myl, e ju wiem, w jaki sposb moemy zastosowa wzorzec Obserwator do naszego
systemu ledzenia pogody wedug wskaza czujnikw stacji meteorologicznej.
Maria: Ale cigle pozostaje kilka spraw, ktre musimy rozway, a co do ktrych nie jestem cakowicie pewna,
e je dobrze rozumiem.
Sandra: Na przykad?
Maria: Na przykad to, w jaki sposb dostarczymy wyniki pomiarw poszczeglnych parametrw do elementw
odpowiedzialnych za wywietlanie danych.
Sandra: No c, przypomnij sobie, jak wyglda diagram wzorca Obserwator. Jeeli naszym obiektem
obserwowanym zostanie obiekt DanePogodowe, a obiektami obserwujcymi bd elementy (obiekty)
odpowiedzialne za wywietlanie poszczeglnych informacji, to aby otrzymywa aktualne informacje, obiekty takie
bd musiay najpierw zosta zarejestrowane przez obiekt obserwowany, prawda?
Maria: Tak a kiedy obiekt obserwowany bdzie zna list swoich subskrybentw, wystarczy, e bdzie wywoywa
odpowiednie metody, ktrych zadaniem bdzie przekazywanie im zaktualizowanych danych z pomiarw.
Sandra: Musimy jednak pamita, e kady wywietlany element moe by zupenie inny Wic tak sobie myl,
gdzie jest miejsce na wprowadzenie wsplnego interfejsu? Pomimo, e poszczeglne elementy mog by zupenie
odmiennych typw, wszystkie powinny posiada taki sam interfejs, tak aby obiekt DanePogodowe wiedzia, w jaki
sposb wysya im wyniki poszczeglnych pomiarw.
Maria: Wiem, o co Ci chodzi. Wynika z tego, e kady obiekt odpowiedzialny za wywietlanie bdzie posiada
metod, powiedzmy, aktualizacja(), ktra bdzie wywoywana przez obiekt DanePogodowe.
Sandra: i ta metoda aktualizacja() bdzie zdefiniowana w wsplnym interfejsie, zaimplementowanym
we wszystkich obiektach.
jeste tutaj
rozdzial_02_kor_II.indd 85
85
2005-06-29 09:49:38
ca
dmiot,
fejs Po mo.
r
e
t
in
sz
ajo
Oto na wyglda zn
a
n
in
w
o
p
Obiekty obserwujce
<<interface>>
Podmiot
<<interface>>
Obserwator
zarejestrujObserwatora()
usuObserwatora()
powiadomObserwatorw()
Ob
DanePogodowe
ser w
ujc
WarunkiBiece
aktualizacja()
wywietl() {// wywietl
biece wartoci pomiarw}
NowyTrybWywietlania
aktualizacja()
wywietl() {// wywietlaj
co innego w oparciu
o otrzymywane wartoci
pomiarw }
zarejestrujObserwatora()
usuObserwatora()
powiadomObserwatorw()
pobierzTemperatur()
pobierzWilgotno()
pobierzCinienie()
odczytyZmiana()
we posiada
Obiekt DanePogodo
owany
obecnie zaimplement
.
interfejs Podmiot
<<interface>>
WywietlElement
wywietl()
aktualizacja()
ob
iekt
StatystykaWywietlanie
aktualizacja()
wywietl() {// wywietl
warto redni, minimaln
oraz maksymaln poszczeglnych wielkoci}
PrognozaWywietlanie
aktualizacja()
wywietl() {// wywietlaj
biec prognoz pogody }
Podmiot
wykorzystywa interfejsy
Projektanci z innych firm mog
jcych
etla
wi
wy
w
nia wasnych obiekt
oraz Obserwator do tworze
).
nia
etla
wi
ch trybw wy
dane (do tworzenia wasny
86
Rozdzia 2
rozdzial_02_kor_II.indd 86
2005-06-29 09:49:39
Wzorzec Obserwator
WYT
UMYS
Maria i Sandra mylay, e przekazywanie wynikw pomiarw bezporednio do obiektw obserwujcych jest
najprostszym sposobem na ich uaktualnianie. Czy zgadzasz si z ich zdaniem? Wskazwka: czy w naszej aplikacji jest
jaki obszar, ktry moe w przyszoci ulec zmianie? Jeeli taka zmiana nastpi, to czy bdzie ona wystarczajco dobrze
hermetyzowana, czy te bdzie jednak wymagaa dokonania modyfikacji wielu innych czci kodu aplikacji?
Czy moesz pomyle nad opracowaniem nowych sposobw przekazywania uaktualnionych odczytw do obiektw
obserwujcych?
Nie musisz si przejmowa powrcimy jeszcze do problemu zatwierdzenia projektu aplikacji po zakoczeniu wstpnej
fazy jej implementacji.
jeste tutaj
87
public DanePogodowe() {
obserwatorzy = new ArrayList();
}
88
PAMITAJ: w prezentowanych
przykadach listingw nie umieszczamy
polece import ani package. Komplet
kodw rdowych poszczeglnych
przykadw znajdziesz na serwerze
FTP wydawnictwa HELION:
ftp://ftp.helion.pl/przyklady/wzorrg.zip
em jest
ArrayList, ktrej zadani
Dodalimy zmienn typu
e tej zmiennej
eni
orz
tw
a
,
rw
ato
erw
przechowywanie listy obs
DanePogodowe.
struktora obiektw klasy
umiecilimy w definicji kon
Wzorzec Obserwator
Nie istniej
je po prostu
Metoda wywietl() powodu
ualnych
akt
j
dzie
bar
naj
nie
wywietle
otnoci.
wilg
i
odczytw temperatury
gupie pytania
P:
O:
P:
Dlaczego odwoanie
do obiektu obserwowanego
(Podmiot) jest zapamitywane?
Przecie nie wyglda na to, aby
O:
jeste tutaj
89
worzym
Najpierw ut
obiekt klasy
e.
DanePogodow
90
Rozdzia 2
Wzorzec Obserwator
Zaostrz owek
Wanie przed chwil zadzwoni p. Janusz Monsun, prezes rady nadzorczej firmy Pogodynka sp. z o.o., i stwierdzi,
e sprzeda caego systemu nie bdzie moliwa, jeeli nie zostanie zaimplementowany nowy tryb wywietlania,
prezentujcy tzw. indeks ciepa. Poniej zaczamy definicj tego indeksu:
Indeks ciepa to wskanik, ktry czy ze sob wskazania temperatury i wilgotnoci powietrza i okrela rzeczywist
temperatur otoczenia (tzn. odczuwan temperatur). Aby obliczy warto indeksu ciepa, naley wzi warto
temperatury T*) oraz wilgotnoci wzgldnej RH, a nastpnie podstawi do poniszego wzoru:
indeksCiepa =
16.923 + 1.85212 * 10-1 * T + 5.37941 * RH - 1.00254 * 10-1 * T * RH +
9.41695 * 10-3 * T2 + 7.28898 * 10-3 * RH2 + 3.45372 * 10-4 * T2 * RH 8.14971 * 10-4 * T * RH2 + 1.02102 * 10-5 * T2 * RH2 - 3.8646 * 10-5 * T3 +
2.91583 * 10-5 * RH3 + 1.42721 * 10-6 * T3 * RH + 1.97483 * 10-7 * T * RH3
- 2.18429 * 10-8 * T3 * RH2 + 8.43296 * 10-10 * T2 * RH3 - 4.81975 * 10-11 *
T3 * RH3
Jak dziaa ta magiczna formua? Aby si tego dowiedzie, powiniene zajrze do ksiki Meteorologia. Rusz gow!
(o ile kiedy takowa si ukae), zapyta kogo pracujcego w Instytucie Meteorologii i Gospodarki Wodnej lub
po prostu zapyta Wielkiego Googlea (http://www.google.pl).
Po wprowadzeniu odpowiednich zmian i uruchomieniu programu wyniki jego dziaania powinny wyglda nastpujco:
akie
ny, j uway a
a
i
m
a ani
z
z
o
Ot iniene dzia
pow ynikach
w w ramu.
g
pro
jeste tutaj
91
Obiekt obserwowany
Ciesz si, e w kocu mamy okazj porozmawia
osobicie.
Obiekt obserwujcy
92
Rozdzia 2
rozdzial_02_kor_II.indd 92
2005-06-29 09:49:40
Wzorzec Obserwator
Obiekt obserwowany
Obiekt obserwujcy
To dlaczego po prostu nie napiszesz jakiej
publicznie dostpnej metody pozwalajcej
na pobieranie danych i nie udostpnisz nam
jej, abymy sami mogli pobiera niezbdne
informacje o Twoim stanie?
rozdzial_02_kor_II.indd 93
93
2005-06-29 09:49:40
Java zastosowanie
wbudowanego wzorca Obserwator
Jak pamitasz, do tej pory tworzylimy swj kod, zgodny z wymogami wzorca
Obserwator. Warto jednak wspomnie, e jzyk Java posiada take wasn obsug
tego wzorca, wbudowan w kilka rnych API. Najbardziej ogln implementacj
jest interfejs Observer i klasa Observable (oba elementy zlokalizowane w pakiecie
java.util). Elementy te s dosy podobne do naszych interfejsw Obserwator
i Podmiot, ale ju gotowe, i praktycznie natychmiast udostpniaj Ci swoj dosy
rozbudowan funkcjonalno. Dziki temu pakietowi moesz skorzysta zarwno
z metody wysyania powiadomie przez obiekt obserwowany, jak i z metody
pobierania stanu obiektu obserwowanego przez obiekty obserwujce, co zreszt
postaramy si zademonstrowa.
Dziki wbudowanej
w jzyk Java obsudze tego
wzorca wszystko, co musisz zrobi,
to tylko rozszerzy klas Observable
i poinformowa j, kiedy ma
powiadamia swoich obserwatorw.
Ca reszt wykona za Ciebie
API.
wszystkie
vable ledzi
Klasa Obser
ya do nich
w
i
rwujce ys
obiekty obse
a.
powiadomieni
odpowiednie
Observable to klasa,
a nie interfejs, std
klasa DanePogodowe
jest rozszerzeniem klasy
Observable (dziedziczy
po klasie Observable).
Observable
o.
yglda znajom
To powinno w
nie taki sam
ad
k
, jest to do
ie
ic
yw
cz
ze
R
agramie klas!
poprzednim di
interfejs, jak w
Obiekty obserwujce
<<interface>>
Observer
addObserver()
deleteObserver()
notifyObservers()
setChanged()
update()
sub
jec
OglnyWywietl
update()
wywietl()
StatystykaWywietl
update()
wywietl()
Pominlimy tutaj
interfejs WywietlElement,
aczkolwiek nadal jest
on zaimplementowany
we wszystkich klasach
odpowiadajcych za
wywietlanie.
PrognozaWywietl
update()
wywietl()
PogodaDane
pobierzTemperatur()
pobierzWilgotno()
pobierzCinienie()
glda
nie wy
ie
To ju jomo! Ale n m
e
a
n
z
a
b
k
ta
nie w
uj si, tego
jm
e
z
r
p
o
cimy d
powr
nie
u
wowany, ktry obec
temat
Oto nasz obiekt obser
.
ble
va
ser
Ob
wa
nazy
moemy w zasadzie
wicej metod
ju
my
uje
eb
trz
po
e
Ni
a()
a(), usuObserwator
or
at
rw
zarejestrujObse
ne
isa
op
)
w(
r
wato
ani powiadomObser
zymy teraz z klasy
zic
ied
dz
ia
an
ow
ch
za
nadrzdnej.
94
(dawna
zmian w metodzie update()
Tutaj musimy wprowadzi par
w zasadzie
ale
w,
tor
eglnych obserwa
metoda aktualizacja()) u poszcz
rfejs,
inte
lny
wsp
n,
jede
y
Nadal mam
caa idea jest cigle ta sama
rwo
obse wany.
() wywoywan przez obiekt
ktry posiada metod update
Rozdzia 2
rozdzial_02_kor_II.indd 94
2005-06-29 09:49:40
Wzorzec Obserwator
dowolnego
a na pobranie stanie
al
zw
po
a
sj
Ta wer
pnie zo
ch, ktry nast miania do
obiektu dany
da
ia
w
po
s
podcza
przekazany
ych obiektw
an
w
ro
st
je
re
wszystkich za
h.
yc
c
uj
rw
se
ob
obiekt
danych
Jeeli chcesz wysya dane do obserwatorw, moesz przekaza odpowiednie dane jako obiekt danych
do metody notifyObserver(arg). Jeeli nie, obserwator musi pobiera potrzebne dane z obiektu
(obserwowanego) klasy Observable, ktry zostaje do niego przekazany. Jak? Zmienimy teraz po raz
kolejny projekt naszej stacji meteorologicznej i wtedy przekonasz si sam.
jeste tutaj
rozdzial_02_kor_II.indd 95
95
2005-06-29 09:49:41
Za kulisami
Czekaj, zanim si za to
wemiemy, wyjanij, prosz, do
czego bdzie nam potrzebna metoda
setChanged()? Poprzednio jej nie
potrzebowalimy.
Za
kulisami
setChanged() {
changed = true
}
ment
Frag okodu
d
pseu
s
kla y vable.
r
Obse
notifyObservers(Object arg){
if (changed) {
dla kadego obserwatora na licie {
call update(this, arg)
}
changed = false
}
}
awia flag
Metoda setChanged() ust
da (true).
aw
pr
rto
changed na wa
) bdzie
Metoda notifyObservers(
wycznie
ia
ien
wysyaa powiadom
changed
ga
fla
j
nie
ze
wtedy, jeli wc
rto
zostanie ustawiona na wa
prawda (true).
notifyObservers(){
notifyObservers(null)
}
Dlaczego takie rozwizanie jest konieczne? Metoda setChanged() zostaa pomylana jako sposb na
zapewnienie wikszej elastycznoci w sposobie powiadamiania obserwatorw, sposb pozwalajcy na
wprowadzenie optymalizacji powiadomie. Przykadowo, zamy, e na naszej stacji meteorologicznej
znajduj si tak bardzo czue przyrzdy, e odczyty temperatury cigle oscyluj wok pewnej temperatury
bazowej z dokadnoci do kilku setnych czci stopnia. Taka sytuacja moe spowodowa, e obiekt klasy
DanePogodowe bdzie nieustannie wysya nowe powiadomienia. Zamiast do tego dopuci, lepiej bdzie
wysya powiadomienia wycznie wtedy, kiedy rnica temperatury pomidzy dwoma kolejnymi pomiarami
wyniesie, dajmy na to, co najmniej p stopnia (inaczej mwic, tylko w takiej sytuacji wywoana zostanie
metoda setChanged()).
By moe nie bdziesz zbyt czsto korzysta z opisanego przed chwil mechanizmu, niemniej jednak, jeeli ju
zaistnieje taka konieczno, warto pamita, e rozwizanie masz gotowe. Pamitaj rwnie, e jeeli chcesz,
aby powiadomienia w ogle dziaay, musisz najpierw wywoa metod setChanged(). Jeeli zdecydujesz si
na korzystanie z opisanego mechanizmu, warto rwnie wspomnie o metodach takich, jak clearChanged()
(ustawia ag changed na warto fasz (false)) czy hasChange() (zwraca aktualny stan agi changed).
96
Rozdzia 2
rozdzial_02_kor_II.indd 96
2005-06-29 09:49:41
Wzorzec Obserwator
import java.util.Observable;
import java.util.Observer;
public class DanePogodowe extends Observable {
private float temperatura;
private float wilgotno;
private float cinienie;
public DanePogodowe() { }
public void odczytyZmiania() {
setChanged();
notifyObservers();*
}
jeste tutaj
rozdzial_02_kor_II.indd 97
97
2005-06-29 09:49:41
import java.util.Observable;
import java.util.Observer;
public class WarunkiBieceWywietl implements Observer, WywietlElement {
Observable observable;
Konstruktor naszej klasy pobiera
private float temperatura;
3 obecnie obiekt klasy Observable, a my
private float wilgotno;
wykorzystujemy to do wpisania obiektu
opisujcego warunki biece na list
public WarunkiBieceWywietl(Observable observable) {
obserwatorw.
this.observable = observable;
observable.addObserver(this);
}
Zmodyfikowalimy metod
4 update() tak,
aby moga
public void update(Observable obs, Object arg) {
pobiera jako argumenty
if (obs instanceof DanePogodowe) {
zarwno obiekt klasy Observable,
DanePogodowe danePogodowe = (DanePogodowe)obs;
jak i opcjonalny obiekt danych.
this.temperatura = danePogodowe.pobierzTemperatur();
this.wilgotno = danePogodowe. pobierzWilgotno();
wywietl();
}
}
public void wywietl() {
System.out.println("Warunki biece " + temperatura
+ "stopni C oraz " + wilgotno + v% wilgotno");
}
}
98
Rozdzia 2
rozdzial_02_kor_II.indd 98
2005-06-29 09:49:41
Wzorzec Obserwator
Magnesiki z kodem
wiczenia
Jak wida, definicja klasy PrognozaWywietl znajduje si w kompletnej rozsypce. Czy moesz
poukada poszczeglne fragmenty kodu w odpowiedniej kolejnoci tak, aby cao znw
moga poprawnie dziaa? A przy okazji, niektre z nawiasw klamrowych pospaday nam
przy okazji na ziemi, a s zdecydowanie za mae, aby podejmowa wysiek ich podnoszenia,
wic moesz swobodnie dopisa tyle nawiasw klamrowych, ile bdzie potrzeba!
le
vab
ser
b
O
l(
iet
yw
W
a
z
gno
wywietl();
Pro {
c
)
li
pub rvable
e
obs
observable.add
Observer(this)
;
implements
public class PrognozaWywietl
Observer, WywietlElement {
{
wywietl()
public void
()
tl
ie
w
dy wy
// kod meto
e();
e;
ieni
i
n
n
e
i
ini
erzC
ceC we.pobi
e
i
o
b
ogod
e =
ieni = daneP
n
i
C
e
tnie
ieni
osta ceCin
bie
private floa
t bieceCi
nienie = 10
private floa
10.1f;
t ostatnieCi
nienie;
DanePogodowe da
nePogodowe =
(DanePogodowe)
observable;
able,
vable observ
update(Obser
id
vo
ic
bl
pu
{
Object arg)
bservable;
import java.util.O
bserver;
l.O
ti
a.u
import jav
jeste tutaj
rozdzial_02_kor_II.indd 99
99
2005-06-29 09:49:41
Jazda testowa
Hmmm, czy zauwaye tutaj jak rnic? Nie? Spjrz zatem jeszcze raz
Zobaczysz, e o ile wyniki oblicze niczym si od siebie nie rni, o tyle
(i nieco tajemniczo) kolejno wywietlania poszczeglnych wierszy jest zupenie
inna. Dlaczego tak si stao? Pomyl przez chwil, zanim przeczytasz odpowied
poniej
100
Rozdzia 2
rozdzial_02_kor_II.indd 100
2005-06-29 09:49:42
Wzorzec Obserwator
Czy
definicja klasy java.util.
Observable nie stanowi przypadkiem
pogwacenia jednej z naszych regu
projektowania zorientowanego obiektowo,
goszcej, e naley skupi si na tworzeniu
interfejsw, a nie na implementacji?
Co zatem robi?
Klasa Observable moe, mimo wszystko, odpowiada na Twoje potrzeby, jeeli moesz
dziedziczy z klasy java.util.Observable. Z drugiej jednak strony, zawsze moesz zdecydowa
si na stworzenie swojej wasnej implementacji, tak jak pokazalimy na pocztku niniejszego
rozdziau. Niezalenie od tego, na jakie rozwizanie si zdecydujesz, znasz ju dobrze wzorzec
Obserwator i dziki temu masz dobre podstawy do pracy z dowolnym API, ktre go wykorzystuje.
jeste tutaj
rozdzial_02_kor_II.indd 101
101
2005-06-29 09:49:42
, jak
Jeeli jeste ciekawy
ja
ac
nt
me
ple
im
da
wygl
r
to
wa
ser
Ob
ca
or
wz
eresuj
w JavaBeans, zaint
sem
fej
er
int
j
si blie
stener.
PropertyChangeLi
Tytuem wprowadzenia
Rzumy okiem na jeden z prostych elementw Swing API, JButton. Jeeli zajrzysz pod
mask klasy nadrzdnej w stosunku do JButton, czyli superklasy AbstractButton, zobaczysz,
e posiada ona wiele metod pozwalajcych na dodawanie i usuwanie metod obiektw
nasuchujcych (inaczej suchaczy). Wspomniane metody pozwalaj na dodawanie
i usuwanie obserwatorw lub, jak je nazywaj w pakiecie Swing, obiektw nasuchujcych
z listy obiektw, ktre nasuchuj rnego rodzaju zdarze mogcych nastpi w obiekcie
bdcym czci biblioteki Swing (obiekt nasuchiwany). Przykadowo, ActionListener pozwala
na nasuchiwanie dowolnego typu zdarze, jakie mog wystpi w zwizku z przyciskiem
(np. nacinicie przycisku). W Swing API znajdziesz wiele rnych rodzajw obiektw
nasuchujcych.
Czy powinienem
to zrobi?
i dziaania
A tutaj mamy wynik
ymamy po
rz
ot
ie
jak
programu,
cisku.
naciniciu tego przy
Diabelska odpowied
Anielska odpowied
102
Rozdzia 2
rozdzial_02_kor_II.indd 102
2005-06-29 09:49:42
Wzorzec Obserwator
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.event.*;
bibliotek
wykorzystujca
Prosta aplikacja
ramk
ona na ekranie
Swing. Tworzy
cisk.
zy
pr
ej
ni
z
tr
n
i umieszcza wew
Tutaj umiesz
czon
klasy obserw e zostay
at
zdefiniowan orw,
e jako klasy
wewntrzn
e (ale wcale
tak by nie
musi).
103
CELNE
SPOSTRZEENIA
Obiekty obserwujce s
luno powizane z obiektem
obserwowanym, co oznacza, e obiekt
obserwowany wie o nich tylko tyle,
e posiadaj zaimplementowany
interfejs Obserwator.
nia
a
programow
y
w
a
t
s
d
o
P
o
obiektoweg
jno
Abstrakcy
zacja
o w a n iaHermety
ogram
Reguy pr
go
o b ie k t o w e cji to,
Polimorfizm
ie
Dziedziczen
a
h e r m e ty z
Po d d a w a j
n ia .
zec o si z m ie
d d z ie d z ic
p o z y c j n a
m
o
k
j
a
d
P r z e d k a
js w,
n ie .
iu in te r fe
a tw o r z e n
n
si
j
u
tr
Skoncen
m e n ta c ji .
a n ie im p le
k t r y c h
r o je k ty, w e i,
p
y
z
r
o
tw
zan
S ta r a j si
n o p o w i
z e so b lu z ia u j n a si e b ie
s
ty
k
ie
b
o
odd
li w e , n ie
o il e to m o
.
w z a je m n ie
o w a n ia
e program
o b ie k t o w e
jnowsza regua
Oto Twoja na
. Pamitaj, e
projektowania
ne
orzystujce lu
struktury wyk
ej
zi
iele bard
zwizki s o w
si
twiej adaptuj
a
i
ne
cz
elasty
do zmian.
go
, dokonuje
algorytmw ymienne. lacj jedeny
n
zi
d
ro
e wobiektami re
definiuje uje, e staj siiondzy
Strategy
owrod definiuje pyom
p
danegnoy obiekt zmienia
i
i
cj
cj
ka
fi
za
y
rwyato
ala nosabm,ode kiedygwo yablgraorytmzoustaj o tym
ich hermetObsete
w
oz
p
g
ki sp
tra
ry te zalene
Wzorzec Sdo-wielelunwietaod kliekinetaje, kt
go obiekty
ne.
zastan, wszyst
ie
n
u
ktualizowa
tm
y
algor
swj
atycznie za
m
to
u
a
i
e
n
uywa powiadomio
Wzorc
104
Rozdzia 2
Wzorzec Obserwator
wiczenia
Regua projektowania
Dokonaj identyfikacji wszystkich zmiennych
elementw Twojej aplikacji, a nastpnie oddziel je od
elementw, ktre przez cay czas pozostaj stae.
Regua projektowania
Skoncentruj si na tworzeniu interfejsw,
a nie implementacji
jeste tutaj
rozdzial_02_kor_II.indd 105
105
2005-06-29 09:49:44
Rozwizania wicze
Zaostrz owek
Rozwizania
C.
Reguy
projektowania
wyzwanie
F.
Regua projektowania
Dokonaj identyfikacji wszystkich zmiennych
elementw Twojej aplikacji, a nastpnie oddziel je
od elementw, ktre przez cay czas pozostaj stae.
Regua projektowania
Regua projektowania
Przedkadaj kompozycj nad dziedziczenie.
106
Rozdzia 2
rozdzial_02_kor_II.indd 106
2005-06-29 09:49:44
Wzorzec Obserwator
Magnesiki z kodem
Rozwizania
servable;
import java.util.Ob
server;
import java.util.Ob
implements
public class PrognozaWywietl
Observer, WywietlElement {
private floa
t bieceCi
nienie = 10
private floa
10.1f;
t ostatnieCi
nienie;
rvable
public PrognozaWywietl(Obse
observable) {
DanePogodowe
danePogodowe
=
(DanePogodowe)
observable;
observable.addO
bserver(this);
}
able
update(Observ
public void
{
Object arg)
observable,
ostatnieCinienie = bieceCinienie;
bieceCinienie = pogodaDane.pobierzCinienie();
}
}
wywietl();
{
wywietl()
public void
()
dy wywietl
to
me
d
ko
//
}
jeste tutaj
rozdzial_02_kor_II.indd 107
107
2005-06-29 09:49:44