/
Автор: Gamma E. Helm R. Johnson R. Vissides J.
Теги: programozás addison-wesely számítástechnika programozás tankönyv magyar nyelven objektum-orientált programozás
ISBN: 0201633612
Год: 2004
Текст
.
.
J
-
>
/
'.
'f
».
"'"
...
,;
..
F
.\'
......
-4
,...
:.f
........<
..J!
""( .'0:
.-.:. Eo ,
;, +
"
,
"
. ..... .,.
'. ,.
''''=..
"
.,...x
, .
t
'"" .\
"
<:.,
)1
..
.
;,
Er" ch Gamma
. <:
. <.:< -x:."> w"
J
.,
.
t
..
.
. .
:::
=-!)': -:;« H. oc:--
...
It
-1.
tu
.
r
.
.
. .,
, ' '....
.'X "
.
.
.
'
;.
;..
.
/', . '1.:.
, L
,. ':
.
....
>.
..
..
'o,.
:....
">
p
': {
.
.. .. «'
R. 1.
...,
. .
i1i}" ."
, "
j>" "
( , ,
... v
":. " ,. ...
.,..
<'
, ..
'. t
L , ,
.
" .<1i:. .
>. '" ... . ....
.<. ... ... .....
.. ..... ..
.
.'
"-".
x..
.
.>.. ,...
.... ">..
0>-. ...
......
>
. ..g,> ..
>:. '<:<= ..
:< )1':.
.
,..
;:.. .'
: <
.'
;- i "'" ,..
<
"
..... .;-
. , .<.. .'
, ..
':8'
, , <ji
-Ii! ,
, , y '1..
,
., "'"
".
i
M
ic
"
:;.
\
,..
".
"'..
'=:
N
,.
. . ...
..r,..
".
,. N,
....
, \ x
'.,
:"
""
,...
,..
r-
, ,
...
..
>"
J.
.
.'
. ..
':.# :
.... ."...
..
L ,:
'.
< <ol'"
, ..,
!t3>'<
.L
.
.......
'I(S
: .' ,
-..;:
.
, ...
'.
..
:to.
.f<
. .
. .
.;
..
.)j .
, '
"*
. .
,( . "
L ,
'"': .!"..,
1.
, '-",
"..
.:i.
+
,
<
.""
\ -oy
...-
,
"
'.
'.
-.<
..
,.;-
,
...
..
-.
-
.
..-: f
..:
(." ....
&
-
:e-
l
,.
,
.
...
': . t'
, <f'
'.
...
- ,'
..'
-7 'l
.' .
, P.
"
+
..
"'"
,.
,
- '.
\ '
,
'!>- .
v
,.
....'
....
,
.
.
..
f',
...
.<)
..
_w u
, ....
".
" .
....oc
"
P fu
t
,
"
&
...
.. ,
.".
;,.,.
.
..
,1 . "JI'.
"
...
'
..
, :
+
...
...... .
..
:1",-
'1'
(
+
..<E
:
,..
. ,
.
....
II. .1
'.
"
'.,
",.
:..
.'
, ....
."
'" -:-- y
'. '1
..
"'"
., t!"
..
, ....
,
.....
'.... '
PO
..
+
-:.
..
.
F-
u.
'!'.
'"
. .
-J
J
'(
+..o:
,
>.-
...
,..
.>
. :/'o
....-
'. "
:t
..,.. .
'.'
....
,.
,
.
i ,
"'"
:;. <.
'.
, ..,.. '( ..
.+ .... ."" « h
,f-
.... ... )'
<.:.. +. L.'
... {" L '
3
. '.
" ."
N ..
./...J:
....... 0..
JI' ".t"
." ".. f
., .... . .
. ro.... ,. .
p..., .
,
,. ,.,..." y.. t
.... ..
. ."
..:: .
..'. 1. . I
io>.
..
..
..... 'to
....
" :....
:'o
. ..
..",
, .<
...
t'
. ..J
..,
'...
':,
..
....
..
:--
f"'"
::::
'.
..
">
"
.'
"
" ..
.
,,, *..... /
j
iE
i;
..:,.
.
<:1
.fe
"
+
,
...
.<
.,}..
\..
...
..
:E: . "'" ..
.."
/;.
',
"..'!
" + "<.-. ".
I
'lj.
.... :;. "(.- I ,">
4. ot. .'
;....
:.
t
..
..'
*.
.'\
..
" .
..1:
...
. . ....
..
-.<
." "
i L'
" ....
...
'" .... J <
. : "
.<.
:.
.....
+
. , .'
, t.
,)
'" ... ). .
'.
,..
.h
.
d Hel
Ral h J hnson, John Vlissi
IC
I
=
,
u
....
"<:Ii: 'fo:::
... .'
..
i
,
A
es
.?
0(1'"
..... ,q
.'J./'
P o;"
Addison-Wesley
-ti
,h
,..
F'
"*
.h.
.oC."
o
"
<..
P
'. . ......,.
'.
'.
..
"1
{ ...
.4
+
" r..
, .
''':\
.
-..; 1..
i
"!
,
.J" ....
." J"
1 . <,
"
>h -':"-' ....
,
., ">':1"'"
, &
'-
\;
, .r.
.
".
>
"....
.,
...
.
')-
....... -.. ...
.......
"". ;
" J."t
'.... L,.
.. ., '- '"<.:.
J;
"
,.
'" .'
"
. . .."'OOC
..
..
...
.
.
,
o,)
.
.
" .
; ....
/:
.-:
.....
Erich Gamma · Richard He1m · Ra ph Jo nson · John Vlissides
Prog ra mt rve esi Int'k
...: ... :. .
. ..: ..
. ............ .... ......
I
.. ..; .. : ..
....... .....
., :
..... ,.....
o
. .. .
a
.
I
.
.
.
..
.
..
.
- ,.
: :.-...
.. ....
\.
i\:.
.\\
ch Gamm
..
a d He m,
ap
Johns
n
h
Vlissides
,
IC
w.
..,
{O
.I'
....
.'.'.
. 1
':
.\
."
....
:
:".
.L
..;
. :/.
\
.,\
,
;\
f
:....
Addis n-Wesley
..... ........... ........
....,;.
o"
..... .
. . .. ... .:-..
. ... .. ..... .. .. ... .....: .. .; .... :. . ...
. . .. .
. . ...-1
.. .....i .
...... .....
.... ....
, .
.... .1
......
...... .
"
-
, '
..
,'.
.
...
...
..
.
..
.
.
.
. .;""III" I
.\\'. ., .
,.
-''iJ,\\
..
.
G
mma
Rich rd
Im R Iph J h
s n
J hn
IISS des
wo
' .
.....
. ...
IC
. ,
\..
,
.\.
."
'o'..
*...
.;..
"
.
.:.
.
.,\ .,
I
Ad
.
es 1 ey
ISO
:.. ... ... .
.... :. \ .:.
A fordítás a követ pező angol eredeti alapján k:észült:
Ericll Ganuna, Richar iehn, Ral Johnson, JOl1M. Vliss.des: esign Patterns: Elefile ts
of Reusable Object-Oriented Software, 1st edltion, ISBJ\ 02016336 2, !Jearson Education Inc.,
Addison Wes]ey lJ ofesiona]
Copyrigl1 @ 1995 Addison-Wesley. Minden jog fenntartva!
Autl10rized translation frülli tlle 1Jlg1isl1language edition, cntitled Design Patterns: r:lelllcnts of Reusab-
le 011jecl-OrienlLd Software ll Edition, ISBN 0201633612, by Gamma, L icll; I-Ielm, Ric lard; JO}1. san,
Rdlpll; and Vlissidcs, Ja 10 M.t publlslled by )earson Ed.l1cation, Inc, pub islllng as Addison Weslcy
ProfessionaJ.
Copyriglll @ 1.995 IlY Addlson-Wcsley
-"ransla lon and. iungarian edltion @ 2001 Kil{apu Kft. Ml rigIlts rcservedl
Alj rigllts reserved. No IJart of tllis bool(t includ'ng interior desing, cover design, and icons llldY be
reproducL(lor -ra11S1llltted in any form, by any mean (electronic, pllolocopying, record.ing, or otl1er-
wise) without tlle prior written permission o .. tIle pulJllsller.
TradcJnarked names appear tllrougllout tllis bool{. Ralher than list lilC names and. entities tllat own
tlle trad.cmarks or insert a tradema k symbol witll e1.cl1 rncntion of lile trade narked name, tJle pub-
lisller tatLs tllat it is uSlng lhc nam.es for editorial PUI poes on]y and to lhe be .efi of tI1C trademark
owner, witl1 no intention of infringing upo 1l11al tradcmark.
Fordítás és nlagya.r változat @ 2004 Kiskapu <ft. Minden jog fennt rlva
A kÖll)lV egyetlen része sem sol(s7orosít11ató semmilyen n1ódszcrrel a Kiadó clő7etes í ásos engedé-
lye néJküL Ez a 1(orláto7ás 1{i el jed a belső terveLésre, a IJorí óra Cs a7 ikonokra i!->. A könyvben be-
jegyzet védjegyek és márkanevek 1 fellJU (kanI1atnak:. Ahelyett, 110gy e7t minden egyes llelyen kü-
lön jelc7nénk t a Kiadó eZLnne kijelenti, l10gya nlűben előfordu.1ó vaL:imennyi védett J evet és jelzést
szerl{esztc..si célokrl, jólliszeműen, a név ula]d.onosán.ak érdekeit szem előtt tartva ll sználja., és fleIn
áll szándél(aban az azokkal kapcsolatos jogokat megszegni, vdgy ké -ség e vonni. A szerzők és a kia-
dó a lelletö legnagyobb köriiltel(intéssel járt el e kiadvány elkés7Ítésckor. Sem d 57CJ7ők, seIn d kiadó
nem válla] semminelnű felelősséget vagy garanciát a kön-yv tartallll.ával, tcljességévell{apcsolatban. Sem
2. zerző]{, sem a kiadó nem vonJ1ató felelősségre l1álmilyen baleset vagy kárese l1ény miatt, mely köz-
vetve vagy ]<ö7VetleI1ül kapcsolat11a 11.oz11a.ló e kiadvánnyal.
Nye vi lektor: Rézműves László
Fo ítás. Antal Ferenc) \éznlűves Lászlo
MUs - szerkeszto: Csutak Hqffinann leljen e
S akInai lektor: Soczó Zsolt
Bo itÓ: Zsédely Teréz
Felelős kiadó a Kisl{apu Kft. üg-yvc7etö iga gatója
@ 2004 KisJrapu Kft +
108113udapesl, Népszín11áz .31. J. 7.
Telefon: (+36-1) 477-0443 Fax: (+36-1) 303-1619
11tlp:/ /l(lddo. kiska pu +11 ul
e-11ail: 1(iado@kiska.pu.11u
ISBN: 963 9301 77 9
KéSLült a de11receni Kinizsi Nyomdában
elelős VC7ető: 13ördős jálI0S
T.
.
,
I
Bevezetés
Előszó
Utmutató az otvasának
1. fejezet B evezetés
1.1 Mi is az a tervezési minta? .... . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . 4 . . . . 3
1.2 Tervezési min t.lk a S la ltal ( MVCben . . . . . . . . . . . . . . . . . . . . . . . . 4 . . . . . . /
1 .3 A tervezési 111inták 1 eírá sa .... .... 4 . 4 . . . . . . . . . . . . . . . . . . . . . . . . 7
44 A te1\Tezési minták katalógusa . . . . . . 4 . 4 . . . . . . . . . . . . . 4 . . . 4 . . . . . . . . . . . . 8
- . 5 A ka ta 1 ó gu s rends z er ez é se. . . . . . . . . . . 4 . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . ] o
1.6 Hogyan oldják meg a tervezési mintá.k a terve ési prob émál{at? 4. 4 . 4 . . . . . . II
Me gfe 1 e ő o bj e ktUl11 ok (ere sés e .......... . . . . . . . . . . . . . . . . . . . . . . 1
A szüksé gLS o bj eklum () k me g]{eresése ................... 4 . . . . . . . 4 . 4 . 12
Az objektu mfelüIetek meg11atározá.sa .... ....... . . . . + . 4 . . . . . . . . . . 14
A7 objektummegvalósítá')ol< meghatá .ozása. . . . . . . . . . . . . . . . . 4 . . . . 4 . . . 4 15
Az újra11as7nosítds. sze kezetek 1asználata . . . . . . . . . . 4 . . . . . . . . . . . . 4 . . . 20
Futás- és ord/tási ideju sze ke7etek összehason ítása . . . . . . . . . . . . . . . . . . . 24
V ál tOLásra terve 7ve . . . . 4 . . . . . . . . . . . . . . . . . . . . 4 . . . . . . . . . . . . . . . . . 25
1.7 Hogyan válasszunl( tervezési mintát? .......... 4 . 4 . 4 . . . . . . . . . . . . . . . . , . . 30
1.8 Hogyan 11asLnáljuk a tervezésj mintákat? .. . . . . . . . . . . . . . . . . . . . . . . . . . 32
21 fejezet Esettanulmány szövegszerkesztő tervezése
2.1 ervezés. prob émák · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2 . 2 O o ku men t U ID SZe r :-- eze t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 . . . . . . . . . . . . . . 35
Ön11Ívó felépítés . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . . . . . . . 4 . . . . . 36
Kép jel elc. ................. 4 . . . .. . . . . .. . .. . . . . . . . . . . . . . . . . . . . . 38
A Összetétel tervezési minta . . . . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . 40
2 . 3 For má zá s . . . . . . . . . . . . . . . . + . . . . . . . . . . . . . . . . . . . . . . 4 . . . . . . . . 4 O
A formázó a] goritmus egysé gbe zárása . . . . . 4 . . . . . . . . . . . . . . . . . . . . . 4.1
II /
O ' ll ' , k ".... "' 1 /...J -
sszea Ita LS osszetete e;r 4 . + . 4 . . . . . . . . . . . . . . . . . . . 4 . . . . . 4 . . . . . . l
A S ' + /. 43
tr d leb a terv e ze SI ill 1 n ta . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . ......
.
VI Programtervezési mintak
2 / A fe III as 7 n á 1 () j fe 1 üle t fj no ill.Í tás a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3
Á tI á ts z ó b ef o gl a 3 S .. . . . . . . . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4: 4
Monoglypl1 ..... . . . . . . .. . .. . + . . . . . . . . . . . . . . . . . . . . + . . . . . . . . . . . 45
A Oísz"" ló minta + . . . . . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2 5 Több megj el en í tés i S7a hván.y támoga tása . . . . . . . . . . . . . . . . . . . . . . . . . 17
Az objel<lum-létrehozás clvondtkozlalása . + . . . . . . . . . . . . . _ . . . . . . . . 48
Gyá "al{ és termékoszlályok .......... + . + . . . . . . . . . . . . . . . . . + . . . . . . 49
Az El\ronl gyár tervezési minta . . . . . . . . . . . . . . . . . . . + . . . . . . . . _ . . . 51
2.6 Tc)11h al11a](1{ezelő rendszertáIYlohatása ........... . . . . . . . . . . .. . .. . .. 52
Has n á II at u nl{ e 1 vo 1 t gyá ra t? · · · · · · · . · . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2
A megvalóstási függőségek egységbe zárása . . . . . . .. . . . . . . . . . . . . .. . . . 53
Win d.ow é s Win dow Im p . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . _ 5 5
A 1 Ií d terv ez é s i min la .. . . . - . . . . . .. . .. . . . . . . . . . . . . . . . . . . . .. . . . . . 58
2 . 7 Fe Illa s zn il ó i műve 1. e t e l{ .. · · · · · · + · .. · · · · · · . . . . . . . . . . . . . . . . . . . . . . . 59
Kére] em egységlJe zá.rása . . . . . . . . . . . . . . . . + . + . . . . . . _ . . . . . . . . . .. . 60
A COI11mand osztály és alosztá]ya' . . + . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
V . . 1 1 /,,.. 6 2
1 557 a von aSJ e 1etose g . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . .. . . .
1) a ra ne s c 16 zm ény ek. . . . . . . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . 63
A lJ l ran cs tervezési rn.inta . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . .. 64
2.8 1 Ielyesírás-cllcnőr .lés Cs e válas7lás .. . . . . . . . . . . . . . . . . . . . . . . .. . + . . . . 65
A 1 . c ,./ 1 "', 6 -
7 eszart lOLormaClO e ercse . . . . . . . . . . . . . . . . . . . . . . . . . _ . . . . . .. )
A 1 ' , b · " b -' 66
z e e es es ej a "a s c gy sc g e za ras a . . . . .. . .. . . . . . . . . . . . . . . . . .. . . . . . +
Az lterator os 7táJy és aj osztályai . . . . . . . . . . . . . . . . . .. . . . + . . . . . . . . . 68
A B · , , ". + 70
eJaro tervez eSI mIntd . . . . . . . . . . . " . + . . . . . . . . . . . . . . . . . . . . . . .
B · .... 1 .A' 1 k ? 70
c J l ras vagy ) eJa rCJ m li v e e te .. . . . . . . _ . . . . . . . + . . . . . . . . . . .
Az elel11.zés egységbe zárása . . . . . . . . . . . . . . . . . . . . . . _ . . . . . . . . . . + . 71
A Vis it o ros z tá ly é sa] () s zt á 1 ya i ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
A L , , + · 76
atogato tef\lCZeSl minta . . . _ . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . .. .
++ ... 1 1
2 + 9 O sszci o g l á s . . . . - . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + . . . . . . . . 77
A tervezési minták kata ógusa
3. fejezet Letrehozási min ák
Elvont gyá,r . . . . . - . r . . . . . . . . . . . . + . . . . . . . . . . . . . . .. . . . + . .. . .. . . . . . 86
C é ] . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
E gy é II neve l( . + . . . .. .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 86
F ela da t - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " . . . . . . . . . . . . . . . 86
A]]{all11azhatósá.g . . . . . ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Sze r l{ c Let . . . . - . . . . .. . .. . . . . . . . . . . . r . . . . . . . . . . . . . . . . . . . . . . . . . 88
Részt\Tevől{ +. . . . . . . . . - . . . . . . . . . .. . + . . . . . . . . . . . . . . . . . . . . . . 88
E """ 1 .. d 89
g)'ll t tm li <'0 cs. . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . .. . + . . . . . . . . . .
K () ve tl{ ez m ény ek .. · · · . · . · . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . 89
Megv d.lósítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . + . . . . . . . . . 90
1) (, 1 d.a 1< ó d . . . . . . + . + . . . . . .. . . . . . . . . .. . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 91
Programtervezési minták
...
VI
Ismert fel]1asználáso]{
!(apcsolódó mintál{
..
Építő
Egyéb ncvcl(
Cél
..
..
..
..
..
..
ol
..
..
..
Feladat
..
..
..
..
Alka lma7llalóság
SzerJezet
..
..
..
ol
..
Résztvcvől{
..
..
Együtt l1Űl<ödés
Következmények
Megvalósítás
l)élda \.ód.
..
..
..
..
..
..
..
..
..
..
Ismert fell asználásol(
Kapcsolódó mintál\:
GyártófilggvéJ1.Y
Cél
..
..
..
..
..
..
..
..
Fgyél) nevek
Fellda.t
..
..
..
..
..
..
..
Al kal mazll l t()s:] g
Szerkezet
..
..
..
Résl.tvevők
..
..
Egyilttm.űködés
Kövelkezlnények
Megvalósítás
l)élclal{ód
..
..
Isnlert felllasznáJások
KalJcsolódó minták
}Jrototípus ..
Cél
..
..
..
..
Feladat
..
..
..
Alkalma z11a tÓS3.g
S7erke7el
..
..
Résztvevők
..
ol
..
Együttműködés
Követ]<ez TI.énye -(
Mcgvalósítás
}Jéldal<éJd
..
..
..
..
..
IS1TICrt felhasználások
Kapcsoló(ló minlál<
Egyl{e
Egyéb nevek
Cél
..
..
..
..
..
..
..
..
..
..
..
..
ol
+
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.. ..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ol
..
..
ol
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
.. ..
..
..
ot ..
..
..
..
..
.. ..
..
..
..
..
+
..
..
..
..
..
..
+
..
..
..
..
+
..
..
..
..
..
..
..
+
.. ..
..
..
..
+
..
..
..
..
..
..
..
..
+
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ol
ot
..
..
+
..
..
+
ol ..
..
..
ol
..
..
..
..
..
.. ..
..
..
..
..
..
..
+
+
.. ..
..
..
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
+
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ot
..
ol
..
..
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
+ ..
..
..
..
..
..
..
ol
..
..
ol
..
..
..
+
..
ol
.. ol
..
..
..
..
..
..
..
ol
..
..
ol
..
+
..
..
..
..
..
..
..
..
ol
..
..
..
+
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
+
..
..
..
..
+
..
..
..
ol
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
ol
..
..
..
+
..
..
ol
..
..
ol
+
..
..
..
..
..
..
..
..
ol
..
..
..
+
..
..
+
..
..
..
ol
..
..
..
..
..
ol
..
.. ol
..
..
..
..
..
..
..
..
..
..
..
..
ol
..
..
..
..
..
..
+
..
.
..
ol
..
+
..
ol
..
+
..
+
..
..
..
..
..
..
ol
..
..
..
..
+
..
..
..
..
..
ol
..
..
..
..
ol
..
..
+
..
..
..
..
..
..
..
..
..
+
..
..
..
..
ol
..
..
..
..
..
..
+
..
..
..
..
..
..
ol
ol ..
..
..
..
..
..
+
..
+
..
..
..
ol
..
..
..
..
..
ol
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
+ ..
.. ..
..
ol
..
..
..
..
..
..
..
+
..
..
..
..
..
ol
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
+
..
..
ol
..
+
..
..
..
..
..
..
ol
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ol
..
ol
ol
ol
ol
..
..
..
..
..
..
+
..
95
96
..
..
96
96
96
96
..
ol
..
97
..
98
98
..
98
..
99
100
101
..
105
106
106
106
106
106
1()7
..
108
108
..
108
08
110
..
111
..
116
16
+
117
117
..
117
118
+
1 9
9
19
..
119
..
121
..
122
..
126
127
..
128
128
..
128
"'..'"
Vili Programtervezési mintak
Feladat · .. · · . .. · .. · .. ... .. + · .. · · .. . .. . .. . . . . .. . ol . .. . . . . .. . .. . .. . . . . ol . .. . . . .. . 128
Al {alm a z 11a t ó s á g · .. . .. .. · ol · .. . . . .. .. . .. . ... ............... . .. . . .. . . . .. . .. . .. . . .. 128
S Ler }{ezet · .. . .. · .. · .. · .. .. · .. · .. · · .. · . . .. .. . ol . ... ...................................... 129
Rés ztv evők ........................................................................ 129
E gyü tt 11 űk ö d és · .. · ol · ... ......................................................... 129
Köve tl{ e m é nye 1{ ....... + · .. · . .. . .. . . . . .. . .. . .. . .. .. . .. . .. . . . . .. . .. . .. ol . .. . .. . .. . 129
Me gv al ó s í tá s ....... + · · .. · · · · .. · .. · · ... .. . .. . . . . .. . + . .. . . . . .. . .. . . . . .. . .. . . .. 13 O
1) (. 1 d.akód .. . .. · .. · .. · · .. . .. · · ol · .. · . .. . .. . .. . .. . . .. . .. . .. . .. . . .. . .. . . . . .. . .. .. . .. . .. 133
Ts ill ert fe III as zná 1 á s O l{ · · ol · .. · . .. · .. · .. · . .. . + . .. . . . . .. . .. . . . . .. . .. . . . . .. . + . .. 135
Kapcso ádá ID. ntá!( · . .. · · · · ol · .. . .. · .. ol · .. · .. . .. .. .. ol · .. · .. . .. ol . .. . . . .. . . ol . .. . .. ol. 35
A létre .lozási mintákról .. · .. · .. .. · .. . .. . . ol · .. . .. . .. . . .. . .. . .. . . ol . .. . . . .. . .. .. . . . . . . .. . 136
4 fejezet S erkezeti minták
1 II es zt ő. ol · .. · · .. · .. · .. · · · · .. · · .. · · · . .. . .. . .. .. ............... .. . . . . .. . ol . .. . .. . . " . .. . 14 1
Cél · · · · .. · .. · . .. · .. · · .. · . . . .. . .. . .. . . .. . .. . .. . .. . . . . .. . .. . . . . ol .. .. . '" . .. ol .. ol . .. . . . 141
Egyéb nevek. .. · · .. · .. .. · .. · .. · . . .. .. . .. . .. . . . .. ol . .. . . . .. ol . ol . .. . .. . .. . .. .. . . . .. . .. . 14]
Felad d t .. · .. · .. · . .. · .. · · .. . .. . .. . . .. . .. . . . .. . . .. . .. . .. . . . . .. . .. . .. . .. . .. . . .. . .. . .. . .. . 141
AII<a mazlla tóság · · · . .. · .. · .. · · .. . .. . .. ol · ol . .. . .. . .. ol . . .. .. . .. ol .. .. . . .. ol . .. . .. .. . . .. . 143
Szerkezet · .. · .. . . .. · .. · · .. .. . .. .. · .. · · .. . . . .. . .. .. . .. . .. . ol . . .. . .. . .. . .. . .. . . .. ol .. . . .. 143
Rés 7 tv evők ........................................................................... 1 44
E gyü t tm űl{ ö d és . .. . .. · · .. · .. . .. . .. . . .. .. . . .. .. . ol . . . . .. . .. . .. . . . .. . . . .. .. .. . . .. . ol . .. 14 4
Köve tk e.l m ény e l{ ................................................................. 1 4 4
Me gv al ó s í tá s ..........................................................."................ 146
Pél d.akód .. . .. . .. · .. · .. ... .. . .. .. ... .... . .. .. . . . .. . . . . .. . .. . .. . . .. ............ 48
1 S ille rt fc III a s zná 1 á sok · .. · · · · .. . .. . . ol . .. .. . .. . .. . . . . . . .. . .. . . .. . .. . ol . .. . . . .. . .. . 151
I(a pe sol ó ci Ó mill t á k · .. · .. · . .. · .. · · .. .. .. . . . . .. . . .. . .. . ol . .. . . .. . ol . .. .. .. . . . .. . .. .. . . 15 3
· · .. · .. .. · .. · .. · · .. · .. . .. · · · · .. .. .. . .. · .. · · .. . · · ol . ol 153
Cél · . . .. · · ol · .. . .. · .. · .. .. ... .. .. · .. .. · .. . .. . . ol · .. . . .. .. ol . .. . . . .. ol . . .. .. . .. . .. . ol . . 153
Egyé bne v e ]( .. · . .. . . . .. · .. ol .' .. .. .. · · · · .. · .. . . .. . .. . . .. . .. . .. . . . . .. . .. . .. . .. .. .. . .. . .. 1 5 3
Fel a da t · .. · .. ol · .. . .. · .. · .. · · .. . .. . .. · · .. · . . .. .. . + . . .. . .. . .. . .. . . . .. . + . .. .. . . . . . .. . 1 5 3
Al k alma zha t ó s á g .. · .. . . .. · .. · .. .. · . . .. · · ol · .. . .. . . .. . . . . . . .. . .. . .. . . . . .. . ol ... ... 5 5
S Zcl+kezet .. · .. ... .. + · .. · · . .. .. . .. . .. .. . .. . . ol . .. .. . . . . . . . .. . .. . . ol . .. . .. . . . + . .. . 156
Re sznrevők ...... ............................. .. . . .. . .. .. .. .. . .. . .. . . . .. . .. . .. .. . . 156
E gyü ttm ű -- ö dé s .. . . · · + · .. .. · . · .. · .. · .. .. . . . .. . .. .. . . . .. . . ol . .. . .. . .. . .. . . . . .. .. ol . .. 15 7
l( öve lk e 2m ény e 1< ............................................................ + . .. .. 5 7
Me gyal ós....tás .... + · .. .. . .. · .. ." ..... .. . .. .. . . . .. . .. .. . .. . .. . . . .. .. . . . .. . .. . .. . . .. . 157
Pél dak ó d .. · .. · .. . .. · · ol ... ...... + · .. . . .. . .. . .. .. . . . .. . .. . .. .. . . . . . .. ... .......... 1 59
1 s mert fe 1 has 7 n á 1 á sok · · · · .. · .. .. .. . .. . . .. . .. . .. . . ol . .. . . .. . .. . .. . .. ............. 163
Ka pes ol ó d.ó ni nt ák · .. .. · ol · .. . . . . .. . .. .. .. . . . . . .... .. + . .. . .. . . . . . . .. . .. . . . . .. 161
Ö 552C téte] · · · · · · · · · · · · · · · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 65
Egyéb nevek .. · · .. . · · .. · .. .. . . . .. . .. . .. .. . . .. . . .. . .. . .. . . . .. .. . .. . .. . .. . . .. . . . . .. . 16 5
Cél .. · " · · · .. · .. ol · ol · .. .. · · · .. · ol · .. . . .. · .. · .. .. · . . .. . + . .. .. . . . .. . .. . . .. . .. . .. . . .. . . .. ] 65
Feladat . · .. .. · ol · .. .. .. · · .. · .. · .. .. . . . + . " . .. . . .. . .. . .. .. . . . + . .. .. . .. . .. . .. . . . . .. . . + 165
Al kalm a z11a t Ó á g .. · .. ol · ... .............. . .. . . . . .. . .. . .. . . .. . .. . .. . . . . .. ol . .. .. 66
Híd
.. . ..
. . 6 . .
. . . 6 . 6 .
. . . .. . ..
Programtervezési mintak
..
IX
Sze kezet
ol
..
..
..
Résztvevé5k
..
..
..
EgyüttlllŰködés
Következmények
Megva.lósítás
})éldakód
ol
..
..
+
..
+
..
..
..
..
Ismert fe használásoJ.c
KalJCSO ádá m.nták
Díszítő ..
..
..
..
Cé.
..
ol
..
.
..
.. ..
Egyéb nevek
Fe]adat
..
..
ol
..
..
All{alma hatóság
Szerl<ezet
..
.
ol
..
Résztvevők
..
Együttn1űködés
Következmények
Mebrval()sítás
Példakód
..
..
..
.
..
.. .
+
..
..
..
ISlnert felhas ná ások
Kapcsolódó mintáJ
Homlokzat
..
..
..
..
..
Egyéb neve (
Cél
.. ..
..
..
..
.. ..
Felad.al
..
..
..
Alkalma.z 1atóság
Szerkezet
.
.
Résztvevők
..
..
.. ..
Együttműköde
Következménye (
Megva ásítás
IJéldak_ód.
..
..
..
..
.
..
..
..
Isme t fel11asználások
Kapc&olé)d.ó olintá1{
I J ehelysúJYÚ
Egyéb nevek
Cél
..
+
+
..
..
..
..
ol
..
Feladat
..
..
.. ..
..
AJ kal mazh.atóság
Szerkezet
ol
..
..
..
Résztvevő]{
.
..
Együttműködés
Következmények
..
.. .
..
..
..
..
..
..
ol
..
..
..
+
..
..
ol
.
.. ol
..
.. ..
.. .
..
..
..
..
..
.
ol
..
..
..
ol
..
..
..
.. .
.. ..
..
..
.
ol
ol
..
..
+
..
..
..
..
..
.
..
.
1-
..
..
..
..
..
..
..
..
+
..
.. ol
.
..
.
.. .
..
..
..
..
ol
.. ..
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ol
ol
..
..
+
..
ol
..
..
..
..
..
..
1- ..
..
..
..
..
.
..
..
..
ol
..
..
..
..
..
..
..
..
+
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
..
.
ol
..
..
..
.
..
..
..
..
.. .
..
..
ol
..
..
.
..
..
..
ol
..
..
..
..
..
.
..
..
..
..
..
.. .
..
..
..
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
ol
..
.
..
ol
..
..
..
..
ol
..
..
..
ol
..
..
..
..
..
..
..
..
.
..
..
..
..
.
..
.. ol
.
.
..
..
+
..
..
..
;.
..
..
+
..
ol
..
..
..
..
..
+
..
.
..
..
..
..
.
ol
..
..
..
..
..
.
.
..
..
.
..
..
..
..
.. ol
..
..
ol
..
.. ..
..
..
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
ol
..
..
..
..
ol
.. ol
..
..
.
+
..
ol
..
..
..
..
..
..
..
+
..
..
..
..
..
..
ol
..
..
ol
..
..
.
..
..
..
..
ol
..
.
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
..
.
ol
..
..
+
..
ol
..
.
..
..
.
..
+
..
..
+
..
..
..
..
..
+
..
..
..
..
..
..
.
..
..
..
..
..
..
..
ol
..
ol
..
..
..
..
1- ..
.. .
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
ol
ol
..
..
..
ol
.. ol
..
.
..
..
.
..
.
..
..
..
..
..
..
...
..
.
..
..
..
..
..
..
..
..
..
..
..
.
..
..
ol
..
..
..
..
..
ol
..
..
.
1-
..
..
..
..
..
..
.
.. ol
..
..
..
..
.
..
..
..
ol
..
..
.
..
..
ol
..
..
..
..
..
..
..
..
..
.. ol
..
..
..
..
.
.
..
.. ol
..
..
..
.
..
..
..
..
..
..
.
.
..
..
ol
..
..
..
.
..
..
..
..
..
.
..
.
..
.
..
..
+
.
..
..
..
ol
..
..
..
..
..
+
..
..
..
..
..
ol
..
..
..
..
..
..
..
..
..
..
..
.
..
..
..
.
ol
..
.
+
..
..
..
..
..
ol
..
..
..
..
..
ol
..
..
..
..
..
..
.
..
ol
..
ol
.
..
..
..
..
.
ol
..
..
..
..
..
..
..
ol
..
.
ol
..
..
..
..
..
..
..
..
..
.
..
..
..
..
ol
..
..
..
..
'"
..
..
..
..
..
..
..
..
..
..
..
..
..
.. ..
..
..
+
..
ol
.. ..
..
..
ol
+
..
ol
.. .
..
ol
..
..
..
..
..
..
.
.
..
.
ol
..
..
..
..
..
..
1-
..
..
..
..
+
..
ol
..
..
..
..
..
..
..
..
..
..
..
167
167
168
168
169
172
..
175
176
..
.
177
..
177
.
177
..
177
..
179
..
179
180
ol
180
..
180
ol
181
..
183
.
185
..
186
..
187
..
18/
.
]87
ol
187
..
188
.. ..
189
..
189
..
189
..
90
.
190
..
191
..
94
196
96
196
196
196
ol
..
..
...
199
.
200
..
201
201
201
x Programtervezési minták
Megvalósítás ................................................... 202
Ism ert i:elhas7náláso { . · · · · . · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ . . . . · 08
Ka peso l ód Ó ID' n ták · · · · · . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 09
Helyettes. · · . · · · . · · · · . · · · · · · · · . . . . . . . . , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 O
Cé ........................................................... 21 O
Egyé b neve l{ . · · · · · · · · - · · · · · · · . - . . . . . . . . . . . . . . . . . _ . . . . . . . . . . . . . . 21 O
F L.I adat · · · · · · · · · · · · . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 O
Al kalm azha lÓSd g · · · . · · · . · · · · . . . . . . . . . _ . . . . . . . . . . . . . . . . . . . . . . . . . . 212
1,) é dak Ó d . · · · · · · · · . · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 03
Szerk e et · · · · · · - · · · · . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Részt vev ö k .................................................... 21 =3
" C .... "" k .. d 2 3
g)1lJ ttm u o es. . . . . .. . . . .. . . .. . .. . . . . . . . . .. . . . . . . . . .. . .. . . . . + . . . . .. . .. . ..
"övetk ezm ény ek. · · · · . . · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21-1
Me h>val ósí tás .............. · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2] 4
Ismert felhasLnálások · . . · · . · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Ka pe soládá mlntá k · · · · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
A sLerkezeti mi 1tákróI · . · · · · . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
lllesztő vagy Híd? ......................... .....................? 21
O ss zet étel, Díszí tó vagy Hel yett es? .............. .................. 222
5 fejezet Viselkedési minták
Felelősséglánc · · · · · · · · · . · · · · · · · · - . . . . . . . . _ . .. ....................... 226
Egyéb nevek · · · - · · · . · · · · . · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
l)éldakód . · · · · . · · · . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , 2 7
Cél . · · · · · · · · · · · · . · · · . · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Felada......................................................... 226
Alkalm azh a tós á g · · . · · · · . · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Sze r kezet · · · . · · · - · · · . · · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Részt v evők .................................................... 230
Együttm(íködés · · . · · · . · · · · . · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Következmények .......................................... _ . .. 230
Mcgvalósítás ........... · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Pél da kód · · · · · · · · · · · · · · . · · · . · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Parancs · · · · · . . · · · · · · · . · · · · . · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Ismert fdhaszná ások · · . · · · . · · · · . . . . . . . . . . . . . . . . . . _ . . . . . . . . . . . . . . 236
Kapcso ádá minták · · . · · · . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Ctl .. . . . .. . . . . . . .
..... + 1......................... il
· · .. · .. . .. · . · · .. . . · .. · . · · .. 237
Egyéb nevek · . · · · · · · · · . · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Felad.at · · · · · . · · · · · · · · · · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Alkalmazha tósá g · · · · · · · · · · · . · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Szerk eZe l · · · . · · · . · · · · . · · · · . . · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Résztvevők ....... - · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Együttn1űködés · · . · · · . · · · · . · · · · . . . . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Köve tk e7mény ek. · · - · · · . · · · · . . . . . . . . . . . . . . . . . . _ . . . . . . . . . . . . . . . . 242
Programtervezési minták
II
XI
M 1 t ... 2 / 2
e gva aSI as ................................................. · .. · .. · .. · · .. ·
lj é 1 dak od. .. . .. ................................. ot .. . . .. . . . . . .. . . . . . . .. . .. · 244:
ls me 11 fe 1 has z n á l ás o 1( . . . . . . .. . . . . . .. . .. . . . .. . .. . .. . . . . .. . . . . · .. · .. · · .. .. · · 247
Kapcsolódó minták . . . . . . . . . . . . . . . . . . . . . . . . . · · · · · · · · · · · · . . . · · · · 247
É rt L lln ez 6 . . . "'. . r . .. . . .. . . . . . . .. . . . .. . . . . . . . . .. . .. . .. . .. . . . . . . . . .. · · · .. .. · .. · .. · 248
Eg)' [b ne \' e l{ ..... .. .. .. . . . .. . . . .. . .. . .. . . . .. . . . . . .. . .. . . . . . . .. ....... 248
Cél . . .. . . . . . . .. . .. . . . . . . .. .. . . . . . . . . .. . .. . . . . . . . . .. . .. . .. · .. · · · .. . io 218
F ela da t . .. . . . .. .. . . .. . . .. . ..... .. . .. . . .. . .. . .. . .. . .. . .. . . .. ........... 24.8
Al kalina z11 a t ó s á g . .. . .. .. . .. . . . . . . .. . .. . .. . .. . . .. . .. ...... . .. . . . . . . .. . · · .. .. · .. 250
Sze 1'" kez et.. ..... .. . . .. . .. .. . . . .. . . . . .. . . . . . . . .. . .. . . . .. . . . . . . . . · · · .. · .. · t 2 5 1
Rés zlvevő <. ................... ................ . .. . . . . .. . . . . · · · · .. · 251
Együtt n1 űk ö el é s . . . .. . . . .. . . . . . . . .. . . .. . .. . . . .. . .. . . . . . . .. · .. · · .. · · · 2 5 2
J<övetkezmények ............... . . .. . .. . . . .. . .. . . . .. . .. . .. . . . . . · .. · .. 252
Me g\' a 1 ó s í tás ................................... . .. . ... . .. · .. .. · · · .. · .. · · 2 5 2
1) (J d a l( Ó ci . . . . . . . . .. . . . . . ... .......... . .. . .. .. ..................... 2 5 3
Ismert fe llasználások . . . . .. . .. . .. . . . . . . . .. . .. . . . . . .. ....... . .. . .. . . . 261
Kapcsolódó minták . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · · · · · · · · 261
B ..... /' 262
eJ al-o. .. · . . · .. · .. · .. · · · . . . . · .. · · .. · · · · · .. · . .. · .. · .. · .. · .. · . . · · .. · .. · · · · .. · · · ·
Cél . .. . .. . .. . . . .. . .. . .. . . .. ... ...... . .. . . . . . . . .. . . . . . . .. . .. . . . . r . .. . . .. . 262
Egyéb nevek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · · 262
Feladat . .. . . . . . . . . .. . .. . .. . . . . .. . .. . .. . . . . .. . . . .. . .. . .. . .. . .. . .. . .. . . . .. · · · .. .. · .. 262
Alkalmazhatóság. ........... . . . . . . . . . . . . . . . . . . . . . . . . . . . . · . · · · 264
S ze l{ezel . . '. . .. . .. . . . . .. . . . . . . .. . .. . .. . .. . . . . . . .. . . . . . . . .. ............. 264
Rés Z l v L V ől{ ....... . .. . .. . . . . .. . . .. ........ . .. . . . . . .. · .. · · · .. .. · .. · ... . 26 5
Együttműködés . . . . . . . . . . . . . . . . . . _ . . . . . . . . . . . . . . . . . . . . . . . . . . 2 65
Köve tk ezmén ye k ............................................... 265
Megvalósítás ...... . . . . . . . . . . . . . . . . . . . . . . . . · · · · · · · · · · · . . 266
P CI dakód .. . . . . . . .. . .. .. . .. . . . . . . . . .. . .. . .. . .. .. .. . . . . . . . . . .. . .. . .. . .. .. ...... 268
Is ill e rl fe 111a s zná 1 á sok . . .. . .. . .. . . . . . . . . .. . . . . .. . . . . .. . . .. . . . . .. . .. . ... 276
Kapcsolódó minták . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. ........ 276
I( özv e tí t ő. . .. . . .. . .. . . . .. .. . . . . . . .. . .. . . . .. . . . . . . . . . . . . . . . .. . .. · .. · .. · .. · . .. .. . 2 / 7
Egyéb nevek . .. . .. . .. . . . . . . .. . .. . . . .. . . . . . . . .. . .. . .. . . . .. . . . . r .. .. · .. · · · 277
Cél . .. . . . . . . .. . . .. . . . . .. . . . .. . . .. . . . . . .. . .. . .. . .. . .. . . . . . .. . .. . . . .. · · · · · · . 277
Fel a da t . . . . . .. . .. . . . . . . . . . .. . .. . .. . .. . . . .. . . . . . . . .. .. . . . .. . . . .. · .. · · · · · .. 27 7
Al ka.lm a z11 a ló S d g . .. . .. . . . . .. . . . . . . . .. . . .. . . . . . . . .. . .. . . . .. . . . . . · · · .. · 2 8 O
Sze r ]{ eze l . . . . .. . . . . . . .. . . . . . . .. . . . . . . . .. . . . .. . . . . . .. . .. . . . .. · .. · .. · · · · .. · 2 8 O
Rés z tv e v ő]<. ................................. . . .. . . . .. . .. . .. . . . . .. . . . . · .. · .. 281
F gyü llm űködés . . . . . . . .. . .. . .. . . . .. . . . .. . .. . .. . .. . .. . .. . . . . . .. . .. . .. . . . . . .. . . 281
l( öve tk e Z TI ény ek io. . .. . .. .. . . . . . .. . .. . .. . .. . . . .. ....................... 28
Me l ' t 282
b va o s as .... . . . . .. .. .. · · .. · .. · .. · · · · · · .. · .. · .. · .. . .. . . . . . .. · · · .. .. · · · .. .. · ·
1) é 1 dal{ ó cI . . . . . .. . .. io .. . . . .. . .. . . .. . .. . .. . .. . .. . . . . . . . .. . .. . .. . . . . . .. . .. .. · 2 82
1 SIDe rt [cJllas zná] á 5 ok. .. . .. .. . . . . .. . .. . . . . . . .. . . . .. . . . .. .................. 285
KapcsolÓdó minták . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · · · · · · 286
II.
XII
ogramtervezési minták
Emlé eztet6 .. .. .. .. .. .. .. ol' .. .. .. .. . .. .. .. .. .. .. .. 287
Cél .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. .. .. .. .. .. .. .. 287
Egyéb nevek .. .. .. .. .. .. .. . .. .. .. . .. .. .. .. .. .. .. .. .. .. ol' .. 287
Feladat .. .. .. .. .. . .. .. .. .. .. .. .. . . .. . .. .. .. . .. .. .. 287
Alkalll1az 1atóság .. .. .. .. . .. . .. .. .. ... .. .. .. .. .. .. .. .. .. .. .. 289
Szerkezet .. . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. . 289
Rés7L vevők .. .. . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. .. .. 289
Együttműködés .. .. . .. .. .. .. . .. .. .. .. .. .. . .. .. .. .. .. .. .. 290
Következ 11énye 290
.. . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Megvalósílás .. . .. . .. .. .. .. IF .. .. . .. .. .. .. . . .. 291
Példakód . .. .. . .. .. .. .. . .. .. .. .. .. . .. .. .. .. 29 2
Isn1ert fell1aszná.lások .. .. . .. .. .. .. .. .. . .. .. .. .. .. . .. .. . ?9 / -
Kapcsolódó mintá Je . .. .. .. . . .. .. .. .. .. .. .. .. .p . . .. . . .. .. 295
Megfigye]ő . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 296
CéI .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. 296
Egyéb nevek .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. .. 296
Feladat .. .. .. .. .. . .. .. .. .. .. .. .. .. . .. .. .. . .. .. .. .. 296
Alkalmaz11atóság .. .. .. .. .. . .. IF .. .. . .. .. .. . .. .. .. .. .. .. 297
Szerkezet .. .. I!" .. . .. .. .. .. .. . .. . .. . .. . .. .. .. .. ... .. 297
Résztvevők .. .. .. .. .. .. .. .. . .. .. .. . .. . .. . .. .. .. .. 298
Együttmuködés .. .. .. .. .. .. .. . . .. .. .. .. .. .. .. .. . . .. 298
Következmények .. .. .. .. . . . . .. .. .. .. .. IF .. .. .. .. 299
Megva ásítás .. .. .. .. .. .. .. .. .. .. . .. . . .. . .. .. . 300
Példakód .. .. .. .. .. .. .. .. .. . .. .. . .. .. .. .. .. .. .. .. .. .. 303
Ismert felhaználások .. .. . .. .. .. .. . .. .. . . .. . .. . .. .. .. 306
Kapcso ádá m.nták .. .. .. .. . .. .. . .. .. .. .. IF .. . .. .. 306
,
Allapot. .. .. .. .. .. .. .. . . .. . . .. .. .. . .. .. .. .. .. .. .. .. .. .. .. .. .. .. 307
Cél . .. . .. . . .. .. . . .. .. .. .. .. .. . . .. .. .. .. 307
Egyéb nevel{ .. . . .. .. .. .. .. .. .. .. .. .. .. .. .. .' .. .. .. . . 307
Feladat . .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. . .. .. 307
All{almaz11atóság .. .. .. .. .. .. . .. .. . .. .. . .. .. .. .. . .. .. . . .. .. . 308
Szer:reze . .. . .. .. .. .. .. .. .. . .. .. .. .. . .. . .. .. 308
Résztvevől{ .. .. . .. .. .. .. .. .. .. .. .. .. .. . . .. .. .. .. .. 308
Együttlllűködés .. .. .. .. . . .. .. .. .. .. .. .. .. .. .. .. IF .. 309
Következmények .. .. . .. .. .. .. . .. .. .. . .. .. .. .. .. 309
Megv d.lósítás .. .. .. .. .. .. .. .. .. .. .. .. . . .. .. .. . . .. .. .. .. .. 3 O
lJ é dal{ód .. .. .. . .. . .. .. .. to .. .. . .. . .. .. .. .. .. .. .. 312
Ismert felhaszná ások .. . .. .. .. .. .. .. .p .. .. .. . .. .. .. .. .. .. .. 315
!(a Jcsolódó minták .. .. .. . .. .. .. . . .. .. .. .. .. .. . 316
Stra tégja .. .. . .. .. .. .. .. .. .. . .. .. .. .. .. .. . .. .. .. .. .. . .. .. .. 317
Cé .. . ) .. .. .. . . .. .. .. .. .. .. . .. .. .. .. . .. .. . . 317'
Egyéb nevek . .. .. .. .. .. .. . . .. .. .. .. .. .. .. . .. .. .. .. .. .. 317
Feladat .. .. ot .p .. .. .. .. . .. .. . .. .. . .. .. .. .. .. .. .. .. .. 3 7
Program tervezési minták
" "'..
XI II
AJ ]{ al m a z11a t Ó s ci g · · .. · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 18
Szerkezel · · . . . · · . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . .. . . . . . . . . 319
Rés z t\T evők ........................... . . . . . . . . . . . . . . . .. .. . . .. . . 3 19
E gyü ttm űk ö d LS. .. . . . . . . .. . . . . . . . . . . . . .. . .. . . . . . . . . . . .. . . . . . . . . . . . . 3 19
KCJvetkezm.én yel{ .... · .. · · · · · · · . . . . .. . .. .. . . . . . . . . . . . . . . . . . . . . . . . 320
Me gva ló s í tás · . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . .. . . .. . . . 3 21
})[1 akód. . .. . . . . .. . . . .. . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .. . . 322
Is IDe rt fel la s znál ás ok. · · · · . . . .. . . . . . . . .. . .. . . . .. . . . . . . . . . . . . . . . . . . 32 5
Ka pes ol ó dó min ták . . . . . . . . . .. . .. . .. . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 326
Sa h Ion fü g gv é II Y . . . . . . . . . . . . . . . . . . . . . . . . . . .. . .. . . . . . . . . . . . . . . . . . . .. 3 27
Cél · · · · .. · · · · · · · · .. · . . . . .. . . . . . . .. . . . . . .. . . . . . .. ............. . .. 327
Fel a da t . . .. .. . . . . . .. . .. . . . . . . .. . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . . . . . . 3 2 7
AIk a l1naz 1 a tó sá g · · · · · . . . . . . . .. . . .. . .. . . . . . .. . . . . . . .. . . . . . . .. . . . . . . 328
Szerkezet . . .. . . .. . . . .. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . .. 329
Részwevők ............. . . . . . . . .. . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Együ tlm űködés . .. . . . . . . . . . . . . r . . . . . .. . . . . . .. . . . . . . . . . . . . . . 329
Következ nényeJc . · · · · · · · . · . . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . 329
Me gv al ó s í tá s ............... . . . . .. . .. ............................ 3 3 -
Pél d.... kód <1 · · · · · · · · · · · · · · · · . . . . .. . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . 3 3 1
Isme! t felllasználások . . . . . .. . . . . .. . . . . . . . . . . . . . . .. .......... . . . . 332
Ka.pcso lódó mintál{ · · · · · · · · · · · . . .. . . . . . .. . . .. . . . . .. . . . . . . . . . . . .. . 332
Lá to gat ó · · · · · · · · · · · 4 . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . .. . . . .. . 3 3 3
Cél .. . .. . . . . . . . . . . . . . . . . . . . r . . . . .. . . . .. . .. . . . . . . . . . . . . . . . . . . . . 333
Feladat . . . . . .. . . . . . . . . . . . . . . . . . .. . . . . . .. . .. . w . . . . . . . .. . . . . . . . . 333
AIk alm a 11a t ó s á g · · · · · · · · · · · · · · · · · · · · . . . . . .. . . . . .. . . . . . . . . . . . . 3 3 5
Sze r]( eze t · · .. · · · · · · · · · . . . ... . .. . . . . . .. . . . . . . . . . . . . . . . . . . .. . .. . .. . . 336
Részevők .... .. ... . . . .. . . . . . . . . . . . . . . . . .. . . . . . .. . . . . . . . . 336
E .. ......... .. d ' 337
""" gyu ttm li (,0 es. . . . . . . . . . 4 <1 . .. . . . .. . . . . . . . . . . . . . . . . . . . .. . . . . .
Köve tk ez ro ény ek. . .. . . . . .. . . . . . . . . . . . . . . £ . . . . . . . .. . .. . . . . . . . . 338
Megvalósítás .. · · · · · · · · · · · · . . . . . .. . .. . . . .. . . . .. . . . . . . . . . . . . . . . . 339
Pél da kód . . . . . . . . . . . . . .. . . . .. . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . . . 342
Ismert felhasznáJásol{ . . . . . . . . . . . . £ . . . . .. . . . .. . .. . . . . . . . . . . . . . . . . .. 346
Kapcsolódó minták · . . . . . . . . . .. . . . .. . . . . . . . . . . . . . . . . . . . .. . . . . . . 347
A viselkedés i min ták ó] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
A változatok egységbe zá +ása · · . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 348
Argumentumként használt objektumok . . . . . .. . . . .. . . . . . . . . . . . . . . . . . 3:18
Egységbe zárás vagy elosztás? r...... . . . .. . . . . . . . . . . . . . . . . . .. . . .. <1 349
A ]{üld6 Ls a fogadá e választása .... . . . . . . . . . . . .. ........ . . . . .. . 350
o ss ze gzés ............ · · · . · · . . . . . . . .. . .. . .. . . . . . . . . . . . . . .. . . . . .. . 352
6 fejezet Tanulságok
6 1 M . ". k . · ,;, l ? 3 54
II vafJun egy tervezesl ffilntato ............. . . . . . . . . . . . . . . . . . . . . . .
K .. .. . k . 35 LÍ
0205 tef\!e <...S1 Z() 1 n CS .... . . . . . . . . . . . . . . . . . . . . .. . . .. . . . . . . . . 1
D o kum en tá c i ó és tan li 1 ás i se géd et ............ . . . . . . . . . . . . . . . . . . . 354
II
XIV Programtervezési minták
A 1 ". -'-' d k k . "..;y-. 3 5 5
ete o mo szere legeszltoJC...O'.O'. . . . . . . . . . . . . . . . . . . . . . . . . .
A . ,i",; " } . 356
Z li J ra ep 1 tes <.. e. Ja. . . ol . . . . . . . . .. . . . . .. O'......... ot . . . . . . . .. ....
6.2 Egy kis történelem · · · · · · · · · ol · · · . . . . . . . . . . . . . . . ol . . . . . . . . . . . . . . . 357
63A ;'... kk .. 358
. ol tervezesI mInta ozossege. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ol . .
Al ex and er ill int any elvei .............O'............ . . . . . . . . . ol . . . . 359
S oCt ve minták .....O'.... · · . . . . . . . . . . . . . . .. . . . . . . . .. . . . . . . . . . . . 360
6.1 Meghívó · · . · · · · · · · · · . . . . . . . ol · · . . . . . . . . . . . . . . . . . ol . . . . . . . . . . . 36
6 . 5 Bú cs úz ó ul. .. · · · · · . " . . .. · " · · · · · . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 361
Függelékek
A függelék Szószedet
B függelék Utmutató a jeJölesekhez
B. 1 O s tál Y di a gram () k .. · · · · · · . . . . . . . . . . . . . .. . ol . . . . . .. . . . . . . . . . . . . . 367
B . 2 O b Je kt um dj a gra m o k . . · · .. · ol · · · · · . . . .. . . . . . . . . . . ol . . . . . . . . ol . . . . . 369
B. 3 Egyi.itttnűködési diagramok ... . . . . . .. .. . . . . . . . . . . .. . . . . . . . . . . . . . 370
C függelék Alaposztáryok
c. 1 Lis t .. · · · · · · . . · · .. · · · · · · · . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . .. . 3 73
Létre110zás, megsemmisítés, előkészítés és értékadás . . . . ol . . . r . . .. . ol . . . . . 375
Elérés · · · .. · ol · . . · · · · · · · · . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
i o 7 zá adás . · · · .. · ol · · . . . . .. · · · · · · · . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . 3 7 5
Eltá vo 1 í tás · · · . · . .. · · · · · · . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 376
Ve re 111fe 1 üle t .O'.O'.... . .. . . . . ol . . . . . . . . . . . ol . . . . . . .. . ol . . . . . . . . . . . 3 76
c . 2 1 t era tor · .. · ol · · · . .. · · · · · · · · · · ;. . . . ol . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 76
c . 3 Lis tI te ra tor ..O'. · · · · · . · . . · · · · · · · · · · . . . . .. . . . . . . . . . . . . . . . . . . . ol . . . 3 77
c . 4 Po' nt · · · · . · · · · · · · · . · · · .. · · · · · .. . . . . .. . . . . . .. . . ol . . . . . . . . . . . ol . . . . . 3 77
c · 5 Re ct ...... · · . · · · · · · . ot . . . . .. . . . . . . . . . . . . .. . . . . . . .. . . . .,. . . . . . . . 3 78
Irodalomjegyzék
Tárgymutató
Kari1lnak
.G.
Sylvie-17ek
i? . !-l.
Faith-nek
R}.
Dru Anll l1ek és Alatthew-nak
józsué 24: i5b
J.V
, j. I
,Jó ideje nen1. o]vastam ilyen kitűnóen megírt és mélyre]lató könY'let... A tervezési minták
létjogosultságát a lellető legjobb mód.szerrel bizonyítja: nem a magyarázat, hane TI a példák
erejéve14 t
Stall Jipplnan, C++ l?eport
i...Gammd, HeIm, Jo 1nson és Vlissides eme új könyvének 11atása a szoftvertervezés
elméletére bizonyosan hoss7an tar ó lesz. Kárt hogy a Progla117ten)ezésl millták maga azt
állítja, hogy csak az objektuml{özpontú programokkal foglalkozil{, mert így az eIne
l(özösségen k/vi11. s70ftverfejlcsztők esetleg kézbe sem veszik - anli na!,:ry kár lennc, Inert a
?"()tet m'nden.kinek nyújt valamit, dki szoftvert fejleszt. Minden fej esztő l1asznál tervezési
mintál(at, az újra11asznosít11ató e vont eleme { jobb megértése pedig csak joblJá te11eti
munkánkat6"
Tom DeMarco, IEEE Softwar"e
"Összességébe 1 úgy gondolom, a '(önyv 110zzájárulása a sza :rterülethez egyedülálló és
felbecsülhetetlen. Az objektum (özpontú terve és teren s. erzett hatalmas ta pasztalat áU
lllögötte, melyet tömör és újra11asznosítllató formában tá na1( elénl(. Bi7tOS, 11061) gyakran
fogom fellapozni, ha ötletekre les szükségem a objektuml{özpontu tervezést illetően - de
l1át éppel e a7 újra11asznosítás lényege, nem?U
Sa1'Zjiv Gossai11, jOlll'"nal of o bject-O riell ted P1ogranlm.i11g
....
Programtervezési minták
XVIII
Ez a régen várt k()nyv l1.éltó az előzetes ]1 Jrverésl1ez: mint egy építész tervei, úgy sor.-
l(Qzna.k benIle a7 idől( során Szál11talanszor biLony"lolt, kipróbá]t móds. erel{. A szerL:ők az
()lJjel<tLIlnköLI)Ontú terve7'és terén szerzett töl111 évtizedes tapasztalatlJl{kal 23 mintát vá-
lasztottak ki, és Öl1ill.3.gálJan LL a szám mutatja, mOlyen ajapos és fegyelmezett munkat
végeztek. A Progr'alnte17)Czéi ''flitzták egy péIdá11yival rninclen progra.moLónak rel1del
1<ezl1ie lccll, aki szeretne még jobb lennjr"
\
1 a 17)' O'Brierl} Softurare DevelopJl1eTzt
"Kétségtelen tény, 110gy a tervezési minták teljesen lllcgváltoztatha.tj(.k a 7() lve fejlesztés
lTIódját, és a valódi, elegáns terve7és szintjére cn1ellleliJ{. A P1og1alnte1i)ezési 111iJ1-lák a7 e
lenJ}etről írott l<önyvek l<özül 11eSSLL l(.emelked.ik: olyan kön)rv afnelyet cl kell ()lvasni, a
l11élyérc l<ell ásni, meg kell lanU]J1j l(Jviil ől - és /eretni kell. Minc1.C)fC)kre m.egvá.lto.tatja
a nézc5pontunl{al a l)rogral110kat illetően."
StelJe Rillou), j01-lrnal q/ Object-Oriel1lcd j:J rogr "Ul11rrlirlg
,A Pr"ogl'-alntervezési lnil1ták igen erőteljes k()nyv. Röv'd iSl11crl\.edés után a legtöbb C++-
program()zó képes lesz haSLnoítani a bel1ne belnuta.totll11111tál<at, lOgy jobl) prograffiol{3t
készítsen. A kötet intellel<tusun1<at töl{életesen kOelégíti: a gyakorlatlJan l1aszn.ál}12.tÓ eszkcJ-
zökct nyújt, amelyek elgondolk()c tdlnal{ és segítenel\:, ll()&7 11atékonya.blJdo feje7]lesSlil( l(i
ma.gunkat. Alapvetőcn megváltoztatja, alnit a programozásról gondolunk.'}
TOI?1 Cargill, C++ Report
:. · -t-
Inne 'Í.. a kÖnyvnek 1em af a céJja, hogy bevezetést adjon a7. objektumkÖ7pontÚ (objeklum-
orientá]t) rnegold.ás(JkIlo7 és az objektunlköz )ontú pr()gramolt icjIes7tésé11c2. A témá ól
számos igen je) ](ön.yvet írtal( nlár. Kötetünk azt feltételczi, }l()gy 32 ülvas() jártas lcgalát)l1
egy objektumkö2pontú nye vben, Ls rende {ez'k vaJamennyi tapasztabtta. ;:1.l objeklum-
l<f)zpontú tervezés terén · s. Vagyis a egll lJfozottabb"tn nel11 a7a (oa.k S£Ó], akiknek
a szólárért kell nyÚlniuk, am 'kor lípusokról vagy löbbalakús ágró 1 beszélünk, vagy ha
SeJll1)eá.llílj uIc a fell] 1. etö rö (1 ést a n1 e gyal ósítáS-(JfC) k 1 éssel.
Másrészről nem célunk az scm, hogy haladó s7intlÍ, technikai jellegű tárgyalását adjuk
a té 11ának. E7 csupán egy terve7ési mintákat tarta m zó kÖnyv, ami egys7er(í és elegáns
megoJdásokat ír le eh>y-egy adott - a7 ohjektu nkÖ7po 1tÚ sza lverlervezésen belüli - p -ob-
Jémára. A tervezési 111int1.k olyan, hosszú évek alatt kidolgozott és továbbfejlesztett megol-
dáso]<at 1 na.k lL ame]ye]{ az idők ')()rán JTI3.f bizonyítottal(, \Tagyis n.eJll 3, "kc£c.ieli öt]etel{"
kategóri:jába tartoznak. Többs7Öri újratcrve7és, úJrakódolás áH n ögöt1ük, amelynek célja
a jobl1 újrah.asznosítI-1ll{)ság és a nib'Yoll11 rugalmasság volt. A tef\'ezési mintá]\:: e7eI<et
a lnegoldás()l<at foglaljálc össze lc) nör t 1<önnyel1 a1kalmaL.ll-f.té} f()rlllában
A tervezési l11inlák se111 H "cjtett" nyelvi szolgálldtáso]{, sen1 illdsol{ ell{ál)ráztatását szolgáló
prog -amozási trükkök ismeretét nen1 igényJik. Mindegyik mcgvalÓsítbató zabványos
objekturnl{özponlú n}'e]vel{en, bár ta án egy kicsivel több munl<{lt igén)Tclne]{, D1.int 3.2
"alka mi" megoldáso c A befektetett erőfeszítések azonban lTIegtérülnek, ahogy prog-
rll11jai 1!{ rug'- .lrnassába és lljrallas.zn()Sll11atós3.ga no.
Ha egys e rnegértjük a tervezési miJllá]<at és nem csa]{ l(éru.őn nézün (, amil«()r szóba
keriilne {, soha tÖhbé nem faf:, J 1Jnk a2 objcklumközpontú tervezésre ugY.1núgy gondolni.
ÖSLtÖnÖsen olY..ln p rogra 1110 kat fogunk kés.lÍteni, amelyek rugahnasabbak, modulári-
sabbak és átlát 1atóbbak de hát éppen e7ért választotluk az objcklumközpontú prog-
ramozásl, D.em iga.z?
xx Programtervezési mintak
Fisryelmeztetésképpen, de egyszcrmind bátorításként fel kelI hívnunk 3 Igyelmet, ho!:,'Y nem
s7al1ad aggód.nl ha o.em [I1"Ünk meg l1.indcnt az első o]vasásra. Mi sem. értettünk mindent,
amiko először Pdpírra vetettük... E a kötet ne II egys eri e]olvasásra és a7tán 3. palera való
- sűrun ogjuk ké7be venni Cs fe Iapozn', 110gy ötleteket gyűjtsünk a tervezéshez.
A könyv nehe en szÜletett meg. l\égy o szágot: három szerző házassÁgát, és két (rokonság-
ban nem levő) utód születését látta, és rengeteg en1ber vette ki a részét a szerkesztéséb61.
Külön l<öszönct jár Bruce Andersonnak, Kent Becknek, és And.é Weinandna]{ biztatásukért
és tanácsaikért. A70knak is meg s7e etnénk kös önru, akik átnLLték a kézirat pis7kozatát:
Roger Bjelefeld J C.rad.y EOGe 1) TOln CJ.rgill, Marsl1all Cline, Ralph Hyre: Brian Kerníngllan t
,. l10ma.s LalibeI1YJ Mrl( Lorcn. , At111Uf Riel} Doug Sch.m_dt, C ovi Tondo, Steve V.nos]<:! és
Rebccca Wirsf-Brock - k.öszön.jü]{4 I-Ialásak vagyunk az Addisol1-Wesley kiadó csa!Jatának
(Kate Habib, Tiffany Moore, L'sa Raffaele, Pradeepa Siva és John WaiÜ .s segítségü kért,
fáradllalat] anságukéll Cs tü re] .1lÜ (ért, amel11le] támog3.tták ezt a munkát. Külön }{öszönet Carl
Kesslernel{ Dlnny Sabball-nal< és MarJ< WegI1Llnnak az M l{Ulatóinlé7etéb61.
Vé!:,ri.1J, de nem utolsósorban, mindenkinek köszönetet mondunk az Internetről, akik rnegjegy-
zéseket [ű7tek a 11inták külÖnböző változataiho7, bátorító savakat 1110nduk, vagy lneg
crősítettel{ rninket ablJan, 110gy amit csin.álunk, az értékes. Ezen emberek közé tarloznaJ<
(a teljesség igénye nelkül): Jon Avotins, Steve Berc7uk, Jul an Berdych, Matthias Bohlen, John
Brant, Allan Clarke, }JauI Cllishol1n, Jens Coldewey, Dave Collins, Jim Coplien, Don Dwiggins)
Gabriele Eia, Doug Felt, Brian Foole, Denis Partin, Ward Harald, Hermann Hueni, Nayeem
Islam, Bikramjit Kalra: Paul Keefer, Thomas Kofler, Doug 1 ea, Dan LaL'berte, Janles Long,
Anne Louit,e tuu, Pundi Madhavan, Br'an Marick, Robelt Martin, Dave McComb, Carl
McConnell, Christmc M.ngins, Jia11spetel Mössenböck, Eric Ne\VtcJo, Ma.anne O kan, Roxsan
}>ayette, Lany l)odmolik, George Rad.in, Sita R31nakrislloan, Rt ss Ramirez, .Alexander Ran, Dir--
Riehle, B:ryao_ Rosenburg, Aamod San.e Duri Schmidt, Robert Seidl, Xin S]1l1 és Bill Wal='er.
Nem g'ondoljuk, 1 ogy a mintá =' gyűjtel11énye teljes és megválto tat]1atatlan; inkál)b csa (
a terve7ésről all(ütotl jelenlegi gondolatain]{ tárllaza S. vesen Dgadjll{ a megjegyzéseket,
legyen az bár a példák kritikája, o yan vonatkozása '( és ismert fel. asználási módol(,
amelyeket kiJ1a.gytunk, vagy olyan tervLzési Injnták, ame yeket lJele kellett volna foglalnunk
a könyvbe. A leveleket a gondunkat vise ő Addison-Wes ey kiadó fogadJa, de elektronikus
levélben, a deslgn-patterns@cs. uiuc. edu c'" cn is e érhetők vagyunk. fIa a pLldd-
kódokbóJ ele <ctron 'kL s példányra lenne szükségünk, elég, ha elküldjük a "send design
patte n source') üZen<...tel a design-patterns@cs. uiuc.. edu címre. A legfrissebb hírek
és javítások a http://st-vrww-cs .. uic edu/users/patterns/DPBook/DPBook. hlml
weboldalon érhetők el.
E. G. Mounta.in View, Cali orn.a, USA
R. IT. Montreal, Quebec Kanad.a
R. J. Ur11ana, Illinois, USA
J. V. Ha.Vvtllorne J New Yorl{, USA
1991. augusztus
I
Minden je) szer (esztett objektumkö7pontú rend.szer teje van lnintákkal. Tulajdonképpen
a7 egyik m.ódja annak, ahogyan megítelem az objel{tu 11központú renelszerek min6ségét az,
l10gy a terve7ői vajon eléggé odafigyeltek-e az általános együttműködési leh.etőségekre
a nyelv obJel(tumai kö ölt. Az ilyen szolgáltatásokra va ó összpontos"'tás a Lnd.szertervezés
fo _yamán olyan felépt.11ényt eredményezhet, alni kisebb, egyszerűbb, LS sok <al éJtll.etó1Jb,
mint ]la ezen mintákdt mellőzik.
Az ÖSs7etelt rendszerek esetél)en a lninták fontosságát l11.ár régen felismerték. Cllristopl1er
Alexander és munkatáraj voltak talán a elsől{, akik felvetetté ( egy rn.ntanyelv ]1asz-
nálatándk ötletét épületek és városok építésénél. Gm olataik gyökeret vertek az objek-
tum]{özpontú szof tverfej 1 esztől{ között is: röviden, a te veLési nlinták révén a programozá.s
az építés.lc <: tud.omán.yána.k szintjére emelkedett
Ebben a könyvben [r.ch GarTIma, Richard I-Ielm, Ralph Jol 1son és John VIssi es bemll-
tatják a tervezési minták alapelveit) majd ren<-lszere j]{ is d. mintákat Így a kötel kél S7eJll-
pontból is né külö7]1etetlen: először is, megmutatja, milyen szere}Jet játs7hatna { a minták
az összetett rendszerel( felépítésében, lnásodsLor, a jól felépítel- mintál{ belllutatása révén
a gyal{orlatban haS7Dosít]1ató {ézikönyvet ny(ljt, amit a hyal\:orló terveLő munl<áJa so +án
fell asználhat.
Megtisztelve érzem magam, amiért lelletőségerTI volt tervezőként együtt d.olgozn' a könyv
több s7erzőjével is: sokaltanu]tam tőlü {, és gyanítom, 3 kötelet e o vasva az Olvasó is fog.
Grady ooch
Vezető tudós, Rational Softvv3re Corporation
.
I
. I
.
n k
A l(ötet két fő rész e oSLlik. A7 elsé5 rés? (1 és 2 fejezet) leírja, Illik is azol{ a tervezési rnin-
ták é5 llogyan ')egíteneJ< olJje}ztum.l{özpontú programC)l<al tervezni, m.a.jd egy esettanulmány
segÍtségévellJc nuta.tjl, llogyan alkalnlazllatók a te vezési In in rák a gyakorlat11an A ki)nyrv
lnásodik réS7e (3.,4. és 5 fejezet) a tllla.jdonképpeni lef\ r e7ési J)1.inták 1(3talógusa.
1: gyűjtemény les7i ]<i a ]<öoY\' Jelentős részét. A n1ás()(Iik rés7 fejezetei l1á.rom típusra oszt-
jál< l terve7ési Jl1intákat: lét +elloLási, szerl{e7eti és viselkedési mi11tákra. A l<ataJ()glls több
féle Inódon is llas7náll-laté). Flo1vasllatJuk az clcjét61 a végéig, de 11ön.gészllctünl( 111intáról
mintára is. Más l11egl{özclítés Ila valamelyi]< feje7etet l11ély +c}13.tóan tanulmányo77u]<. Ha
ezt \'álasztjuk 1 látni fogjuk, 110 h Y)T a ]<ö7eli kapcso]atban álló mintá { llogyan ](ülönl)öztet.J
me!:, maguj{at egyJ]1ástól
A !:,ryLíjleIllén)Tben va]ó haladás110z logikai útirá.nyje17ő]<ént 113.sználl13.tjuk a Ininlák kÖ7ötti
1 .vat (ozásoJat Ez a megközelítés belli1Jantdst enged abba, h()gyan I<apcs()J.ódna.k a minták
egymás11oL 11()gyan ]{ombinál11atók lns mintákl<a, illetve mely mintál< műkc)cJnek j()1
egyLi tt. Az 1.1 táblázat grafikllsal1 Dllllatja be e7eket 3. l1i va t (ozás. l{a pcsolato]<at.
Egy másik 111óclja a l{ataJúgus elolvLsdsánaJ( a p oblémal(özponlú Inegkf>7elftés. Ugorjuk az
1.6. alf<:jczelre, LillOl néllány á talános p 40blélnáról olvasllalun.1< a.z újra.l13.sznosítllató ()lJjek-
lUInkc)7JJOntú J)fogramtervezés területéről, majcJ ](eressük .11eg és tanulrnányo77ul< a7 adott
problén1ákra megoldást nyíJjló mintál{3t. Van, aki először végigc)lvassa a l{atalógust, és
utána tér át a prob]émaközpontu lnegközelítésre, 110 negkercssc d saját mun1{ája sorál1
llka l111a7 ]1 a tó ill intá t
.
XXIV Programtervezési mintak
Ha nincs tú nagy tapasztalatunk az obJektumkö7pontú tervezésben, kezdjük a kgegysze
rű1111 és legálta ánosabb mintákkal:
Elvont gyár (AIJstract Factory)
· Illes7tő (Adapter)
Összetétel (Colnposite)
· Díszítő (Decorator)
· Gyártófüggv[n_y (Factary MetIlod)
· Megfigyelé) (Observer)
· Stratégia (Strategy)
· Sablonfüggvény (Template MCtllOd)
...
..
\
...
"1
....
Olyan objektumkö7pontll rendszer szinte nincs is, amelyik nem használ legalább egy párat
az itt felsorolt ninták közül, a nagy endszerek ped" g csaknem mindet használják E leg-
gyakrabban alkalmazott mintá T segítenek, hogy lnc.gértsük a jó objektumközpontú terve-
zés énycgél, illetve az egyes tetveZLsi ) inták sajátosságait.
..
.,
..
-
.
.
Objektumközpontú p.ogramot tLrvezn nehé7 ú:jlallasZ110sítI1atót .1 ég ne11ezebb. Meg
kell találni a mebfeleló objektumokat, 11cJyesen :relJ oztályokba rendezni azokat., meg l{e 1
határo7ni az osztályok felüle -eit és az öröklési viszonyol(at, és ét -e kelll10zni a (ulcs on-
tosságú kapcsolatokat közöttű]{. A tervnel{ igazodnia l<ell aL adott problémáho7, de eléggé
általánosnak l<elJ ]ennie ahlloz, ]10gy később más feladatol{1107 és l{övetelménye]{]lez is il-
.;
lesLthető legyen. Altalában arra is lörekszünl(, l10gy ne le&'Yen szükség újratervezésre, vagy
]egalábbis a lellető legkisebb llértékben. Bármelyil{ tapas7talt tervező megmondllatja,
hogy egy újrallasznosít11ató Ls rugalmas obje lumkö pontú szoftvert Odgyon nc11éz, ha
nem lelletetlen elsőre pontosan megterve ni Mielőtt egy terv kész lenne, általá11an lc)bb-
ször megpróbál.'ák újrafel11asználni, II ndannyis or módosítva rajta valamit.
Mégis, a ta Jasztalt tervezők igenis l{észítenek jó tervel{et, Jl1.íg a }<ez(lő tervezők elves70ek
a lchetősége]{ d.zsunbelében és l1ajldmosal( visszatérnj a korábban meg'_smert, nem objek
tlllnkcJ7pontú mego]d.áok110z. Hosszú id.cStJe telik, amíg a ]<ezd{5k mLgtanulják, lniről is
szól a jó o11jektumlcözpontú tervezési Vagy.s a tapas7talt tervezőI\: nyj]ván tuu.nak valamit,
amit a ta Jasztalatlanc)J.c nelll. Oe mi le 1et a ?
A szakértő tervezők például tudjá]{J 110gy 11em szabad ])Jjflden prob émára új megold.ásol{at
(idolgo7ni Célszerűbb új ahasznosítani a70n megoldásokat, a111elyel{ korábban már mű-
ködől(épesnek b.zon)lUltak. Vagyis l1a találunk egy jó megoldás, új +a és l1jra feJ11asználh t
juk - e7 is llozzájárul allhoz, hogy szakérlőkké válhassun (. Ebből kc)vetkezően a l(ülönbö-
ZŐ objektumközpontú rendszerekben visszatérő oS7tálymintákat és együttJTIűköd6 objektu-
moka találh.atunl{: ezek 3. minták adott tervezési p oblémákra adnak ll1egoldást és rugal-
massá, elegánssá, végső soron újrahasznosíthatóvá les ik az obJektum1(özpOnlÚ rendszere-
J{et Segítene]{ a ter\Tezőkncl{ új ahasznot,Ítani a si {eres terveket, azzal, hogy az új terveket
a megelőző tapasztalat alapjaira hclyezk. Az a terve7é5, akinek isme őse]\: az ilyen mintál(t
rögtön l(épes eS7 alkllmazni azo]<at má [cladatol<ra is, anélkül, 110gy újra fel kellene fc-
deznie őket
2 Programtervezési minták
A Jélyeget <-{,ty hascJDIattal ragadhaquk meg. Regény- és színc,arabírók ritkán rögtön ik
a cselekményt; ehelyett olyan lnintákat követnek, mint a "tragikusan esendő hős" (Macbeth,
Hamle stb.) va&ry "a romantikus regény;' (erre s7ámtalan példa akad), Hasonló módon; az
objektumközpontú programokat készítő terve7l5k olyan mintá {at kÖvetnek, mint az "áb 'á-
zoljunk állapotokat objeklumokkal", "kés7ÍtsÜnk "díszíthető" objektumokat, amelyekhez
kÖnnyen új jellelnzőket adhat-unk, vagy éppen elvehetünk belőlük", lIa ismerjük anintát,
szá.mos tervezési (Jöntés automatikustn adó(J.ik
Mindanny'an iSI lerjük a tervezési t:ctpas talat értékét. IJánys7.or volt tel ve7és kÖ7bcn déja
vu é . zéÜnk - hogy ehryszcr m.ár megoldottuk a problémát eLelőtt, de nem tudjuk; mikor és
hogynr Ha em1ékeznénk az eló7{5 problénla részleteire és arra, hOhryan oldottuk meg, újra-
has7nosíthatnánk az akkorí megoldást, ahelyett, hogy ujra rá kellene jönnünk. Sajnos azon-
ban tervezési tapas/talatainkat ritkán 'ögzítjük mások számára.
E könyv célja, hogy rögzítse az objektumköLpontú tervezésj tapasztalatok;, t, tervezési min-
tákként. Mindegyik terve7és' minta rendszerez, elnevez; megmagyaráz és értékel egy fontos}
az objektumkö7pontú renus7en:ken belül gyakran ismétlődő megoldást. Cé unk az, hogy
JTIások számára haté {onyan alkalmazható fOluiban adjuk át tervezési tapas7talataink t,
c/ért öss7egyűjtöttÜnk és leírtunk néhányat a legfontosabb tcrvezési n inták közül
- ezeket mlllatjuk l)e a köletlJen.
A tervezési minták könnyebbé teSZik a SI <eres tervek és szerkezctek újbóli felhasználását.
A már bizonyított módszerek tervezési mintákként való rögzítése e érhetőbbé tesLi e meg-
oldásokat az LJj rendszerek te vC76i számára. A te vezési mintá { segítenek k'választani azt
a megoklást, amelyik újrahasznosíthatóvá tes7i a rendsLert, és segítenek elkerülni a7okat,
amelyek nem. A telvezési m"nek a léte/6 rendszerek do {ument.álását és karbantaltását is
segíthetJ{.; a7zal; hogy pontosan leÍ1ják a mö<töttük nlegbúvó osztá yokat és objektumkap
csobtokat. Hogy egyszuiIen fogalmazzunk, a tervezésI minták egítenek a tervezőnek,
llOgy 113mara11b leljen. f3 a 11elye útra.
Az c könyvben sLereplő terveLL.si minták egyike sem ír le új vagy nem bizonyított terveket.
Csak olyanokat vettünk bele, aITIelyeket már többször is alkalmaztak különböző rendsze-
rekben. E telvek legtöbbjét 111Lg sohasem dokumentá ták: a7 objektumkÖ7.pontú közösség
"folklórjának" réS7ei cS1-1pán, vagy elen ci egy sikeres objektumkÖzpontú +endszernek, de
egy ke dőnck ezek egyikéből scm egyszerű tdnulni. fe lát, bár ezek :ct tervek nem újak, új
és elérhető f0f111ában, eh>yfajta tervLLésÍ1uinta-kataIÓgusként tárjuk az olvasók elé.
A könyv lnérete dlené'c csak 3 tÖredékét képes bemutatni egy szakember valós7nűsíthető
tudásána. Nincs benne egyetlen minta seOl, ami az egyidcj(í (párhu7aITIOS vagy elosLtott)
vagy a valósidejű programozással foglalkoz'k, és nincsenek benne kifejezetten egy adott al-
kalmazáslípusra vonatkozó mint1'k. Nem mondja J11eg, hogyan késLÍtsü lk feJhasználói felü-
leleket, hogyan írjunk meghajtóprogramokat, vagy hogyan használjunk obje {tumkÖLpontú
adatbázisokat. Természetesen e7en területek mindegyikének is megvannak a saját mintái; é5
érde llLS lenne valakinek c7eket is katalogizálni.
1. fejezet · Bevezetés 3
1.1 Mi is
tervez si mint?
Cl1ril.)lolJ11Cr Alexand.er a7tlllondja: M.nd.en minta. o yaJl pro11lémát ír IC J ami újra és újra fc -
lJukkan a ]{ÖrnyeLclü111cbel1, & aztán le F 4ja. hozzá l megoldás magját, ()ly módon 11og)!
a meg()ldás tn'11iósz()r [ellldsznál11ató legyen J anél]{ül, l1.ogy valal13 is kétszer l1gYdnúgy csi-
nálná.n.l{." [AIS+ 77, x. oldal) ár Alexande & épli]etel< és városol( mintájréJl1)eszélt, am.t Jl1.()Dtl,
a7 igaz az objektumközpontÚ terve ési mint:íkra'B. A mi megoldásaink falak és ajtók helyett
obje]{tuOl()k és felületel{ s7il1ljén fcjeződnek kij dc ala.pj á.b an. ,\lé\Te mind 3. l{ettő megcJlclás
egy adott pro111én1ára az összefüggéseiben nézve.
A lnintákn.ak általában négy lényeges clemiil{ van:
A minta neve llivatl{o7ái cszl(öz, an11l arra llaSL.ná.lhatllJlk, 11()gy eg)i-l(ét szó\'al leír-
junl( egy terve [si problé l1át, megoldásait és a lcövetkeLményel{et. A Jl1inla elneve-
zése d7ünnal növeli telvezési szól{in.csilJll{eL Cs lelletővé tes7i, l10gy ma.gasabb el,'()-
natl{oztatísi szinten tervezzün](. A7, 110gy v3.D.na]{ s7avainlc a lnin.tákra, ]el1etővé te-
szi, 11()gy beszé]jük rólul( a l(ollégáinl<}<al (vagy 3.ká. "tnagunkl(al't), és llasználjuk
őket a d.ol<umcnt3.cióhan. K()nnycblJé teszi, ]l(Jgy gondolkodjunk a lerve/ésről, 110gy
l)eszéljünk a ten'e]<ről 65 113-sználalul< pozitív és negatív olcialairól. A jó nevel\.: lnegta
lálása gyl1jleményünlc összeállításána.k eg)Ti]{ legnetlezcbb része volt.
2. A probléma írja le, Inikor .ll(alma£7uk a mintát, vagyis elmlgyarázza 3 prohlémál és
összefüggéseit. Lcí 11at kon}<rét tervezési lJfObléIl1ákal iS J mint pé d.ául ,,110gya.n ábrá-
oljunl( algofltmusol<at objektum()kként" de olyan ()sztály- vagy objektums erl(cze
teket is, amclyel{ rugaln13tJa.n tervezésre utalnak. A lJfob él11a nélla fcltételel{ l._stáj[lt
is t(;lrta.lmazhalja, lll1clyekne]{ leljesülniük (e 1, mielőlt érteline lel111e alkalma.zn.
.. ...
a TTIlntdt.
3 A megoldás azokat a2 eleme]{et írja Ic viszo 1yaj]{kal, 11atás {örül(]<e] és együtt nűkö-
clési lellctőségeikkel ebyütt, amelyek Ielé])ítil( 3 tervet. Nem l(on {. ét tervet vagy
megv3.lósít[lst ad meg, mivel a minta olya 1, Ini nt egy slblon, all1.i kll]önféle llLlyze-
lekbcn a.lkalJ11a71at(). Helyette csupán egy. tcrvezés prolJlén13 elvont leí ását t)lZl0-
sítJa, és }10gy al. elemek (eselünkbel1 osztályok é objektul11ok) á]talános c rend,ezé-
se llog)lan oldja a7t meg.
4. A következmények a minta alkallnazásánal{ előnyei, illetve Jlátrányai. Bár a követl{eZIl1é-
nyckről ritJ(án esik szó a tervezési (iönléselc incloklásánál, mégis létfon.tosságúak a tLr
vezési alternat"'vák értél<elCsénél és an11al{ n1egér csében, ]1.ogy l11i ct 1 aSLna és J111
a hátránya a minta all(altnazásánal<. A ,J(övetkezrnények" gyal(ra 1 a tár]lely- és időfel-
használást érintő 11átrányol(la. vonat]{o nak, clc érint11eln.ek nyelvi és negvalósítási
kérdéseket is. Miután az újrallasLnosítllatóság gyakran fontos té!lye7{j az obj<:ktuJl1.-
központtl tervezénél, a 1{övet}<e7mények 11a.sznos infcJrmációka.t szolgájtatnak a rend-
szer rugalmlsságáról, lJővíU.1etőségérő vagy ]lor(loLhatósá.ga.ról. A }{()vetkezmények
felsorolása llatározott{n segít l11egérte11i és él tél(eln.. a7 e1(5nyöket és 11átrányol<al.
Ké7éSp()ntunl{ 11atá .OZ7a meg t n.t tekintün]{ mintána.k és tnit 11enl. Ami aL egyikJ1ek minta,
a másiknak csupán elel11i építőkocka · a kötet11en ezért igyel{eztün.1< a mintikra az e]vonat-
l(oztatás egy lJj7onyos szntjén összponlosíl3.n.i. A Progra111tervezési fni1'lták nen1 az olyan
Programtervezési minták
szcrkezetekről szól, mint a láncolt listák vagy a has"tótáb ák (kivonatok), amelyeket oSLtá-
lyokként kódolhatunk és így újra fe használhatunk, de nem is Összetett, teljes dlkalmazá-
sok vagy alrends7erek építéséhez használható terve etekről. A könyvben bemutatott ter-
vezési mi lták egymással egyÜttmuködő objektumok és osztályok leírásai, amelyek
test1eszabott formában valamtlyen általanos tervezési problémái oldanak meg egy bizo-
11YOS összejuggésbe1'l.
A tervezési minták megneve7ik, elvondLkoztatják és azonosítják egy-egy mindennapos
szerkezet kulcsfontosságu tulajdonságait, amelyek le letővé tes ik, hogy újrahasLnosltható
objektunkö7pontú tervet állí sunk elő. A tervezés. minta azonosítja a részt vevő oztályo-
kdt és példányokat, szerepüket és kapcsolataikat, iletve a fele ősségi körök eloszI.;isát.
Mindegyi { tervezési minta egy b1Zonyos objektumközpontu tervezés. kérdésre öss ponto-
s''t. Le" ja, mikor alkalmazható, más tervezési megszorításokat figyelembe véve lehet-e al-
kdlma7ni, továbbá ismerteti hds7nálatána ( következményeit es az előnyöket, illetve hátrá-
nyokat. Mivel a terveket elóbb-utóbb meg is kel valósítanunk, a minták mellett példákat is
nyújtunk C++ és Cdőnként) Smal talk nyelven, hogy 'llus7tráljuk a megvalÓsítás módját.
Bár a tervezési minták objektumközpontú szerkezeteket írnak le, gyakorlati megoldáso on
alapu nak, amelyeket a7 olYdn általános objektumközpontú programozási nyelvek, mint
a Smalltalk és a C++ beépítve tartalmaznak, szemben az eljárásközpontú (procedurális) nyel-
vekke (Pasca, C, Ada) vagy a dinamikusabb objektumközpontú nye vekkel CCLOS, DY'an,
SeID. Gyakorlati okok miat választottuk a Sm:11ltalkot és a C++-t: néps2erűsé b ü { állandó, és
mindenna )OS tapds7talatainl{ vannal{ velük.
A programnyelv választasa fontos, nliveJ befolyásolja a programozó nézőpontját. A mi min
táink SmalJtalk, illetve C++ S intű nye vi tulajdonságokat feltétdeznek, és ez a választás
lnegha ározza, mlt lehet és mlt nem lehet könnyen megvalósítani. Ha eljá ásközpontú nyel-
veket feltételeztünk volna, a kötetbe a...övetkcző neVŰ n1'ntákat .s bele kelleLl volna foglal-
nunk: "Öröklés", "Betokozás (egységbe zárás)" "Többalakúság" stb. Néhány lllintán {at vi
S70nt kö vetlenül támogatja egy-egy kevésbé ln'ndennapi objektu l1központú programozási
nyelv. A CLOS-nak példát 1 vannak úgyneve ett multl-lnetódusai, ame yek csökkentik az
igényt a7 olyan mintákra, mint a Látogató (Visitor). Pe sze s ámos különbség van a Sn1allta k
és a C++ között is, ami annyit tes ,10gy néhány minta könnyeb Jen kifejezhető az egyik
nyelven, mint a 11lásikon: ilyen pé dáu a Bejáró (Iterator).
1. Terve si mi ták Smallt I MV -ben
A Model-View-Controller (MVC) osztályhármas lKP88] aca hasznáIatos, hogy felhasznalól
felületeket építsünk fel a Smalltalk-80-ban. Az MVe n belüli terve7ési mintákra p'lla 1tv.a
jobban mLgérthetjü {, mit értünk a "minta" k'feje7és alatt.
A2 Mve hJ.romajta objektumot taI1alm 2. A Mode (Mode 1) az alkalmazás objektum, a View
(Né7et) annak ábráLolása.l képernyőn, d Controller (Vezérlő) pedig annak lnódját határozza
1. fejezet · Bevezetés 5
meg, al10gyan a felllasználói felillet váJaszo] a felllasználói bemenetre AL MVC előtt a el-
l1aszná]ói felületel< tervezésekor lajlamosak vo tak ezeket az obje]{tumokat egymásba olvasz-
tani. Az MVe szétválasztja őket, 110gy növelje a rugalmasságot és dZ újralldsznosF"tllatóságot.
A Mve úgy választja szét a nezeteket (S IDod.ellekct, 110bY egy elófizetés-értesítés proto-
l{olJt ]107 létre kÖZÖLtük. A nézctnel{ gondosl{odn.ia kell arró, 110gy megjelenése tükrözze
a [nodell ál1apotát VaJal1ány& or a modell adatai l11egváltoznal{ a modell értesíti a okat
a né7eleket: amelyek rá támaszkodnak, azok peciig lehelősébet kapnak rá, hogy frissítsék
magukat Ez a n1egközelítLs le11etóvé teszi, 110gy többféle nézetet kapcsoljunk egy modelI-
le , hogy különböző megjelenítésel{et b. tosítunk, emellett pedig anélkül l{é S zÍtlle ru nk új
nézeteket a modelilleol, hogy újraí +ná.nl{ azt.
A következő (1iagrarTI egy modellt és 11áro II l1ézetet mUlat. (Az egys7eruség kedvéért l(i
11agytuk a vezé lől{et) A modell né 1ány adatCrtCket tartalmaz a nézetel{ pedig egy táhlá7a-
tot, egy hisztc)gramot Cs egy tOl1a.dia.g +a 110t l1atároznak meg, dmelyek ezeket az adatokat
· 1 . k k .. 1 . c" 1 d k
JL cn ti meg U ome e ül0 _.O_._.OD.
A modell értesítI a né7eteket, amikor az értél{ei megváltoznak, a nézetel< ped.ig kapcs()latol
tartanak a modellel, 110gy elé jé]{ e7ekeL a7 értékeket.
Nezetek
/fl"" .......,...... .......... .............. ........... ................ ........... ............... .. ........1... ...,- .1" 11'-
-t.;Y:ablák.:::::..'. :&-'* .. ;::J......
.. ........ ]..,. ..........,......;.., .'I'1.,...;.........,..;...;............;...;.........L... ... Llill.....;......:. 'd..
,.......... .................................................,.....,.-....1-1.-1. .....-1. .......11 ... ......11 ... .......... ....
.,. .i\\': .. ..:.(;, .A .. N'II&R,-7.-;J.:;.' :=1.""R. ..:. . . . .. ..'
'. .0' a at\.,r- - _._----_. :.', .( ...
. "'0"'" ..,.".,....,. ".,..,."..".,.."....."""., .........,.............,.,......... ,..,..,. m. .
( ..... ."...;::; ... .: b ": I .'::'. ..,;.::,",.,. .:. ..........,........................... : !!! ,:",; ,":",":".... .
\'.. . ':., : .. ..... ...:::...:!. . .
\ . '..;:.8 .:... .... ";\1 ."?? ? .. '..
'I I . ,;...;.........,.,..,..... .. '"1'''''''' ,.,......\.."., .\...........,. )'\' "..\'\" .51.,
\
.... ..
.: \;. I..
.... .
\'. },\: . ':";..
..,
.1 '. .
II. .. .1.
. .
.. .... .. .,.
.. . . \
a {1/ .'"
.
//r;%<,
;,....-::"'-
. 'i.
a b c
x 60 30 1 O
50 30 20
z 80 1 O 1 O
t.\\
X
tW\
X ; I
' 1 1 1 1'.\\
m!' !
W >I 1
a c
modell
FelszíneseJl értékelve, ez a p61da egy olyan szerkezetet tükröz, am. elválas7lja a né eleket
és a modellt, dc alkallnaz lató egy jóva] áltaIánoabb prolJlémára is: objektu nak elválasztá-
sára. Így az egy objektulTIOl érintő változások több lnásik -a l<ihathatnak, anélkül, 11061)'
a meh,\Jáltozott objel{lU II ismerné a több.ek belső s7erkezetél. ELt a általánosabb szer (e-
zetet ifja le a Megfibryelő (Observer) tervezési nínta
6 Programtervezési minták
Egy 111.ásik tulajdonsága az MVC-nek, hogy a né7etek beágyazhatók. Például cbY gombokból
áBó vczérl6pult megvaló')ítható ÖSs7etctt nézetként, aJni be.;ígyazou g01nbné7etLket tartal-
maz. Fgy objektumvi7sg:íló [elh sználói felülete szinten áll lat beágyaLott nézetekhől, ame-
lyeket újra felhdsználhatunk egy 1 ibakeresőben. Az MVC a C0111positeVícw (Összetett né-
zet) oS7tá lyal tánlogatja a beágyazott nézeteket, ame y;1 Viewalosztálya. A CompositeView
objektumok Úgy viselkednek, mint a View objektumok; egy összetett nézet bárhol használ-
ható, ahol egy sinla né7et (view), de ezen felül taI1alnlazza és kezeli a beágyazott nézeteket.
Mindezt tekinthetjÜk ÚbY, mint egy olyan s7erkezetet, ami lehetővé teszi zámunkra, hoby
aL Összetett nézetek egészét ugyanÚ,gy kezdjük, lnint az egyes elemdket, de ismét csak azt
mondhatjuk, hoST}' a terv egy ennél jóval általánosabb problé nára is alkalrnazható, ami
mindig felbukkan, valahányszo csoportb akarunk foglalni objektumokat és Úgy kezelni
e7en csopol1ot, mint egy egységes objektllffiot. ELL az általánosabb s7erkezelel a Összetétel
(Composite) tervezéi m.inta írja le. Segítségével osztályhierarchiát hozhat-unk létre, amely-
ben egyes alosztályok elemi objektunlokaL írnak le (pl. Gomb), má osztályok pedig össze-
tett objektumokat (CompositeView), amelyek az ele ni objektumokból állnak össze.
Az MVe azt is lehetővé teszi, hOh'Y megváltoztassuk azt, ahogyan a nézet reagál a felhasználói
bemenetre, anélkül, hogy mÓdosítanánk a megjelenését. Például1ehct, hogy változtatni sze
retnénk azon, ahogyan a billentyűleütésekre re gál, vagy helyi dőugró menÜt Leretnénk
has7J1'11ni biJIentyűparancsok helyett. Az MVC a válas7rendszert egy ve7érlő (Controller) ob-
jektumba zárj,,; e vezédők pedig osztályhierarchiát alkotnak, JnChkÖnnyítve a új vezérlők
Jcészítését a már létezők alapjdn
A nézetek valamelyik Cont 'oller alosztály egy példányát hasz lálják, hogy megvalósítsák a kí-
vánt válas7stratébiát; eltérő reagálá") megvalósításál 07 egysLeruen lecseréljük a pé dányt egy
másfajta vezérl6re. AL is lehetséges, hOhY futásidőben válto7tassuk meg a né7et vczérl6jét, így
lehetővé tehetjük a nézet s7ámQra, hogy a felhasználói bLmenetrc másképpen válas ol jan.
Egy né7et például letiltható egys7erűcn úgy, hogy olyan ve7érlőhö7 rendeljük, a.mely nem
vezi figyelembe a bemencti eseményeket, így a nézet nem fogadja el a belueneteket.
A nézet-vezérlő visLony a Stratégia (Strategy) tervezési minta példája. A stntégia egy ob-
jektum, ami egy algoritmust <:épvisel. Akkor vesszÜk hasLnát, amikor statikusan vasT}' dina-
mikusan ki akarjuk cserélni a7 algor.tmust, amikor aL .lIga 'itmusnak s7ámos változatával
rendelkczÜnk, VdS'Y am'kor az algoritmusnak összetett adats7erkeLetei vannak, amelyeket
eg)!ségl1e szcrelnénJ Z3rnl
A7 MVC más terve7.ési mintákat is has nál, péklául a Gyá11ófüggvényt (Factory Method), hoby
negadja az ala pé tdmezett ve7ér1őos. tályt egy nézet számára, vagy a Dís ítő (Decorator) m in-
tát, hogy gördítűsávat adjon egy né7etheL, de a fő összefüggéseket a MVC-ben a Megfigyelő,
az Összetétel és a Stratégia tervezési minták adják mCh"
1. fejezet · Bevezetés
1.3 A tervezesi mint
I Irása
] !c)hryan írunk le tenrezési mintákat? A grafikus jelölésmódok, lllbár [ontosal< é5 lllsznosak,
nem elegendőek, liszen csak a terve7ési folyarrlat \7égtermé1{et llutatjá](, az oszt2.lyok és ob-
jektumok viszonyakénl All110Z J 110gy új +a}13.sznosítl1.3.SSU ( a -crvet, rTIuszá.j rögLÍtcnünk
a döntésejzet, az a]terJlatí,rákal és d.cJntéseilll< 1{()vetke7éJl)leit is. A konJ{rét péJdá]{ is fonto-
slk, mi\!cl sebítcnck abba.n, 110g)7 3. te.rvet működés l{özben lá.ssul(
A J;:önyvbcn a tef\'ezési mi 1tá.k3t egységes formában. íJ1U { le. Mindegyik lnintá.t sza (3.szak
ra ()SZlc)ttuk, amelyek a kövelkező sablonlloz igazodnak. A sablon egységes szerkezetet
kölcsönöz az nfoflná.ciól(nal<, egyszerúobé téve a tervezési lnin.tá]{ 111.egt3.nulását, összel13.-
S011iítását és llasználatát.
A minta neve s besorolása
A minta J1e\'e a D11.Jlta lényegétl«)7vetÍti röviti f()rJ11ában A jó név Jétfon.tosságú, ni-
vel a terveLési szókincs résLévé válik. A lninta bcsorolásdnak llal)já.t aL 1.5 részben
talál]lató vázlat adja meg.
CéJ
Rövid leírás, alTIe]y a 1{övelkez(5 kérciések (el foglalk()7il<: Mil csinál a7 ad.ott lerve7é-
si minta? Mi az értell11e és a célja? Milyen sajátos tervezési p oblén1.ára ad választ?
Egyéb nevek
A m.nta 111as, jól isrnert nevei, lla vannal( ilyene ( illetve a mil1t angol neve.
Feladat
ForgatókönjT\l, atnely lJ etTI II tat ja a tervezé')i prol)létnát és azt t 110gy 3Z osztályol{ és a.2
objektumok llogyan oldjá.k él.zl meg. A forgJtól(önyv t,cgÍl a 111inla következő, elvon-
tab]) leírásán.al{ megértéséllell.
Alkalmazhat6ság
Melye]{ a70k 2 11elyzetek allC)} az ad.()tt tervezési rninta 1]1{alma7]lató? Melyek a701<
3 rossz tervcl{, amelyek leváltását 3, l11inta l11cgcélozza? Hog)lan ismerhetől< fel ezek?
Szerkezet
A m.int3 osztálY3.in.3.1{ gr2.f1J<US szeJll.léltetése, az OMT-n (O})ject Modeling Tec11niquc
Rl)B+91 J) alapuló jel()lést 11asználva Egy ti tlm(íl«()(lés i cJ.iagraT11()kat C"interakcié)-d.i-
a.g a.makat") is ]1aszJ1álunJ< (JC]092, Boo941, 110gy szemléltessül{ 8. ](érellnel( és
együtlIllŰkc)(Jésck SCJfOLatát az objcktumc)k kcjZ(Jlt. A jel()lésrend.szert r[s7]elesen a R
f(iggelé]( .1.SJl1.eJteti..
Résztvevők
A7 oS7táJyok, iJletve ()}1jektuTl1()l{, amelye]{ részt vesznel< a terve7ési l11illtá]{baJ1, va1a-
lninl 1.Lok fc13.d"1.ta.i
Együtlmúkjjdés
Hogyan működnel( eg)riitt az o1JJel{tulnol(, 110gy végre11ajtsák feladatail(at?
Következmények
Hogyan tálTIogatja. a.z adott minta a l{ívá.nt célokat? Mik a minta 11asználatának Llő
Jlyei és 11átrányai? A rends7er mely szerke7eli e]enlej váltc}7tarllatj11]{ S7dbatton az
adott mintát ]las7oálva?
8 Programtervezési minták
Megva/6sftás
Milyen buktatók 3. kell ügyelni, milyen módszereket érdemes l1asználni d minta
megvalósításakor? Vann1-k nye vi sajátosságok?
Példak6d
Programkód-tö 'edéke 7, amelyek illusztrálják, hogyan valós"tható meg a minta C++
vagy Smalltall\.. nyelven.
Ismert felhaszná/sok
Valós rendszerekből vett pé dák, mintára. legalább két példát szerepeltetünk, kü-
lönböző területekről.
Kapcso/6d6 mint k
Mely tervezési mintá { kapcsolóc nak szorosan az adott mintához? Mik a egfonto-
sabb ]{ülönbségek? Milyen más mil1tákkal együtt cé]szerű llasználni az adott mintát?
A [iiggekkekben kiegészítő információkat talál1atunk, amelyek segítenek megélteni a min-
tákat és a l07Zájuk kdPcsolódó magyarázó leírásokat. Az A függe ék az :ltalunk has7nált
szakkifejezések jehTyzéke. Már említettük a B függeléket, ami a különféle jelö éseket Jnuta ja
be. Végezetül, a C függelék azon alaposztályok forráskódját artalmazzd, melyeket a példa-
kód.okba.n 11asználtunl<.
.4 A terv zési mi tkk talógus
Gyííjteményünk 23 tervezési lnintát tartdlmaz. Ezek neve é cé ja attekintésképpen a követ-
kező listában szerepel.
Elvont gyár (Abstract Factory) Kapcsolódó vagy egyrnástól fÜhgő objektu1110k családjá-
na 7 létre 10zásár CI. szolgáló felületet biztosít a konkrét osztályok megadása nélkül.
IlIesztö (Adapter) Az adott osztály felületét a7 l gyfelek áll' 1 igényelt e1ületté alakít'a.
E móds7er -el az egyébkénl összeférhetetlen felületű osztályok együttműködését b'z-
tosít11atjul(
Híd (B idge) Az elvont ábrázolást elvál.as7tja a megvalósítástól, hogya kettő egylnástól
rugget]enül mód.osítl1.dtó legyen.
,
Epítő (Builder) Az összetett objektumok felépítését függetleníti az áb ázol.ísuktóL így
ugyanazzal a építési folyamattal kü '.önbö é5 ábrázolásol{at hozllatunk létre.
Felelősséglánc (Chain of Responsibility) And szolgál, hogy elkerürük a kérelem küldőjé-
nek a fogadóhoz való kötését. Ezt úgy érjük el, hogy több obje {tumnak .s jogot
adunk a kérele n keLelésére. A fogadó objektumokat láncba á Iítjuk, amelyen a kére-
lem addig ha13d, a n"g el nem é' egy objektumot, ami képes a kezelésére.
Parancs (Command) A kéreimeket objektumba zárja, aminek célja, hogy az ügyre eknek
paraméterként különböző kérehneket adjunk át, ezeket sorba áUílsuk vagy naplóz-
zuk, illetve tánlogassuk d. úveletek visszavonását.
..
Osszetétel (Composite) Az objektumokat faszerkezetbc rendezi, hogy ábrázolhassuk
a rés7-egesz viszonyokat. A módszer révé 1 az önálló objekturnokat és az o Jje {-
tumösszet[te e]{et egységesen kezel11etjük
1. fejezet Bevezetés 9
DísZltö (Decorator) Az ()11jeklum()J]107 din.atnikusan tová.1Jbi felelősségi }{()r()]<et rende.
A l<iegés71tő szolgáltatáso]{ bi __tosít3.sa terén e módzer rugalmas altern.a.tívája az al-
oszlályok létfcllozásdnak.
Homlokzat (Facade) Igy alrendszerben felületek <-gy 11dlm-l7áll07 eh:rységes elületet l).z-
tosít. A módsze "rel magasab) s.__intű felületet 11atározunk lneg, amclyncl< révén az
ad.olt alrencJs7er kc)nnyelJben ]1.asználJ1., tóvá válik.
Gyártófüggvény (Factory Method) Felületet lIatáro' meh egy ollJe]{tum létrellozásállO } de
az alosztályokra bízza, I11elyil{ oS7tályt )éJdányos.tják. A gy/.rlófüggvényel{ nlegen-
ge(lik az oszlályoknak, l10gy a példányostást az alosLtályokra ru lá77á]< áto
Pehelysúlyú (Flyweight) MegosLtás révén támogatja a nagy finomságú objektunl()J< lc)me-
geinek 11atékony felllaszná ását
,.
Ertelmező (lnterpreter) Egy adott nyelv nyelvtanát ábrá7olja, illetve e1111ez aL ábrázolás11()7
értelme' őt bi7tos"'t, amely dDJlak alapján l(épes az adott nyelv m()ndatait megérteni.
Bejáró (Iterator) Az összetett obje{tumok eletneineJ( soros eJé.ését 3.11áttérben megJú-
vó ábr:.zolás felfed.ése nélkül bi7tosító nódSZCf.
Közvetítő (Mediator) Egy objel<tulTIut l1atároz meg, élmeJy obJektu l101{ egy llallnaLának
egytitt l1Űl{ödését irányítja. CVagyis e eket egyetlen objel{tumba toko'zuk be.) A mód-
s7errellaza csatolást l10zun]{ létre amelyben az egyes {)bjektllJl10k l{özvetlenül nem
llivatl(oz11atnalc egyl11ásra, a kö lük levő kapcsolatok pedig egYll1dst(JI függetJenül
módosíU1at(Jk.
Emlékeztető (Memento) Az eöységbe árás (beta {ozás, enkalJSzuláció) megsértése nél-
kül kinycri és röbzíti egy objektul11 lJelső állapotát, llogyaL későblJ e 1be az áJlapot-
lJa visszaá]lít]1.ató legyen
Megfigyelő (Observer) OlJjektumok l{özött egy-sol( függőséf3 kaJJcso]atot hoz létre, így
amikc)[ a7 egyjk ollje]{tuJTI állapota negváltozik, min(ien tőle függő o})jel{tull é rtcS"li1
errő és automalil{usan frissül.
Prototípus (Prototype) Prototípus példány használataval meghatározza., lllilyen típusu
objcl{tumokat kell létrehozni, a7 új olljel<tumo]{ létrel10zását pedih ennek a p ototí-
pusnak a lemásolásával állítja eja.
Helyettes (Proxy) Ac10tt objektumot képviselőn vagy l1elyő zón keresztül irányítunk,
l10gy szorosal)ban feIüh7elhessü]{ I11űl{ödését.
Egyke (Singleton) Egy osztályboi csa.k egy pélc. á.nyl engedélyez, és ell11cz globális 1107-
záférési pontot ad meg.
Allapot (State) Adott ol]Je {tum szá nára engedélye7i j 110gy llelső álla.potánlk megválto-
zásáva] rnegváltozt3.th .553 viselke( ését is. A7 o11je](tum. cl{J{or látszóLlg m()d.ostja az
osztályát.
Stratégia (Strategy) Alga itmuscsaládot Jlatároz Jlleg, melylJcn dZ ".lgoritmuso]<at
egyenl{én - egységbe .__árjuk és egymással felcserellletóvé tess7ük. F In.ódszer révén
a7 19orit TIUS a .elI1a,sználó ügyféltő lühgellenül rnódosítl1ató.
Sablonfüggvény (Tempate Method) Ad,ott míívelet algorit nusának Vá7ál kész-tj el, amely-
nek egyes lépéseit alosztályokra llházza áL ÍS'Y az alosztályok az alh0ritmus egyes
lépéseit felülbírá hatják, anélkül, hogy az alga .itmus sLcrlcezete módosu l1a.
o Programtervezési minták
Látogató (Visitor) Objektumo;;zcrkezel elemem vég ehajtandÓ JJlűveletLl ábrá70L a láto-
gató nl"nta segítségévei anélkül határu7hatunk meg egy Új műveletet J hogya bcnne
részt vevő elejnek osztályát meg l{ellene vá.toztatnunk.
.5 A katalo s ren sze
,
es
A tClvezéi minták részletességükben Ls elvonatkoztatási S' intjük szerintcülÖnbö7őek. Mi-
vel sok telve7ési nlinta van, s7ükéges őket vala nilyen úton-módon rendszere7ni. Ebbcn
a részben osztalyokba soroljuk a terve7ési mintákat, Íh"'Y livatkozhatunk a rokon nlinták
családjaira. A7 osztályba sorolás segft' a katalógusban levő lnintá c gyorsabb megtanulását
és új minták fe feci.ezésére is ösztönöz11et
Cél
létrehozási Szerkezeti Viselkedési
>. ,
Ertemezó
'«1 Gyártófüggvé ny ( Osztály) i lJ esltö
N Sabronfüggvény
(1)
Ervont gyár (ObJektum )jUesztö Felelőssé 9 lá ne
"
Epítö Híd Parancs
.
Prototípus Osszeteter Bejáró
Egyke Dfszftö Közvetítő
.
II' HomJokzat Emrékeztető
""O E
CD Pehelysúryú Megfigyelő
:::I: ::::J
i'
Helyettes AlJapot
eu
. .....
.c Stratégia
o
Látogató
1. 1 táblá at
TelVBzési mintak hatókör szerint
A tervezési mintákat két szempont szerint usztalyozhatjuk (1.1 táblázat), AL első d cél, ami
aLt lükrö7i, mit csinál a minta. A mintáknak létrehozási, szerkezeti vagy viselkedési célj lehel.
A lécehozási minták (vagy alkotú mmták) 'Z objektum-lét +chozás folyamatában érdekel-
tek. A szerkezeti minták a7 objektUlno (: és osztályok felépítéséveJ fObl lko7nak. A viselke-
dési. minták azon tulajdonságokat írják le, ahogyan az objektumok kölcsÖnösen cSy[ ttrnű-
ködnek és felos7tják a fde]őss(gi{üröket
1. fejezet · Bevezetés 1
A második szell1pont a hatókör, ami 111egl1atáro7za 110gy a lninta objeklLlmra vagy oS7tályra
alkalll1azllató-e. Az osztálYlnintál{ az osztál)To ( és az a.1osztályok Vis7011yá\T11 fogJal{oznal{.
Ezen vis onyok örökl[ssel létesÍlőd.ne]<, ezért stalil{llSak, vagyis ford.Ításl«()f rög ítettek.
_A_7 olljeklll nlnlin.ták ol]jektunlka lJCsola tokra. vonatkoznal(, alllc.Jyck flJldSid.ől1en. nleg\'á.ltoz
t3th3.tól(, ezért. jóval dinamikusdbblk. Majdnem minciel1 rn11ta llasznál valdlnilyen s7inlű
()rc)I<Iésl) így csak_ a ol(at a ]]linlál(at 11VJl1k "osztálYI11intál(nak', amelyek az osztáJyol{ l(ö-
.
zötti viszon.yok .3. összpontosíta.na.k. A legtöbb minta a "objektl1111." latókörbc tartozik
A Iétrel107ási osztálymi 1ták az o1Jjektllm-létrcllOzás fLladllát rés7ben az alosztályokra ru-
lláL ák át, míg a Iélre}-107ási ()11je]<lUmJl1intál( eg)' il1ásil{ objcl<lumra llagyják. A szerkezet
OS7l{11yminták öröklést h.asználn.a.k 3.2 oszt3.lyol{ előJllításál10z Jllíg a s7erkezeti objektum-
minták objel<lllmép"tés. mótlokat írnalc le. A visell{edési osztá.lln1intál{ öröl<lést Ilas7ndlnak
a7 alr()filmusok és vezérlési folYlmatok Icírá.sá110z, míg a viselketiési olJjel<tuITlnl1ntál{ d.zt
í jáJ{ le, 110gya.n dolgozik egyült objektumc)l< egy csoportja, llogy végrc11ajtsal1al< ehl)' ()lyan
felad.atat, an1elyet egyetlen objektll.l1 nem tlldnl önmagában 'Iégre]lajtani
A minták CS()IJortc)sításának kél mási1{ JllódJa le11et. Nél1á.11Y l11intál g)rakran egy"iltt 11lSZ11á-
]lln]{: ilyen pélcláu13.z Összetétel, lmlyct gYlkran ]-1as7nálun]{ egyiitt a Bejáró és a Látc)ba.l()
minláh.h.ll. Néllány mlnla vagylagos: a Prototípus mintát például gyakrln az Flv()nt gjrá lle
lyett lasználh.atjll]<. Né11ál1.)T l11int3 llasonló felépítést erednlén)re7, holott rn3.s-más célt szol
gálna.k: például az Összetétel és a JÍszítő minták szerl{czcti liiagrlnjai ebryt-or111ál{
A tervezési mintdl( rLnds-"Lrezésének másil< J11ód.ja, aJTI.il<o. 3.szerint cSOp()rl()ítjuk éSket,
11()GY a "Ka Jcsolódó Jl1iJ1ták" leíráslJ3.n mely más n1intákra ]lívalko7n l( Az 1.1 3.bra. ezeket
a \'iSzol1yok.at :'esti le grafil(usan.
Nyilvánvalóan so1<féle lnódon CSOpOltosítllaljuJ.c még a ler\Tezési r11111tál<3.t és a több szinten
'Taló gondoll{odás elmé]yít]leti rálátásllnkat 3.fra.) J10gy Init csináll1.ak, mil1en 11asonJ.ítanal(
egytnásra, és Jl1il(or l{ell al1{allnaz11i ől(ct
1. Hogyan old" k meg a terve ési int
t rv és. problém I at?
A lervelési tl1in.tál{ 5záIllOS olyan lnindcnndpos problémál ()]d.anak 1neg, aJTI.clycl\:l(cl a ter-
vezól\.. szclnlJctalá.lkoznal\., még110zzá sokfé eJ{é J. A]ább elsoroltunl( párat ezen proll1é-
mák köziil r Cs leírluk, l10gyan old.jál{ Ineg ezeket a tervezési mintál{.
Me fe ló o · kt mo ,eresése
A7 o11jektuml<ö7pontú lJ ogramok objektu 1101{ból éJ)lilnel{ fel. A7 objektumok JJ1.a.gukba fug-
la.lják minel az ad.at()kal, mind. el ad. tok on dolgozó eljárásokat, amelyel<et (tag)függvé
nyeknek, metód.usol,J1al(, vagy műveleteknek llívunl{. Az olJjel<tulTI akkor llajt végre egy mű=
vclctct r 113 az ügyféltől kérelem (vagy üzenet) érkezik
12 Programtervezési mintak
Egy objeklll1ll kizárólag akkor "lajtllat vég"e műveletet, l1a kérelem é "kezik l102zá} belso
adatai pedig kizá 'ólag múveletekkel válto tatható ( llLg. E7ek miatt .a megszorítások miatt
az objektum belső állapota egységbe lJarl zánJa J vagy.s nelll érl1et6 eJ. közvetlenül, és az ob-
JCktUTI1()n kvülrőllátllatatlan
Az objektumköz.P()]lt(] tervczés nelle7sége '11: ad.Oll rendszer objel<lumol\Ta való felbontásá11an.
rejlik. A felddat azért nehé' J mert sok ténye76 Jön számításba: az egységbe 7árás (betű 7ozás),
a "tlnomság" (rész etesség) "szcmcsé7ettség")) :,\ függőségek, a rugal nasság, a tej je sltmé ny,
a továbbfejleszt "lelőség, az ujrahas7nosíthatóság és így tovább. Eze { m'nd befolyásolják a fe -
11ontá.st, s()l<szor egy lnásnak ellent mondva.
A7 objektumközpontú tervezés lnódszertana szamos megközelítést támogat. A7 egyi 1(,
hogy körÜlírjuk a felad tot, majd főneveket és igéket társítunk hozzá) végül ezek segítségé-
vel Jnegalkotjuk a n1egfelelő osztályokat és lnűveleteket. De helye71etjÜk a hangsú rt
a rendS7er elemeinek együttműködésére és a [elelősségi körökre is. Vagy modellezhetjük
a valódi világott és az annak e emzésc kÖ7ben "talált" objekllJmokat foglal1atjuk rendszer-
be. AITól, hogy melyik meg (özelítés a legjobb, valószínüleg nindih vita fog folyni.
A tervczés során számos objel<tumol a7 eleJ11ző lnodellből szá.frna tatunk, de a7 ()bjel(lum-
központú rends ere 7ben végül hryAkran olyan osztályo { sLerepelnek) amelyekne ( " valódi
világban nincs mcgfelelőjük. EZLk egy része alsó szintű osztály, ami yen például a tömb.
Mások sok 7_al maSdsabb szintűck. A7 Összeté el rn' 1ta például egy olyan elvont re 1dsLcrt ír
le, amelyben fizikai mLf,felelővel nem rendelkezó objektuma (at kL elhetÜnk Lgységesen.
A valódi világ szigorú modelleLése olyan rends erhez vezet, ami ugyan bemutatja a ma va-
lóságát, dc a holnapét már nenl feltétlenül. A tervczés során fehneriil6 elvont Dgalmak
C"absLtrakciók") kuJcsfontosságúak a terv rugaln1assága szemponrjábó .
A terve ésj mint:'k segítenek a kLvésbé egyértelmű fogalmak 6s az azokat ábrá70Jó objek-
tumok felismcrésében. Például azok az objektUlnok, amelyek folyamatokat VJgy a goritmu-
sokat (épvise nek, lermés7etben nem fordulnak elő, megis fontos ré.s7ei a rugalmas min-
táknak. A Stra.tgi.a mint2 azt íJja le, hogyan valósítsunk meg felcserélhetó algortmuscsa á-
dokat. Az Alla Jot ffi'nta cgy adott egyd öss es á lapotál obje <tulnkénr ábrázolja. E7ek az
objLklun1ok ritkán találhatók meg a valós1.g elernzésével vagy a telvezés ko ai szakaszá-
ban; később kerülnek napfényre, amikor a tervet igyekszünk rugahnasabbá és ujrahas7110-
s"'tllatóbbá lenn i
A szüks' es obj kt m 1r. megker s s
Az objektuma I( n1(reLe és SZdrna a különböző ren(iszereJben nagyfokú eltérést Jl1.utatlldl.
Képviselhclnek mindent, egészen a hardvereszközökig, de át oghalnak nagyobb egysége-
ket is, a teljes alkalma7ások sz.ntjéig, Hogyan döntsük el, 10gy mi is legyen ehry objektum?
A tervezési minták erre a kérdésre i<; vá]asL - adnak A Homlokzat l11Ínta azt írja le, llogyan
ábrázoljunk objektl.uTIoiliénl egész alrendsLereket, míg a Pehelysúlyú minta azt, ho!:,y ho-
, . fejezet · Bevezetés 13
HeIY
Emlék ztető
, , "
Ep.to
a bejárás állapo-
tának mentése
r lIIesztó
összetételek
létrehozása
Bej' ó
az áUapothibák
el kerü I és e
Összetetel
Hid
feleősségek hoz-
záadása objektu-
mokhoz
gyermekek
számbavétele
összetétel en-
nek a haszná-
latával
Parancs
e elysú '
műveletek
houaadása
a nyelvtan meg-
határozása
a bejárás[ utak
meghatározása
[szftő
összetételek
,.
megosztasa
a [ane meg-
határozása
stratégiák
megosztása
Latogato
a külső, és nem
a belsö módosftása
I IF
ErtelmezD
müveletek
hozzáadása
elelósseglanc
állapotok
l'
megoszta sa
terminá1-
szimbólu-
mok meg-
osztása
Stratégia
I Kb et' o ...
-----.. össle1ett füg-
gö ségkezelés
1 MegfigyelJ
algoritmus
lepéseinek
meg hatarozása
,
Allapot
gyakran ezt
- használja
I SbX]
rtoIUS
dlnamikus
gyárbeallltás
Gyártófüggvény
megvalósítás ennek
használatával
Ivont gya
egyet]en
példány
Egyke
egvetlen
példány
Homlokzat
1.1 ábra
Tervezésim i nta-kapcsola tok
Programtervezési minták
gyan támogassunk l1.:lgyon sok, "nagy finomságÚ" (kis részletekctleíró) objektl mot Más
terve7ési minták kÜlÖnböl':ő módokat írnak le a7 objektumok k'sebb objektumokra v.llÓ
.i'
szétbontására. A7 Elvont gyár és az Epítő minták olyan objektumokat crednlényeznek,
anlelyeknek egyet en feladata más objektumok JétrehoLása, a Látogató és a Parancs minták
pedig olyanokat, anldyek egyetlen célja kérellleket intézni objektumokhoz vagy objek-
tumcs()portokI-1 oz.
Az objekt mf üle k meghat' rozasa
Minden objektwll által ]eírt művelet megadp a m(ívelet nevét, aL objektumokat, amiket pd-
ralnétcrként kap, és a mlÍvelet viss7atéréi éltékél. En hvjuk a illűvdet aláírásának C,zigna-
túta"), Az objektU111 műveletei által l11eghatároLott öSSZes ilyen aláírás halma7.a aL objektunl
felülete. A felület je]]etnzi .17. objektullll1ak kÜ]dhetó kérelmek teljes halnlazál. Bánncly, az
objektuln felÜletében lévő aláírás lak megfelelő kérelem elküldhető az objektumnak.
A típus egy név, ami ehry b'zonyos felületet jelent. Azt mondjuk, hogy egyobjektum "ab ak'J
típusú, ha a7 "ablak" nevű felületben értclme7ett műve]eteknek címzett kérést fogad. Fh'Y
obje <tum nak több típusa is lehel, és sokban különbÖző objektul1lok is oszto7batnak egy tí-
puson. AL objektum felÜleténe \: egy részét egy tí JUS jellemezhui, míg ct tÖbbit más típusok.
Két azonos típusú objektuDllak csak felületük egy részében kell egyeznie. A felületek tnás
fc1Ületeket is tartalma7hdtnak részhalmazkénl. Fgy típus akkor altlpusa egy másiknak, ha
a felülete tartalmazza a7 őstípus fe]ülctél. So {SZor úgy mondjuk, hogy az alLípus örö/U az
.
őstípus felületét.
A fcIÜletek alapvető fontosságÚak aZ objektumközpontú rendszerekben. Az objektumokat
csak a felÜleteiken keresLLÜI ismerjük. Nincs rd mód. hogy bármit is megtudjunk egy objek-
tUlnró!, vagy megkérjük, hogy tegyen valamit, ané kül, hO£:'7 a felÜletén át ne haladnánic
Az objektum felülete semmit nem mond a negvalósításáról - a különböz{) objektLlJno ( kü-
lönbözéS Jnódokon teljesíthetik a kéreseket. V .gyis két objektuIn, amelynek telj<...en lnás
a l11ehrva.lósítása, felületében te]jesen 111egegy czllet.
Ha e.s7 objektu 11ndk {ére]met kÜldünk, a mCívelet, aIlii végrehajtódik, fÜgg m'nd a (ére-
lemtől, mind a fogadó (vevő) objektumtóI. KÜlönbÖ7ő objLktU1nok amelyek ugyanolyan
kéréseket támogatnak, kÜlönbÖzhetnek az eZeket végrehajtó lnűve]etek megvalósításában.
A kérelmek objcktUI110k11()7 és 3-Lokn.al( egy műveletél1ez \ralé) futásid.é51Jen törtér1{5 1107Zá-
relldclését dinal11ikllS l{()tés 1ck \ragy késői kötésnek ne\rez.lük.
A késői kötés azt jelenti, hogy egy kérelem kiadása nelll határozza meg a konkrét mChJValó-
síÜst, egészen a prograIll futásáig. Következésképp írhatunk olyan programokat, amelyek
egy biLonyos fcliHettel rendelke/ő objektumot várnak, tudván, hogy bármelyi.k olyan ob-
jelnum elfof:,adja majd a kérelmet, amelynek megfelelő a felülete. A késői kötés emellett
megengedi, hogy egyforma fe üleue] rendelkező objektu 110kat futásic őbc.n egymással .le-
Iyettesítsünk. Ennek a helyettesíthetőségnek a neve többalakúság (polimurfi7J1JUs), és kulcs-
1. fejezet · Bevezetés 15
.011tosságú elv az objektumköz onLú rendsLerel{ben. Leszűl<:íti a :"eltétele7ések körét, al11it
az ügyfélolJjel<tuml1al-c lnás objcl{tumok ól tennie kell aLon kíVÜl, hogy támogatják_ az aciott
felületet. A több31akúság leegys7erusíLi az üg)lfclcl( neg11atáro ását, szétválasztja az objek-
tumokat, és lel1eLé5'vé teszi, 110gy azok }<a!1cs()lata ruláid6bLn módosu]jon.
A tervezési Jninlák azzal segítenel{ a feli.iletek megllatáloLá.sál)an, llOgy azonosítják kulcs-
elemeiket és a felületell áLllalad.ó adatol(at. :egy tervezési minta a' t is megn10nd11atja, l10gy
.mit ne leh:tyLink a felületbe. Az LJ1l1éke7letö minta jó l)élda e are. Leirja, 11()bryan Lárjuk egy-
ségbe és tnentsük egy objel{tum belső álla!)otát, 11u b y azt ffi3,jd 1{ésőb1J visszaál1ílllassul<- eb-
.be az álldpotába. A nlinta e ő'rja, 110gy az emlekeztető o11jektll1110 {nak kél felülctet kel]
mcgl13.tároznjuk: egy l(orlátozottat, am.i\'el. az ühyfelck tárol11atna]( és Jl1ásolllaLnak <...mlé-
keztetőkct J 65 egy l{itünteletlet, amil csa.k 3.2 eredet' obJe]{tum 113.sználllal az álla.pot elra]{tá-
.r", -' ll ""
rozasar" es ,rJ S7aa Itasara.
A tc '\'ezési ]11jnLák a ielülctel{ között ]<apcscJlatokat is Ineg11atá.rozzál<. SOkS7()f elvárják,
11{)gy eg)ICS osztálya (nak llasonló legyen a felülete, vagy megsz()rításokat 3.dna.k az oS7tá-
lyol( feli..ilelére. l)éldáull11incl a 1)ÍS7ÍlŐ J mineJ d Hcl)/cttes minta eJvárja a IJÍszílé5 és Helyettes
()bjel<tulTIol{ .eliiletétő , J1G b y mcgcgyezzene]{ a díszített, illetve llelyettcsített obje]{tum()k
felületével A Látogató mintáb3.n a 1 átogat() [Llülcténel{ lninden olJjektumc)sJ:tályt lnutatnia
l{ell, a.mit 3 látogatéJ}{ látogall1ato3.k.
obj ktummegvalós tások ghatarozása
Eddig lceveSellTIondtunk arról, 110 b 7 ténylegesen h.ogyan is határo7unl{ meg egy objc (tul110t
Nos, a.z objel{lllm InebTVllósít3.S1.t 3.Z osztálya llatárc)7Za Ille!:,. Az oSLtál)! adja llleg a7 ()bjel{tum
1)els{5 ad.atJ.il és áb ázolását, illetve a művelctel{et, aJl1.elyel<et az ()bjektum végre tud llajtan.i
OM1 alapú jelölésünk (amit l B függelékben. fog]altunk ()ssze) aL osztályoka - tégJalappal
á.brázol]a, féll{()vérrel szedett névve]. A m(íveletel( normál betűkkel szed.\re, a7 osztály neve
alltt talá.l11atóJ(. árll1ely adat, arnit az osztály határ()? meg, a művclLteJe után kövelke7ik.
Vonalak válasLtják el az osztály llevét a művelctel<lől, és a lnűveleteket az ldatol(lól:
Osztály év
Művelet1 ()
Típus Művelet2()
. . .
pé1danyVáltozó 1
Típus példányVáltozó2
. .
6 Programtervezési mjnták
A visszateré5Í típusok és változópéld.ány-típusok elhagyhatók, nl've nem tételezünk fe ta-
tikusan típusos Inegva ós"'Lási nye vet
AL objektumok egy osztály példányosításával jönnek létre, A2 objektum az oS7tály ebT}' példánya.
Az osztály Jcldá 1yosításán k folyaIIl.lta során .IZ os tály tárhelyet juttat az objektum belső
adatainak (amelyek változópéldányokból épülnek fel) Cs lOL árenddi a műveleteket e7e dlez az
adatokhoz. Az o57tály példányosításával sok hasonló objektumpéldány jÖhet létre.
Az alábbi ábrán a szaggdlott, nyílhegyű vona. egy olyan osztályt jelöl, ami egy másik osz-
tály objektumát példányosítjd, A nyíl a pé dányosítoll objektu nok oS7tályára mutat.
példányos'tó
-- ----------------
peldányosrtott
A már lélező oztályokból az osztályöröklés segítségével hozhatunk létre Ú' osztályokat.
Ha egy alosztály örökÖl egy szülőosztálytói, akkor a sLlilő által leírt minden adatot és művele-
tet meghatároz. Az alosztály objektum inak példányai minden, az alosztály és a s7ülŐOS7lá-
lyok ált<: l meghatáro7ott ddalot tartalmaznak, és minden műveletet végre ludna (. majd laj-
tani, anl'l ci7 alosztály és a s7ülőoszlá]ya' tudnak. A7.. a]osLtály kapcsolatot [üggökges vonal-
laJ és e b 7 l1ároITIszög b el álJráz()ljul(:
SZÜloOsztály
Múvelet()
/\
Aloszt y
A7 elvont osztály (absztrakt oSLtály) ényege, hogy általános 'elületet Ir le az alosztályai S22-
mára, Az elvont osztály legvalósítása egy részét v3gy egészét o yan művelctekre fuhá77a /'t,
amelyeket alosztályai h'1t.1f02nak majd meg, vagyis az elvont osztályból ne készíthetünk
példányt. Azokat a műveleteket, atnclyeket egy elvont osztály bevezet, de meg nem va ásít,
elvont m"veleteknek hívju\:, A70n osztályok neve, amelye {. nem elvontak, konkrét osztály.
A alosztályok finomíthatják V gy felülbírálhatják s7ülőoszlályuk viselkedését. Konkrétab-
ban, egy osztály felülírhat egy műveletet, am't a 7ülőosztálya határozott meg, A elülírás ('e-
lülbírálás) megadja a7.. esélyt az aloztályoknak, hogy maguk kezeljék a 'l..érelmcket a szülő-
1. fejezet Bevezetés 17
osztálya-}( lelyett A7 öröl{lCs lel1ctővé teszi az osztályaI, llldS ()SZlá yok egyszel kib6víté-
sévLl való megllatározását, így l<önnyen alkollatun{ obje](tum.család.okat, amelyeknek ro-
l(on felad.atlll< van.
Az e \7ont ()s7tályok nevét előlt betíÍve] s7edtük, hogy megkülönböztethetőel( Jegyenek
a konkrét osztályoJ{lól Dőlt lJetű jelzi az elvont műveleteket is. Néha a7 ábrán egy műve et
1ehTValósításaként álkód (pszeudoké)d) tűni]{ fel, ilyenko" 3 kód egy szal11árfüles dobc)zl)an
lesz, amit szaggatott vonal köt össze az őt megva]ósíté) m(íveleltel.
ElvontOszta/y
Műve/ef()
/\
Konk étAlosztály
Művelet() (}------.
-------------------.......... ........-
megvalósltási álkód
A mixin ("bcl(everedő" "beke\'ert'J osztály) olyan osztály, aIni illdsil< választllató felületet
vag)' s701gáltatásl nyújt más osztá yokn.3.k. Az elvont oS7lály110z hasonlóan ezt selll el1el
pcldányosJtanj. A l11ixin osztályokllOZ többszörös örö]<Jés s7iil<séh es :
LétezóOsztály
LetezőM űve1et()
Mixin
MixinMúvelet()
BóvltettOsztály
léte őMúvelet()
MixinMűvelet()
Osztaly- és felületörökl s
Fontos t l10gy m.egérlslik d különbséget az objektum osztálJ'a és típusa l(özött. Az osztály az
a(olt ()lJ.ektum rnegvalósításának nlódjál, vLlgyis dZ objektum lJe_ső állapotát és művelelei-
nel{ megva]{)sításátl"latároLza meg. Ezzel szernben a7 ()11jel{tum típusa csak 3, felületére utal,
vagyis azol{nak a 1{éreln1ekne]{ a 11dlma ára, lmire v5.la.szoln. tud. Egy objektl1ml1al{ több tí-
pusa lehet, és külünböző osztáJyú obje]{tumoh: ic; tarloz11alnak egy típusba..
18 Programtervezési minták
Természetcsen közeli rokonság van .17 osztály és a tírus kö ött. Mivel az osztályneghatá-
r077a aL objektum által végrehajtható műveleteket, az objektum típusá is meghatározza.
Ha a7t monujuk hogy egy objektum egy osztály példánya, beleéltjük azt is, hogy az objek-
tum tá nogatJa aL oS7taly által értelmezetl felületel.
AL olyan nyelvek, mint a C++ vagy az Eiffd, osztályokkal határozLák meg 3.7 objektum tí-
pusát é<> megvalÓsításdt is. A Sn altaik proglamok nem adják 111eg a válto7Ók típusát; vagyis
ct fordítá nem ellenőrzi, 10gy egy adott vált07óhoL rendelt objektumok ttpusaj ct típusai-c
a változó típusának. Üzenet küldésé lez meg kell néznünk, hogy a fogadá osztályának
JTIegvalósítása támogatja-e az Ü7enLet, de nem kell megnéznünk, hogya fog.1dÓ példánya-
c egy bizonyos osztáIynal(.
Fontos megérteni továbbá az osztályöröklés és a feJílctörÖklés (vagy altípus- étrehozás)
közötti különbséget is. Az osztályöröklés egy objektum megvalósítását ef.,1)'11.1sik objektum
megv:alósításának segítségével adja meg. Röviden, e7 egy olyan 11 óds7er, amivel kód és áb-
rázolás osztható meg. E7zeJ szemben a felíletöröklés azt írja le, hogy egy objektumot mikor
113.sználh.3.tunl( egy n1áSll{ llcJyett.
Könnyű öss' ekevLrni ezt a két fogalmat, nivel sok nyelv nem tesz egyé telmű külÜnbsé-
bel. Az olyan nyelvekben, mi1t a C++ és a7 Eitlel, a7 Ö öklődés egYS7e Te jelenti a felÜlet (s
a lnegvalósítás öröklését. Az általános felületöröklési mód a C-H--ban az, lu ny'lvánosan
olyan oSLtálytól örÖklünk, .lmelynek (tisztán) vi tuális tagfüggvényei vann.1k. A t' 57ta felü-
letö 'öklést Úgy közdíthetjÜ \. meg c nyelvben, 1 ogy nyilvánosan öröklünk th tá 1 dvont
osztályokból . A tis7ta megvalósítás- vagy osztályöröklés privát Örökléssel kÖLelíthető.
A S .nalllalkban az öröklés csak megvalósítás-örök ést jelent. B.1rmely osztály példányát
hozzá lehet rendelni egy váltazóho7, amíg a példány támogatja a változó értékén végzett
műveletet.
Bár a legtÖbb pragranl0zási nyelv ne TI tes7 különbsége a felükt- és mcbvaJósítás-öröklés
között, a gyak()rlatbn mégb van lnegkCJönbö7letés. A Slllalltalk prograJllozÓk általában
ugy tesznek, minth3 a - alosztályok altípusak lennének (bár van pár jÓl ismert l<ivétel
lCoo92]); a C++ programozók l edig elvemt osztályokban meghatározott típusokon keresz-
tül kezelik al o1)jeklumoh.ll.
Sok tervezési mInt függ ettől a kÜlönbségtől. Például a Fcklősségláncninta objcktul11ai
nak közös típusuk kell, hogy legyen, dc rnegvalósításuk általában (ülönbÖző. AL Összeté-
tel mintában az Elem (Componcnt) kÖLÜS felületet határoz neg, de az Öss_etétel
(Compos'te) gyakran közös megvalÓsltást. A Parancs a Megfigyelő, az Allapot és a Straté-
gia mintákat sokszor elvont oS7tályokkal valósítják meg, am.clyek fsztán felületek.
1. fejezet Bevezetés 9
Megvalósltas helyett felü e e p ogramozás
Az osztályöröldés alapjában véve cs...k cöY D1.ódszer, amivel a7 alkalmazás szolgáltatása.-
a sülő szolgáltatá.saival bővítjü]{ ]{j Segitségével b'Y0rsan llozllatunl( létre új o1Jje]{tll.llokat
egy ég. alapján. Kül()nöscbb munka. néll{ül ]{apllatunk új megval{)sításc)]<al, egyszcrúcll örö-
l«()lve a létcLő oszt3.lyol<JJól, anlire s7l1kségünk Vdn.
Mindazonalta.l3. lTI.egvalósílá újra]llSZn()sítása lnég nem lninden. Az öröklés az()n tulajd()n-
sága, 11()b'Y c6YGz6fclülct(í olJjel<llJ]JJ.ol< cSllád.ját képes megllatározni (á talábd.n eg)' elvont
osztályból örök{>lve) szintén fontos. Miért? Mert ezen alaplll a töl1lJalakúság.
f-I3, fie]mesen }.llsználjul( az öröklést (egyese]{ szerint :,zahályosarlJ, al(J(()r mindcn ddott
elvont osztályból SZár1JJ.a7() osztályosztozik l11ajd a szü Ő :'elületén. Ebből 3.Z követ]<e7ik,
110gy egy alosztály a muvelctck11cz csal{ adl1.3t, vagy feliilírJlatj3 a7()kat, (le szülőosztályá-
nak Inuvcleteit nem. tudja elrejteni Így /11irlderl alosztály tud 11ajd válaszoll1i az elv(Jol (JSZ-
t31y feJületé11en szereplő kcrcll11ckrc, amik így a7 eJvont ()s7tály allípusává válnak
Két előny is szárlnazil( abból, ha az objet<tumc)kal kizárólag az elvont uSLtályban ITlegllatá-
razott felület szintjén ke7eIjü1<:
1. Az ügyrfelel< egés/en ad.(Iig nL TI \Teszik figyeleI11be a fe1]laS7náJt ()11jeklllmok típusát
amíg d objcl\..lumok felülete a7 ügyfelek által várloak meg 'elel
? Az ügyfelel{ nem vesLik figyeleJTI.be az ezeket a7 objektun10kal fficgvalósító oszt:3.-
lyol(at. Csal( a felületet l11egllatározó elvont oSLtály(olca)t ismeril{.
Ez ann)rira lecsöl(kentj a7 alren(Jszcrcl( !<özötti 111egva.lósítás-fllggőséget, 110gy a l7 (ljra=
]1aS7n{)sÍtl"laté) objektumközpontú tervelső alapelvé 1e7 ve et:
Prog ra 1110ZZU nk a feliiletle a 'J1legvalósítás lzclyett.
Ne l{ünkrét ot,Ltályok példányaikéJlt ve7essük be változóinlcat} csalc 3.2 elvont osztáJyllan
lneg11atarozott felü letet l)()vÍtsül(. Al10gy látni fogjul{, ez a l<önyvben lévő terve [si minták
egyik löLös clve
IJersze -valallol a re 1dszerün1{llen péld.án)'osítanunk lell majd {on krét osztályo](at (vahryis
]l1eg kell ldnllnk t tényleges megvalósftást)J és a létrel107ási minták (Elvont f.yár, Epítő Gyár-
tófiIggvél1Y, Protor"pus és E'h:rylce) Cppc..n ezt teszil\: le11etővé Az o.hje]<tum-]étrelloás folyama-
tál1al{ el\r()nltkoztatásával ezel{ a Jl1.inták különl1()z(5 mé)d()kat n)'újtana!( 311+a, hogy egy felüle-
tet 3 lnegva]{)sításával anélküll(al)Cso11assu]{ össze a példányosításnál, l-l()bty a mcgvalósítás
mó(Jjár(JlltJd.OI11ásunk lenne. A.létreh.o7ási miJlták 11i7tosítják, 1 ogy d rcnclszeti.ink felület-, és
ne megva]ósítás-kc)zpOnlÚ legyc!1.
o Programtervezési mintá,k
újrahasznosf ás. sz rkezet k h szna ta
A legtöbben megértik az objektu nok: felületek} oSLtályok és az öröldés fogaln1át. A kihívás
igazán abban rejlik, 10gy alkalmazásukkal _lJgalmas, újrahasznosítható prog amo kat épít-
sünk} és a tervezési minták megmutatják, hogy ezt hogyan is kell.
II.
Oröldés vagy összetéte ?
Az objektumköLpontú +cndszerekben a képességek újrahasznosításának két legpyakrabban
hasLnált lTIód7ere az osztályöröklés és a objektum-összetétel (objcktun1kompozídó). Ahogy
aLt m_ár enllítettük: az osztályöröklés ar a ad módot hogy eby osztály lnegvalósítását egy
másik osztály segítsébLvel határozzuk meg. Az alob7tályokon .<eres7lÜl törtCnő újrallasznosÍ-
tást fehér dobozos újrahasznosításnak nevezzük. A ,,fehér do )oz'. a láthatóságra utal: a7 Ö 'öklés-
seI az alosztályok gyakran látják a szülő oS7tá y belső részeit.
A7 objcktU1TI-ÖS7etétel <17 osztályÖ -ök és alterna(vája. Itt a7 új szolgáltatások úgy jönnek
létre, hogy kisebb rLszekbőJ é Jítünk fel objektuJTIokat, hogy tÖbh szolgáltatássa rendel-
kezzenek. Az objektum-öszetételnél az öss7eépítctl objektumoknak jóllneghatároLott fe-
1üJettel kell rendelkeLniük. Az ilyen újrahasznosítást fekete dobozos ú. ahasznos'tásnak nevcz-
zük} mert a7 objektumok belső rés "ei láthatatla 10k. Az objektumok "fekete dobozokkéj t"
jelennek .11eg.
Az öröklésnck és aL őssze -eteInek egyaránt megvannak a lTIaga előnyei és hátrányai.
Az örökJődés statikuban, fordításkor történik, Cs használata egyértel1 ű} mivel közvetIcnül
a programnyelv támogatja; továbbá az osztályö 'öklés könnyebbé teszi az újrahas nostott
ITIcgvalósítás nódosítását is. Ha egy alosztály felülírja a n1űvdetek némelyikét, de nem
mindet! akkor .1 leszármazottak művelete 't is .1 egvá Ita ztath at ja, :eJtételezve, hogy azok
a felülírt műveleteket llívják.
De az oS7tályörÖklésnek vannak hát -ányai is. Elős7ör is, a 7Ü őosztályo ,,-tóI örökölt megvd-
lósításokat futásiclőben nem változtathatjuk meg, miveJ az öröklés már Fordításkor elddl.
Másodszor - és ez sok {al rosszabb -, a szüJőoszt-11yok gyakran alosztályaik fi7ikai megjele-
nés<...l is meghatározzák}egalább résL )en, Mivel az öröklés megengedi, hogy egy alosztály
betekintést nyerjen szülője megvaJósításaba, gyakran mondják, 1 ogy "az öröklés megszegi
az egységbe árás S' abályát" lSny86l Az alosztály megva]ósítása annyira kötód.k a szü16-
osná y lncgvalóstásáhoL, hogy a szülő megvalósltásában a legkisebb változtatás is a7 al-
osztály változását vonja maga után.
A megvalÓsítási függőségek gondot okoLhatnak .lZ alosLtályok újrahasznosítdsánál. lIa az
öökölt megvalós"tás bármely s7empontból nem felel meg az új fe adatnak, arra kCnyszcrü-
lünk, hogy úJraí i uk vagy valami meg :elelőbbel hc1yettesltsük a szüJőosztályt. Ez a függő-
ség korJáto2La a rugalmasságot} és végüJ az újrahasznosít latóságot. Ezt úgy orvoolhatjuk,
ha csak elvont osztályokról Öröklünk, ID"Vel azok általában semennyi vagy csak kevés meg-
\'alósításra vonatl<ozó réS7! tarlalmaznak.
1. fejezet · Bevezetés 21
A7 olljel<tum-összetétel clinalnikusan utásidőbcn -örlénik olyan objcktumokon l(ercsztül,
amelye]{ livatl<o7ásol<at s7ere7nel< más objektumokra. Az összetételhez szül{séges, 110!:'7 az
olljel<tumok iigy(.Jembc vcbyél{ Cgyll ás felülctét, amil1ez tigyelmesen megte vezett felüle-
tek ]{ellen.e](, amelyek le]letővé les7il<, 110gy lL objektumokat sc)l< másikkal ebyültllas nál
juk. A módsLLf előnye viszont 110gy 111.vel az obje :rtulllokat csak a felületükön l{e esztül ér-
l1.etjii]{ ej, nem s7egjii.l< meg az ebysLbbe . árás elvél. Bármely o1Jjeklumot lecseréll etúnk egy
Inas .laa fut[ sidóoen, a n/ g a tí!JllSai (egye nel{. Tov:tbbá, mivel fo. 7 übje <lL 101{ megvalósítá-
sa objeklumfeliilelt..k segítségével ép .\1 fel, sokka.llevesebl) lesz a megvalósítá.si függőség.
A7 objcktum-össLLtétclnek l11ég egy latása van a endszer sze I kezetére: a.2 osztályöröl{lés-
seI szemben segít a7 os tál)7ok cgysébbc z[.rásál)an és abban, 110gy azoJc egy feladatra össz-
pontosít11assana.k. Az osztá]yo], és osztálY]lie arclliá]{ l<icsik Dlarad.na]{t és ](evéslJé valós7Í-
nú, hogy }<e7elhetetlen s Ö "nye {ke d.uzzadnak. Másrészről az objcktulnösszetételen ala
pu ó tervezésben tölJb olJje]{tumllnk ]esz (}la oS7tályunl< Jevesel111 js), és a rendszer viel-
}<ed.ése ezek kapcsolataitói fügb ma.jd y nClll l)cdig egyctlen oszt11y 1 at[ rozza meg
EL vezet cI minket az objel<lum {ÖZPO Itli tervezés JnásodJ< a .apelvél1.ez:
HasznáijlA11.k obJcktutn-összetéteJt o::,ztálJ}ör"öklés hel)?et amikor cS{Jk le/let.
A legjobb dZ enne, l1a n.em.l{ellene új elemeket ]étrel1.o7nu11]{, 110gy vaJamjt újra fel]las7D.ál-
hassunk, és minden szükséges l(é})csségre sze '1 te letnénk, .l3 összepá ...osít3.n1nk a létező
objel(tullloka.t. De e7 rit zán tö ténik meg, mivel a rend.ell<e7ésünkre álléJ elemek tárházd
a gyak()rlarl)an solla nem elég gazdag. Az öröl{léslJől eredő újra 1asznosítllatóság viszont
kÖl1nye1Jllé teszi új elemek építését a réhiekből: az öröklés és az öss/ctétel tellát ebyüll
llaSLoálatosak.
A gyakorla dzonb3.n 3.zt 11uta.tja, l10gy a tervezők túl70tt eJős7e etette] 11aszn.álják a7 Ö Ö {-
lést mint lljraI-lasznosítási módszert, és a tervek sokszor újr llasLnosÍtl11tóbbá (és egysze-
rűbbé) v31nának h.a gya]{rabban ford.ulnánk a7 objektuo1-ÖSS. etétel11ez A bemutdtott ler-
ve7ési Illintákt)an minl majd.látllatJul{, az objel{tum-összetétel újra és újra fellJulc {an.
Képv selet
A képviselet (deleáció) d7 ()ss7etéle olyan erejű újral13sznosítási móds. erré télele, min. az
ötöldés rLie86, JZ9 l A l{é elmel{ ke7elésé11en ekkor két ol1je]tum vesZ részt: egy fogadá
objektum, és l képviselője (dclegállja), al11clyre a foga.dó m(íveletel(et 1Jllá.l áto EL aL a.losL-
tályol{ szülő (nek címzett 1(érelem-átirány"'tásá11o ]lasonló. e a öröklét,nél az öröl{öl lnű-
veletL { tnindig utalha.tna ( a fogadá obje {lUlnra, a l1 L t a C++-ban a this, a Smalltal (ban
a self változó valósJt meg. IIogy ugyane l a }latát,t érjük el d képviseJeltel, a fogaci.é) "álad.-
ja magdl t , a kélJviselől1ek, 110gy az átru lázott l11űvelet a fogadóra. utall13sso 1.
"-2 Programtervezési minták
Például a lelyett, hogy az Ablak alosLtálya lenne a Téglalapnak (mivel a2 dblakok téglalap
alakúak), az Ablak osztály fe használhatn: a Téglalap viselkLdését aLzal, hogy egy saját
fég alap pék ányvállo7óra Téglalap-szertí viselkedést ruhá7. Más szavakkal, dbelyett, hogy
egy Ablak Téglalap lenne, egyszLr(íen lenne eh'Y Téglalapj . Az Ablaknak mostantÓl kIfeje-
zelten továbbítania kel. a kérelmeket a Téglalap-példányának, pedig eddig örÖkölte volna
ezeket a m(í\'elcteket.
A követke7Ó ábra a7t mutatja, ahogyan £lZ Ablak osztály átadja a Teriilet műveletét a Tégla-
lap-péld.á nyndk.
Abi Téglalap
téglalap
........
T erület() <;3 T erület() 9
. I
I szélesség I
I I
I I
, I
I magassag
I I
I
return tég ala > Terüret()
return szé[esseg * magasság
AL egyszerű nyílban végződő vonal azt mutatja, hogy egy osztály egy másik osztály egy
példányára 1 'vatko7ik. A hivatkozásnak külön neve is lehet, ebben az esetben "tegLtlap".
A képviselet legfőbb előnye a7, hogy segítségéve] könnyen alakíthatunk ki viselkLdésekct
futásid6ben, é megválto7tathatjl kÖsszetételük 111Ódját. Ablakunk kör alakúvá válhat futás-
id6ben, Lgyszerúen kicserélve a Téglalap-példányt egy Kör-példányra, a TILnnyibLn a ég-
]alap é a Kör azonos típusúaJ<.
A képviseletnLk ugyanaz a hátránya, mmt altalában a tÖhb" objcktum-öss7etételi rugalnl<lS-
ságnÖvelő eljárás lak: a dinmnikus, erősen paramétere ett programOk.1l nehezebb megérte-
ni, mint a statikuabbakat. Vannak ugyan 'utásidejl háLrányai is, de az emberi tényezőt
é -int6 hátrányok lOSSLÚ távon sokkal fonlosablx:Jk. A ké )viselet csak akkor jó választás, ha
többet egyszerűsít, mint bonyolít. Nem könnyű szabályokat adni fá, hogy mikor ért emes
használni, mivel hatékonysága azon mÚlik, milyen környezetben basználjuk, és mennyi ta
pas7tabtunk van ct has7nálatában. A képviselet legjobban Lrősen stili7ált fonnába 1 használ-
llató vaf,:ryis a sza11ványos mintáJj,_ban.
...
Több tcrve7ésí minta használja a képviseletet. A7 Allapot, a St atégia és a Látogato minták
erősen függnek tőle. A7 Állapot mintában a7 objektumok egy Allapot objektumnak adnak
át kére lneket, aIni az adott objektum aktuális állapotát tükrö7i. A Str dtégia mintában a7. ob-
1. fejezet · Bevezetés 23
je]{tumok adott }{é .-elmet ru11áznal{ át egy objelctunlra, ami a kérelem teljesítéséncl( móclját
kélJviscli Egy objeklun111ak cS-lk egy állapota, d.e tö1Jl1 l1.ódszerc (stratégiája) is lehel d l{ü-
JÖ11hö7Ő kére]JJlel<llez. Mindkét l11inta célja, 110gy mel:,tVálto7lassa egy olljektllJll viselkedé
sét a.zzal, 110gy fficgváltoztatja az ()lJjeklunlolcat, aJJ1elye]{nel< a kérellTIcl{ct átacljd. A Látc)ga-
t() mlnrál1ao. a7 egyadott objel<tulllsze kezet InndLn clemén végrel1ajtott JllŰveletet mind_g
a Látogató objektum veszi álo
Más miJ1ták l<evésbé ha.sználjál( a (é!JV.SL elel. A Kc)zvetíléS 111inta egy obje]{tumot vezet be,
ami közvctíll11ás objektumolc közölt. Nél1a a kÖ7vetJtő objel(tum (Igy valósítja meg -l111UVe-
]eteJ<et, ]10gy egyszeruen továbbítja aLo!{at más obje]{'lumc}l<nak; lnás]{or llvatl(ozást is küld
magára, vagy is valódi kép,'iseletelllas7náJ. A feleJősséglánc lninta úgy kCLcli a kérelnleket,
]lOgy objekturnoh: láncán keresztül tová.1Jbítja azol<al egyik ()lJje]<tumtól a 1násikig. Né11a ez
a kérelem magával viszi a eretleti f()gacJ.() ()llje]<lUJnra \'31ó llivat {ozást, és ilyenl«)f a minta
kép\'iseletel 11as7D.ál. A I-Iíd 111.inta szétválasztja az L vonl fc)g"almat a Jnegv .lósltásától.
HJ a fogalom és egy ad.otl megvalósíLása szorc)san összekalJCsolódna.k, az elvont ábrázolás
egys7erlíen lLl11ál]lat át Jl1Űvelete](et az adott lnegvalósílásrt.
A ké )vise et szélscSséges pé]d.a az olJjektu 11-összetétel "e ami dzt mlltdlja 11()gy a7 örö]{]és,
mint kód-újra 1asznosítási negoldás, mindig llelyettesítllető objektuJJJ.-összetétellel.
Öröklés és parameterezett tipusok
Egy má.sik (nem szit,0rúan objektLlmkcjzponlú) eljárás a szolgáltatások újralldsznosílására
a pa améterezett t[pusok 11asználata, a.1niket gencril(us \1 dgy általanos programozási alegységeknek
(Ada, Eiffcl), illelve sablonoknak (lemplate, C++) l1íVlJnk. Ez a tnÓdszel cgl típus mLgllatár(Jzá
sá tes7i lelletC)vé ané1kül., 110gy t1linden áltaJa. fe 113.szná.lt típust lTIcga(l.nd11k. A I11egl1atáro7at-
lan típusok'1.t pa ra l11éterekkérzl látjuk alIas nálat] elvén. IJéldálll eg)! Lista osztályt clemeinLk
típusávll paranlétere7Jlelünk. Ahllo , II ogy egészek egy listáját vezessük be, lZ "integer)' lí-
pust adjul{ át pa.ramétcrl(ént a paralnéterezell tí.I1USÚ Listá11ak. I-Ja egy kara <tc "lánc objcl(tu-
mokból álló lislál szeretnénk 111egad.ni r a "String" t111ust 2djllk át pa.ra.1nelerl(énl. A nyelvi n1eg-
vaJósitás a lj sta os ztálys3.blon. testreszalJott változatát kCs7'ti el miJld.en elenltípusllOZ.
A pdranlétere7ett típllsok]{a.l egy h.3.rm.3.dik lnódslclt l(lptunl( (a7 oS7lályöröklés és az ob-
jcktul11-összetétcl mellé), ame1lyel (Jl)je}<lu m kÖ7pontú . enclszerel{ viselkedését é lJítlleljLik
[el. S()kféle tervet nleg\7alé)sít}1atllnl( e 11.3.rom lnódszer 11asználitáva.l. lIa egy rend.ező eljá-
rásn.al< para.méterl<ént meg szcrctn6nk aclni, 110gy milyen nlűveletet h.asználjon J.Z clcmcl{
összellasonlílására, ezt l kc)vetke7ő eS7J<özö],J(e] va 1 ÓSítl1.3. -juk lncg:
1. alosLtályokkal mcg\'al()sít()ll művelet CSabJol1függvén.y fe 113szná.lása),
2. egy olJje]<tul11. ){ötelezettsége, amit ct rendező cljárásnlk átacilln]( (Stratégia), V3.gy
3. egy C++ sablon vagy Add állalánc)s prograt110zási alegyseg 3.rgumcnluI11a ll11i meg-
határoZ7a az elemek összcllasonlítására szolgáló függvény nevét.
24 Programtervezési minták
A fenti mÓdszerek között lényeges kÜlÖnbségek vannak. Az objektum-összetétel segítségé-
vel mef:,rváltoLtathatjuk a futásidőben létrejövő viselkedést, dc kö7vetettsLgre van szükség,
ami néha kevésbé hatékony. A7 öröklés segítségével alapértelmezett .negvaI6sításs.1l lát-
hatjuk el a műveleteket, amit 11ajd a7. alosztályok fclülírhatnak. A paramélerezett tí 1usok
segítségével megválto7tathatók aZ osztályok által használt típusok. Dc sem aL örÖklés, sem
a paraméterezctl típus nem váltoLhal futásidőoen. Hogy melyik megközelítés a legjobb, az
a terven és ct megva.lósítás ]negsz()rításain múJil(.
Az e könyvben leírl minták egyike sem foglalkozlk a paraméterezctt típusokkal, bár eseten-
ként használjuk Ininták C++ megvalósításának testreszabására. A paraméterczett tí Jusokra
semIni szükség az olyan nyelvekbcn, mint :1 Smalltalk, amelyekben nincs fordítási idejű tí-
pusellenórzés.
F tas- és ordítási id jú szer" etek öss e asonlítása
Ebry objektumköLpontÚ program futásid.ejű szerkezete gyakran kevés hasonlatosságot mutat
:J kód szerkczetével. Fordításkor a kÓd szerkezete statikus; meghatározott örÖklési kapcsolat-
ban ál]ó osztályokból áll. A program [ulásidej(f szerkezet<: ebrymással társalgá ohjeknJillOk
gyorsan változó hálózatából áll. Valójában a két s7erkezel ehrymástól nagyban független. lIa az
egyikből szeretnénk megérteni a másikat, az olyan, mintha aL élőviJág dinamikáját s7eretnénk
J11egértcIli IJllsztán az állatok és J1övén')'eJ( renclszertanl Icírásál1ól, és J()[clítv3..
Vessünk egy pillantást az objektumok összesítése (aggregáció) és ismeretsége (acquaintance)
közöLti különbségre, és hogy mennyire máshogyan nyilvánulnak meg fordítási és futásid6ben.
Az összesítés azt sugallja, hogy a7 egyik objektum a másik tulajdonában van vah'Y" felelős érte.
/
Altalában úgy 111ondjuk, hogyegy objektutn egy másiknak tulajdol1oa vagy része. Az összesí-
tés arra utal, hogy az Üss7esített objektunmak és tulajdonosának egyforma aZ élctideje.
Az iSllleretség arra. lltdJ, l1.ogy egy ()lJjektunl egyszerűen trici egy nlásil<ról. N él13. az iS]11eretsé-
gel .,asszociációnak" vagy "has7náló" kapcsoJatnak (usmg) is hívj1k. A7 ismerős objektumok
kérhetnek mlÍveletekct e,srymástól, de nem felel6sek egymásért. A:z ismeretség gyengébb
kapcsolat az összesítésnél, és sokkal lazább összefüggést feltételez d7 objektumok közÖtt.
,
Abráinkban a sima nyí1hegyű vonal ismeretséget jelent. Az a nyíl viszont, amelynek végén
rOJnbllSZ találllató, ()sszcsÍtést jelöl:
I Osszesf Ő
1<> összesítettPéldány
.1 Összesftett
1 fejezet · Bevezetés 25
Az összes1tést és lZ iSll1cretségct l<önn)'ű ()sszel{e\'erni, tllivel gyakran ugyanúgy ,ralé)sítJul{
J11eg őket. A SI11alllalkbin Illinden vállaló 11.ivatkozá.s má ()bjekttlmol{ra, a progralTIozási
nyrelv neDl tesz 1<lilön.1Jségct összesítés és ismeretség ](ÖZ()tt. A C -I--I--bln az öss7esítés rneg-
\7a]ósít3.sa ta.gváltozÓ-l)éltlán)'()kkal l(Jrténi1<, d.e gyal{rabban lc)rlénik a megvalósítás olya.n
mutat{)kka] és ]-1ivatl{ozáso]{J(a.l, amelyek péld.ány()](ra mlltltna]{. Az ismeretséget is Jlluta-
té}kk3.l és 11jv3.tJcozásokkal valósítjuk Jl1eg.
Végs(5 sorc)n az ismeretséget és az összesítésl iI1I<áll11 a cé1 113.tár()zza. meg, nelll kifejezett
Jl)re1vi eszközök. Talan l1c11éL fclislnerIli a l<üJc)nllséget a [orciítási idejű s7erJ{ezet]Jell) (le
mégis fc)nl()s. ÖSS7es1tő ]<alJCso131})ól általáL)an kevesel)}1 \'a11, ele (]zok t.arlósa1J1)ak: az isn1e-
retségekt1éJ. A.2 iSln.eretségc.l( ezzel szemt)en soJ<I(al gyal<r3 b1Jan létcsLi 1 nek új ra és úJ ra, n.é-
lla csal( egy művelet erejéig Jéte7ve. Az iS111cretségek dinatni1<usa11113k is, így ncllczcbb
a7()kat 111.egt-lláJn.i a forráskódban
Ilyen kiilöt111ségekkel a lJrogram fUlásidejű és fc)rdítási idejű szcrl<czelélJen világos, ]1ogy
a Jcód lleID fogja felfed.ni a rencjszer teljes nllíl{ödését. A renu.szer futásidejű szerkezetét in-
l(áblJ l lCf\ T e7é5, mint 1 nyelvadja l11eg. Az objekltJmc)k és tfl)USlik közti k;tpcsolat()kal nagy
go 1dcla.l kelll11egtcrvcLnllnl( mert ezeJ< 111tározzál{ meg, l11ennyire je) vagy rossz a tlltásidc-
jtí szerkezet.
Sok tervczési I11intálJan (féSJeg arnelyel( objel(lUrTIszinten műJ<ödt1e]<) látllató 3. ford.ílási és fu-
tásidej(í s7erl<e7ete]{ közti kiilöl1bség. A Összetéle] és a Díszítő l11intál( l<üli-Jn()sen 11aSZn(Jsak
a bOl1yollllt futásidejű szerke7ete]{ építésébe 1. A Mcgfigyel{5 ()lya]l fLltási.deJű szerl(ezetcl(ct tar
tdIllllZ, amelye1{et g)T3.l{ra.n nelléz megérteni a n1iJlta iS]l1.erete nélkül. A felel(5sséglánc S7itltén
olyan l<OJllffitlnikációs 111inlákal ered.ményez t al11iket az öröklés nel11 nlllt-ll Ile. A futásidejű
sLcrkezetek állllát)an ne]11 látszanal( tisztán a kódb{)l, lmíg l11eg n.erll értji.ik a rninlákal.
Vá tozásra terve e
A újra laS70()sítlla.t()ság lculcsa lZ (lj igények és a létező igénycl( váltc)zásánaJ{ t11egérzésé-
ben r<.:jlil{, és abl)an ll()gy úh'Y tervez7ii]( n1eg rcncl.sLcrünket, Jl()gy' (J.Z ennel( Inegfclclőcn
fej 1 ()(i 11essen.
Al1JlOZ ll()b'Y ()lyan reJ1dszert tervczzünl<, aIl1i l váJtoz{lsoknal( is 111cgfclel, fl b Y)'elem11e J<e]J
ven nü11]<., Jlog)l (] rcnclszcr n1ilyen váltc)7:áso1(on ](eJl 1113 jJ, llogy álessel1 éJ etében. Az olyan
terv, ami nCl11 \lcszi figyelemlle a válto7ásokal, az a.laIJoS újrdlervezés ]<ésll1)lJi zül(.ségcssé-
génelc kc)c]{ázatát rejti. A vá.ltozásol( 1()Z()lt el(5f()f(llllJlat osztá.lyok új nlegl-lllár(Jzása és új
l11cgv"a.lósítás;1, az ügyfél váll()7ás1, és lljratesztelés. Az újrllerve7és a [)[ogra.nlrcntlszcr szá-
mos részét érinti, és { 'lárat1an változá.sol( ki\llel néIJ(ül1<öltségesek.
A tCf\'ezési minlák segítségéve] ez clkcrülllctő segítségül{ke11)iztosítlla.t.juk ll()bty a renclszer
fnegl1atározott módol(on 111(}(J.c)sÍtllatC) Jegyen. Mil1dcn teI\lczési mintá11aJl va.o.l1.3.k 3. rentl-
szerszerkczctnek ()lyan réS7ei, anlelyek a többitől függetlenü 1 változtatl1atók, eZZellé\Te el-
lenálléJl)lJá a ren.ciszert egyes változásrajtál(l<al s7emben.
6 Programtervezési minták
Al. a]ábbaikban leÍItuk az újratervezés néhány gyakori okát 1 valamint :lLt l hogy az egyes
ter\rczési nli11t3.}, mil)len Jllegolt]ásl ad.11al( ezcl(re a 11rolJlél11ákra:
1. OIfelttltI1IétreIl()zása kiJjezeft osztáIJ)nle[!;a{lással. Ha egy olJjclclum ]étrellozásánál
megadjuk az osztály nevét, az egyetlen rnegvalÓsításra korláto7, és nem egyfajta fe-
lületre. Fz (] l\.orlá tC)7:ás })()n )l()l ítl13 tj a a késŐL)lli változta tás()kat. Elkerii léséllcL. k()z-
vet\Te 110ZZlJI< létre az ol)jektu111.o1{3l.
Tcr\ezési Jl1intál(: Elv(}ot gylr, G)lártófllgg'/én)7, ])rototílJUS.
2. KonkJ-ét műve!etekre támaszkodás. Ha konkrét rnűveleteket adunk meg, a kérelem
cg)lfajla ](ielégítési nl {)dj3.ra. sz()rÍtl{ozunl<.. A Ineg\'áltoztatllllltla.nllll({)(i.()]l ](érclmek
mellé5zésével kC)]lnyelJl)é \tálj]( l kérelem kielégítésének T11egv.áltoztatása lIlinci fC)fCií-
tásl{or, Il1iJl(I flltásidőlJen.
, 1 ervezési fllintá]<: FeJelősségI3 nc, Parancs.
3. Fl:igg&ég a JltJldl)e1- és l)r()glCll1'lkö}11..JJezett61. A l{ü]ső, opcrá(ié)s rendszer] és 3.11(3.1-
l11.a7:ás-program.ozási felÜletek (APT-k) külÖnböznek a különböző hardver- és prog-
ralnkörnyezetekbcn. A kÖrnyezetfÜggő programot nehezebb más környe7.etekhcL
illeszteni. Még az is lehet) hogy nehézzé válik a programot naprakészen tartani az
eredeti környezetében. Ezért fontos l hogy rendsLcrÜnkninél környezetfüggetleneb-
bé \lál j()Jl.
'1ervezési min tá]{: El\ront gyár I IícL
4-. FÜgg,ő.séf{ az objektumok ábrázolá..o;;ától és mcglJalósításától. A70k az ügyfelek, akik
tudják, hogy az objektul11ot hOhryan ábrázoljuk, tíroljuk, he]yezzük el, vagy valÓsít-
jllk rneg l lehet, hogy változásokra szorulnak 1 ha maga az objektulll is változik. Ha
ezeket lZ információJ<at elrcjljü]{ lZ iígyfclck e1 ől, l1em kell 3 n11)Tit váltc)7tatnunk.
lervczét,i mintá]{: Elvont b'Yár, Tlícl EI11Iél<eztető, Helyettes.
5. A Ip, o ritm i/;:.us ffil..i;{iwJl!,ek. AL algoritmusok hatékonyságát gyakran utÓlag finomhan-
g()ljik, kilJővítil< {51(et .vag}' ]ecserélik a fej]esztés és újraJlasznoílás sOf3.n. Az()k az
objektumok, amelyek egy ilyen algoritmLlstÓI fÜggnek, kényte]enek les7nek rnegvál-
tCJzni, ezé11 iz()klt :12 a.lgorit!11usoJ{3.t, ame]yek \ralószínűleg m(g fc)gn.a.lc vált{)zni, el
kell kiil()n íteni.
,.,
lervezési 111intá]<: [l)ítő Bej{lré), StratégiiJ Sal11onfligg\7én)r, Lát.ogalé).
6. 5'2:01'05 csatolá.,-, A szorosan összekapcsolt osztályokat nehéz elkülönítve felhasznál-
ni, nlive] függnel< egYlná.stól. A szoros CSll()ás oszr}lalat]an rcnd.szerel(llcz \lezet,
l]lOI nClll vállc)ztatllatlln]{ \lagy törölllelüo.l( egy oS7táI)rt . rcn(1szer11lil SZáI110S lnás
oSZtá.l)7 nlegértésc és átírása. nélklil A re110szer ne}lezcn átlátl1ató más ren_d.szLrrc
nel-le7en tvilleté5 és alig kezelJlet(i masszá,rá válil(
1\. laza cSlto]ás növeli lnn.3.k esélyét, l10gy Cg)l ()SZt3.ly önnlagál1an is fclh1.sználll/i.tó
lesz, és llog)r a renclS7el11(önnye1111 lesz me gldnultl.i, más rend.szerre ál vin ni, l11Óll{)sÍ-
tlJ1i és l(il)(j\Iíteni. A tCf\Te7ési lninták ()]yan eljárás()](]<aJ scgílil< a laza csal()lásii rerlcl-
szereket, Jl11.nt a.z elvc)nt csa.tlJlás és a rétLgezés
'let\lezési minták: Elvonl bryár .-Iícl, elelősségl:in(, ])arancs, 1 ]()nllokzat Kc)zvetttő,
Megfig)le] ().
1. fejezet · Bevezetés 27
7. A 111Űködés kib6vítése aloszti{
}}()IJk
al. Egy OUjCktllffi testreszalJása al(JSZlál)rC)]{]<
11
l1Cllll11indig l(c)n nyú fe laclat. Minden II j osztál )lll
lk egy rögzít.etr nlcgv
il()sÍtásllOZ kell
ig
170(lnia (el(51(észítésl(or, lczáráskc)[ stl).) > Egy alosztál)' Jl1egl1atároz5.s[tlloZ a s
li léJ
Il1élyrellató megértése szül<séges. Péld3.l1] egy
mCÍ\7elel felljlíra.sa. talán egy másik fc-
IliI írását is ]ll.aga lltán \'Onl13t.ja, V
lgy le]let, }lOgy cgy1' fellilírt művelet sZl\l(ségcs egy
()röl{(51t 111-Lívclelllí,rásáJl0Z. Továl)bá az 3.loszlál
l()J{ létreJlozás3 (J.Z oszlályo]( szánlá-
nal( robi1aJlásszerű l1övel(ecléséllCZ is vezelllet, 1ni\leJ l11ár egy eg)7szeríí !1ő\rítés is le-
het, 110gy tÖ}Jb új a.losztály t)evezetését l<ö\Tctcli 111Cg.
Az objeklll111-(j
szelétej [ll taJ állan t a }.céJ)\risclct te] jes egészélJel1 rugalJl13S altern
ltí'73-
kat ]{]11álnaJ
3L öröl(lés I-lel)7elt
l v
ise11{edéscl\.. l(ialaI(ílásár
l. Egy7 a.ll(
lI111a.zásll()7 Jllár
létező 01JjLkllIIl1()k ()sszeépítésé\Tel J (lj
llosZláI }T()k 111egl1.3.tározá.sa nél kü 1 ;:lci}l.a1lJl1.!{
lJj sz()]gá1tatásokat. Másrészről az ()tJjel<tufl1-összctétcllúlzott l1aSZ]lá1ata ln.cgncllezÍl-
llCti a sLcrkezet Inegértését. TöL1IJ tervezési minta ()J)Tall. tcrvcl{ct creci.Jl1éJlyez, alJlC-
1)7ektJen testJlez áJló szolg3.ltat.{ls()lcat 110711atun!{ létre csuIJán eh:ry-r alosztál)r lllcgllatá-
roz3s3v
ll
míg a 11élcián)'()kat létező oSLtál)I()]( ()sszelételével j.llítjul< el(5.
l
crvezési nl]Jltá]<: 1 líd
]
elLlősséglánc
(jsszetétel
Díszítő
Megrig)leJ{5
Stratégia.
H. ()
\.ztáIJ,'ok kérlJ J ell1tellell Inódosítá
\.a. \T a . n ,
lmikor ()l Y
lJl ()sztál}7t l(cll 111eg\rá 1 tc)ztat-
nllnl{, aI11il kén y -rel]11esen. le 1ctctlt,n.
1
llán
l forráskódra. lenile s/:lil<ség
dc nem áll
renele 11<ezésiln.krc (pél(láu 1 em ' flleg\Tás3.rolI13 ló osztály:lC()]l")lvTtárll[ll)
V3.g),r l)árJ11i ly
el1
\lá]tozás rengeleg
1IoS7tá]y ]l1.egvá.Jtoztalás{lt \T()nJl:Í Il1
lg
l ut3.n. A lervezési Illinták
ezel<re az esctcJ.crc is íl(i.n
lk lItmutatást.
Tervczési minták: Illesztc), l)íszítő, L(ítogató.
F zen példáI( jÓll11l1 t
lljál{, 11()b7 a tenrezési l11intál< ll()g)la n segít11etnck
l pr()granl rtJga.ll11.a.-
s3.b1J3. tételélJen. Azt, 11{)gy ez a rugallna.sság menJl}Tíre fontc>s,
lZ építeJltié5 11rogratll jellege
dc)nli ej. T.,áSSlll<, l10g)lan 111(íköd.Jlel< a tervezési rnintál( ]-lár()!11 elég tág progr
l.nlCS()I)()rtI1
ln:
az
11k3.l111azásol(ban,
lZ eler11kés71ete.kbcn. és a keretreI1d.szerekben.
Alkalmazasok
Ha ül)'an al]<aI111azást íJ1Jnk, l11int l)élcJ.álJI egy sz()vegszerl<csztő \fabry egy tá111áz:atkczclő,
ikk()r
a /Jels6újrallasznusíllléll()ság, a 1<arlJan.t3.11Jlatóság és a fejleszt11et()ség nagyc)n fc)ntc)sak. A lJclső
(ljr
ll13.sznosítll
lt()ság 11i7tositja, ll()gy ne kelljen
lnnál tölJl)C1 teI\'CZlli és III egva 1 ÓSJtd.n i
mint
alllil ]11llszáj. Azol\. a tervezési l111nták, atnel),<:J{ csökkentik a függ(iség<:k<:l, n()velik a 11els(
úJ-
r:allasznosíulalóság()t. A la7a csatolás 111cgnÖ\.7eli
lnn
11{ esél)/ét, llogy
egy ()lljel,luln osztá.l)ra
cg)!lilt lllti Il1Űkc)(!J1j töl)ll l11ásil(kal. }JéldáuJ 3Jlli1{or ]{izá.rjul\. az 3CJ.C)tt DllíveJetektl1! vale) fliggc)-
sége]{et a.zzal, llCJg)! mintlen 111líveletet ell{ülönitlink és egységl)e z1.rllnk, k()nllye1111é tesszl.1k
egy l11ű'vclet klilc)1111ÖZ() körn)leZelel(ben t()rtéJl(S feJl1.3.szn.1.l:í.sát. Ug)1
ule7 tC}ItéJ111et, Jl;\. eltá,\l()-
Iítjlll< az algorit]11i]{11S és álJrázolási ftlggé5sége](ct.
A tervezési nl1Ilták tov álJ1Já ki)11nyelJ11en 1(arb
lnta.l1l1
llót)J)á tes7IleJ( eg)' all(alll1Clzást aZ7al,
llOgy csöl<l<enlik
l kc)rnyTezeti függőségeket, (
S rétegezi ( a ren(l
zcrt. J
l\lÍtjá]< a fejlesztllLt(jsé-
bel a7z
11, ]logy l11cgl11lJtalják, 11()g)lan. J<.ell 3.2 oSLtál yllier
lrc] 1 iá1(at kil)(j\,riteni, és 1.1()b'1ran 1{el1
az ()11je]<tllm-összctétcll killasználo.i. A fcjlcsztlletőséget a laza csatc)lás is
egíli. E h 7 e]]<ülöl1í
tett osztály fcjles7tése ](öl1.n)Te])l), 111el1 neIl1 kelJ so.1< fi:.iggőségct figyeleI1111e 'lenn.i.
28 Programtervezési minták
Elemkes etek
Az a kalmazások hryakran elóre elkészített könyvtárakból has7nálnak egy vagy akár több osz-
tályt is. bLeket az előre létrehozott os tiilyo (at hívjuk elemkészleteknek Ceszközkés71et, toolkt).
Az eleInkész ct kapcso ádá és újraJlasznosítható ()s7tályol{ból áll, am.elyck 113sznos, általános
célú szolgálta ása (at nyújtanak. Egy példa az e emkés71etre a gyűjteményosztá yok készkte,
alnLly a listák, a
szocjatív táblák, ver nel{ és llasol ól( oSLlályajt ta.1talm
lz7a. A C++ 1/0
(kinleneti-bcmenetD könyvtára is jó példa. A7. elemkészktek nem erőszakolnak egy meghatá-
rozott tervet az alkalma7ás a, csak olyan kép esséh ekkel látják el, an1elye \: megkönnyítik
a munkáj.lt, a 11i számunkra Jedi!:, lehetővé teszik a nlegvalós
tást az ál alános szolgáltatások
újra <:ódolása nélkül. AL elemkészletLk na b ? hangsúlyt fe
etnek a kód újrahasznosítására: tu-
]ajdonkCppen az
.ll)rCJgra 11- (önyvtárak objektumk()zpontú lnegfeJelői.
Elképzelhető, hogy a7 e]en1 (észlet-tervezést nehezebb 1ek találjuk, m'n .17 alkal nazásLer-
v(.zést
Inivel a elemkészlcteknel< sok all{aJmazásb3.n l{ell udn'uk mú ?"ödn., 110gy haszná.l
ható ( lq,ryenek. Továbbá az elcmk[s7let írója nincs abban a helyzetben, hogy tudná, lle-
lyek lesz 1ek a fellasználó alka mazások, vagy mik lesznek a különleges igé 1ydk. Fz még
fontosabbá tes "-, hogy elkerüljük J feltevéseket é
fÜggőségeket, a 11'k korlátozzák az
elemkész et rugalm.lsságát, és ebből kövcLkezően az alkalma7ás hatékonyságát.
Keretrendszerek
A ke etrendszer (l-amework) együttműködé5 oszt-ílyo \. öss7essége egy bizonyos progra :ntípus
számá +a [Deu89, J1"88], .lrnelye <- egy újrahasznosítható S7er(ezetben egyesülnek. Például eh
keretrendszer irányulhat arra, hogy g -afikus szerkesztő (et építsünk belé51e olyan különböző
területekre, mint pék .lu 1 a művészi raj7olás, a zenes7erkes.lt[s, és a gépészeti CAD [VL90,
Jo11921. Fgy másik keret +endszer segíthet különbö ő programo7ási nyelvek és celgépek ford'-
lóján.a]{ megépítésében l .M.L921. Megint egy m.ásil{ pén7ügyl nodclle7ő (: l{alm£i" ásol{ l{észíté-
sét segítheti fBE93l A ke etrenuszert úgy kell testreszabnunk eh'Yadott alkalmazásI OL} hogy
alkalmazd<)iüggő alosztályokat származtatunk a keretrendszer elvont oS7tályaiból.
A keret end
zer n1egl11tároZ7a az alkalmazás felépítésél. MeghatároZ7a az álta.lános s er (c-
7etet, annak osztályokra és objektUJnokra bontását, illetve a ku lcskötelességeket, vagyis
hOh'Y hogyan mÚködnek együtt az objektumok és oSLtályok, valalninL 3 vezé lés hd adási
irányát. A keretrendszer mindeme tervezési par.".unétere {et előre megadja, hOh? nekünk, a7
alkalma7ás telve76inek, illetve megvalósítóinak csak az alkalmazás lényegére kelljen fi-
!:.'Yelnünk. A keretrendszer a70kat a tcrve7és. (. ön éseket foglalja nagába, amelyek a7 adott
fe 1asLnálási te iikten általánosak. A keretrends7ere <: tehát a tervezési újrahasznosítás! ré-
s esítik előnyben a l(ód újrallasz 10sításd\7al szemben, bár egy adott keretrendszer {on]{rét
aloszt(.lyo.kat js biz osíL s7áJlJ.unl(ld, ame yeJ(et azonnalI asznál11alun]{ is
Az ilyen szinl(í újrallasZI10sítás a vezérlés irányándk n1egfor - ulásáJloz veze a7 alkalmaLás
és a prog a TI (Ö' ölt, ..-me yen alapul. Ha elemkeszletet haS7n:lunk (vagy éppen eh? ha-
h701TIányo::, alprogram-könyvtárat)} megírjuk az alka]nlazás VáLát, és meghívjuk a kódot]
1. fejezet · Bevezetés 29
aJllit fel aJ<arll nJ< h
lsználni
ITa l<eretrend.szerl }laszl1álunl{, a vázat ]laszn.áljll1( fel, és 111egír-
juk
. kódot, amit }lív. l(onkrét llcv.e]<l<el és llívási l11ódokl<al rcnclcll(ező mű\lclelekel ke!.l Ír-
nun1{, de ez lecs()]<J<eJltÍ a ter\'ezési dc)nlésel{ sZ{lmál, anlil<el Jlleg 1<e11 ]10zn.u11k
Ere(illlény
kéI1p nen1 csak g1 l ()rsal)l)an é11ítl.lctjük rel alk
11111azás
linkal, (ie azokn.al( llasollló
lesz 3 szcrkezetül( is, egyszerűbll lesz a karbantartá.sul<, és kÖ'lctkczctcscbbnek t(ínnel{
a !elllasználókn
lk. Másrészről vcszítünJ
_ a kreatív szaba(iságuóJ, lliszen már s()k ler\7ezé5i
dl)otést t11egJlo7taJ< lleJyettÜJlk
lIa az alkalJl1.(:tz£'iso1{
lt nelléz megterve7ni és
lZ eleJ1JJcészleteJ(et rnég nelleZeb1J, étkkor a l,,-c-
rLtrenclszerel(et a lcg11elleZeb1J. A l{eretrendszer-tervező arra t.örcl{szil<., llogy az a(Jolt szer-
1<ezel a terület 111illd.el1
11kalll1azásának eseté11el1 műl«()ciől(élleS ]ehryerl. M.ind.eJ1 jele11tős
v"á.ltoztatás a l{cretrcndszer szerkezetében jclentősen csc}kkcnt.i a keret előn)/eil, mivel an-
nal< lényege épJ1en élZ a relél)ítLS, amit az
ilkalmazás()l( számára 111egllatár()z
EzéIt életbe-
vágó a. l{eretrenclszerek ()1)ral1 rug2.J masságú ra és lJővÍt11etőre írása., ZlII1<:nn)lirc cs
.l( lellel.
Továhl1á, 111]Ve] a7 al1{almazás()k s7erkezete anny
ira fLigg a keretrendszertől, a.zol{ kiilönö-
SCI1 érzékcn)lCk 3 l\.cfetfcnclszcr fcliilctélJcn végrcl1ajtotl vált()zás()kr
l. All()gy egy l<eretre]lCi-
szer fejl()()ik, a
a11(
{hnazás()1(nak is k:c)vetniül< kel]. F7 tesZI
ll
{za csatolást a legfontosalJbá;
l11.ásl(ülönbcn.;] kcrctrCl1.dszcr l{is \TáltoztatJ.sa is jelentős kcllcll1ctlcn llt()llatásol{
lt váltan
l ki.
Az i.ln.éllt emJített tervezésj kércléseJ{ nagyoll f(JJ1.t()Sa]( 3. J<eretrendszerel( ter\lczésél)cn
Egy
lef\ 7 ezési Illinlán keresztül (I()lgc)zó l{cretrendszer s()kkal \1
l
()színűll1), ]10gy 1n
lgas szint(f
tervezést és kód-újra]lasz110sít3.st ér el, 111in.t egy olya.n., all1elyil< n.em.. A l(ész l(erctrcntl.sze-
rckl1en. általá.lJa.n több ter vczési minta is mcgtestcslil
A Inintá}'c segítségéveI a keretrenc]szer
fe]éJ1Ítése s
ámos ki.iJ()nl){>7(5 alkaJma7ásJl()7 Inegfe1el újratervezés néll<ül.
Még jol}ll, ]la a ]{eretrenci.szert a 11eJlne f()glalt tervezési f11 intá1{]{al eg)ri.Jtt dol\-.tl n.cntálják
[13.J94.J. A.zo](
akik iSI11eri]{ a lTI.i.ntál(at, így gyorsab11a.n nycrncl( betcl<.intést ct kcretrend.szer-
lJe, lle
lz()k is n)'erI-letnek a keretrend.szer ti.c)}.cumentáci()já]1(}7 csatolt szerkezetllől, a]{ik
o.em iSl11erik 3 l11il1.tá.kat. A dokuJl1.entá.ció elkészítése miIlclcnféle lJrogram csctél)cn f()nt()'j,
dc k(1lönijscn a kcretren(1szLfeknél
A kcrctrenu.szere}.c műl{ödésének megértése h-ryakran
igen ne11éz, d.e e tutiás eJsajátítása s7ül,séges ah 1102, 11.(Jg)l JlaszD.osítl13.SSl11( őket. B3.f a ter-
vezési mintál\. n<.: 11 mentcsítcn
l{ eme erőfeszítéstől, mcgl{önnyítllctik a d{)lgllnl{
lt
l
£a],
110gy cgyérleln1űbbé teszil{ a keretren(iszer szerkezeté]lek e1el11eit.
Mivel ;:1 mintál\: és )(eretren(Jszerek l{J
}Z()ll eJég seJk
l 1«jz()S V()11ás, S()kaJl elgon.doll<.odl1.3.t-
na 1< a7()n, ll()g)l mik is a ]<ü lön 11sége]{. ]la "atl fla]{ j]ye.nek egyál talán
Nos, }13.l o 11 fő vonás-
ban l(ülönböznek:
1. A ter!}ezési 11liJ7ták elvol1tabbak a kel
elre11dszet+ekI1él. A kerelreJl(iszere]{ megteste-
süllletnek pr()gramk{)(i. formájá11a11, (ie a 111]11tál<t1á _ csa1(
l .IJéltla jelel111et llleg l(ód-
](én.t. A l(eretren.clszerel{ erőssége
l1c>g)! leírllatók progra.nluLási n)'el\'ek segílségé-
.,
,
30 Programtervezési minták
\le], és nem csa.l( tanul]lltól{, llaneJJll<öz,.retlenül iuttatlla.tók és felllasználl131ól(. Ez-
zel szemben az ebben a könyvben szereplő tervezési mintákat 111indig alkalma70unk
kell felhasználásukho7: elnellett a tervezési minták elmagyaráz7ák a terv céljait, elő-
]1)7eit és ]{(lvctkczlllényeit is.
2. A tervezési minták kisehb szerkezetí elemek a j<.erelrendszereknél. Egy keretrenuszer
általában tÖbb telve7:ési mintát tartalmaz, ele ez fordítva soha nen1 igaz.
3. A lCJ7JCzési }1lil1t{í/; kelJéshé 1Jecializáltuk a ker'etret7dszeT'(kl7.el A keretren(iszcrck
minchg egy bizonyos felhasználási területre vonatko7:nak. Egy grafikus szerkesztő
keretrcnds7erét fd lehet használni egy gyár lllodellezéséLen, de ctt6l rnég nem ke-
'ierllető össze egy sziml1Já.ciós ke retre11dszerreJ.+ Ezzel szclnl)en az it.t ]eírt tervezési
]111 ntáI(at szinte l)ármiJy.en alka]ma.zásbln 113.sLnáI113tjul\... Bár terlnészetesen lel1etllc
a mieinknél s7:akosouottabb tClve7ési nlintákat készíteni (mondjuk elosztott rcnu-
s7.erekhc7 vagy párhuzamos programozáshoz), még ezek sem jelölnék ki Úgy az a 1-
kalm£17{ls felépítését, mint egy keretrenclszcr.
A keretrcnds7:erek egyre gyakoribbá és fontosabbá válnak. Az objektumkÜ7pontÚ rendszel ek
így érHe el a legnaf-,?obb felhasználhat6ságot. A natw obb objektumkÖ7pontÚ alkahnazások
keretrendsLerek egymással együttmÚködő rétegeiből állnak. AL alkalmazás szerkezetének és
kÓdjának nagy része keretrendszerckb6! s7ármazik, vagy legalábbis ezek erősen hatnak rá.
1. Hogyan v' asszun
rvezési min It?
A katalógusban található, hÚsznál is több választhat6 tervezb,j mintábÓl nern kÖnnyű meg-
találni, meJyikre van éppen s7ükségünk egy adott probléma n1egoldásáboz, különösen, ha
a gyÚjtelnény Új és ismeretlen s7ámunkra. E7.ért az alábbiakban néhány tanácsot adunk
l Jl1egfcle] () tervezési 111inla kivilélsztásá] l()Z:
· VelDJllk figyelembe, hogy II tervezési minták hogyan oldják meg a tervezési jJroblémií-
kat. AL L6-os ré.sz a7t tárgyalja, hogy a tervezési lninták hogyan lehetnek segíl<:;égünk-
re ;] megfdd6 objektumok megtalálásában, a7 objektum-részkte7ettség és az objek-
turnfcIüJetek m<.':ghatározásában és más m6dszerekben, amelyekkel a tervezési minták
megoldhatják gondjainkat. F7.ek áttekintése segíthet a helyes minta megtalálásában.
· JVézzÜk ál a célról szóló részeket. Az 1.1 rés7. felsorolja a könyvben s2crepl6 minták cél-
jait. Olvassuk it e7t a részt, a70k után a célok kutatva, amelyek kapcsolódnak a7 adott
lJfol)]éolállOL. A7 1+ l-es lálJlázatbaJl tal3.l1131ó oszt31y'ozé) renuszer llasználatávallcsz(í-
l{ftll.ctjük l keresést.
· Tanulmányozzu.k a n'linták kapcsolatát. Az 1.1-es ábra grafikusan mutatja be a terve-
zési minták közti kapcsolatokat. Izen kapcsolatok tanulmányozása segíthet a jó min-
ta v agy fl1int\cS()Polt lncgtllálásábln
· Tanulmáryoz2uk a hasonló célÚ nÜnlákat. A katalógus három fejezLtL61 áll: aL els6
a létrehozási mintákról szólj a második a szcrke7.eti mintákról, ct harmadik pedig :.l vi-
selkedési mintákról. Minden fcje7:et a mintákat bemutató mc.:gjegyzésLkkel i1l<Jít; és
egl olYln résszel zá]lJI, 3.mi ()sszellasonlítja a 111inlál<at+ Ezek a részcJ( l l1asonl() célú
lninLál< 1<c)Lti llaSll013.l0ssdgoJ{lJ3 é'-) 1(l11öl1bségeJ<be cngedJ1ek bcte]{lntést.
1. fejezet · Bevezetés 3
· l7izsgá?f llk 111Cg {JZ lÍjPrater"l)ezés okait. \lizsg{lljuk meg ismét az újratcrvezés ol(ait 3. \Tll-
tozásra ter\'ezve részben, 110gy l[tSlll\.., Inelyil( vonatkozi]{ rá111{. A7táI1 11éz7;Ük át ct min-
táJ<at, 3Jnelycl<: scgítllet11Cl( el1(eriilni a7 újrateJ\ l e7ésl.
· G011C!()tfuk i;'l 117it tCpjJllnk lJáltoztatflatóvá rerlds""Ze17irlkbe17. Ez a l11eg]{()ze.lítés az (lj-
ratef\/czés okaira való ÖSSZl)011tosit{lS ellentéte. A11cl)'ctt 110gy azt néznénl(, tni rl1iltt
kellilet me f,rvá 1 l()zta lnllnk a tefv ct, az()n. gOllclolk()c1u n 1< el, ]l(lgy mil lktrunk l11aju. (ljra.-
tcrvczés nélkül }11Ócl()..\ítflatól)á tenni. Itt a változó ClCl11cl{ Cg)rség11e zár5sára ()Sszl)()n-
t()sÍtunk, al11i SZál110S tCl'lezési fJlinta télnájl. Az 1.2-es t{tlJlázat aZol(l.l :J.Z cleln.cket so-
rolja fel, arllelyekel iZ cg)'es t<:rvezési 11110t3]{ }lasználatá\7al rrlgget]enü], vagyis (ljratcr-
vezés néll(üllnegváltoztat11atllnk
Cél
Tervezési m'"nta
Elvon gyár
Építő
Gyártófüg gvény
Prototípus
Egy'\e
1IIesztő
Híd
...
Osszetéte
o "'szítő
Homlokzat
Pehe[ysúlyú
Helyettes
Emlékeztető
Változtatható elemek
Leszármazott obje turnak családjai
Hogyan készü az összetett objektum
Egy példányobjektum alosztálya
Egy pe dányobektum osztálya
Egy osztály egyetlen pé dánya
Felület egy obje ,tumhoz
Egy objek um megvalós"'tása
Egy objektum szerkezete és összetétele
Egy objektum kötelességei leszármaztatás nélkül
Fel ület egy alrendsze rhez
Ob"ektumok tárolásának ,öltsége
Hogyan érünk el egy obje ,-tumot;
az objektum helyzete
Az obje ,tum l ami a kéreimeket teljesíti
Mikor és hogyan teljesül egy ,é elem
Egy nyelv szabályai és érte1mezése
Hogyan érjük el és járjuk be egy aggregátum
elemeit
Mely objektumok hatnak egymás a,
és hogyan
M ven privát információ tá olódik az objek-
umon k'vül, és mi or
Számos más objektumtól függő objektum;
hogyan maradnak a függő ob.ektumok
naprakészek
Egy objektum állapota.
Egy algoritmus
Egy algoritmus lépései
Olyan műveletek, amelyek alkalmaz latók
objektum ( ok) ra az osztá Iyu k megváltoztatása
nélkül
Létrehozási
Sze ezetr
Fe le I őss égi ánc
Parancs
f
Ertelmező
Bejáró
Közvetítő
Viselkedési
Megfgyelő
,
Allapot
Stratégia
Sablonfüggvény
látogató
.2 táblázat
A tervezési minták által megengedett valtoztatható elemek
32 Programtervezési mrnták
1.8 Hogy n hasznaljuk
erve ési minták t?
,..
Ha már kivá]asztottuk a tervezési mintát, hogyan használj"LIk? Ime egy útmutató, amely ]e-
pésrűllépésre megmutatja, hOhT)'an has7nálhatjuk fel hatékonyan 3. mintákat:
1. Olvassuk át a mintát; hugJllegyen lóla elképzelé\Ünk. Legyünk különÖs fibyele 11nlel
az Alkalmazhatóság és a KÖvetkezmények részekre, hogy biztosak lehessÜnk benne,
hogy eL a megfelelő 111inta a problémánk megoldására.
2 TéljÜnk vissza a Szerkeze( a RészLvevők és az EgyÜtt111űködésfejczeteklc. Győz6d-
jünk meg rÓla, hogy értjük a mintában s7erepl6 osztalyokat és objektumokat, és
ilOgy 370]{ llogyan. l<apcsolóu.naJ< cgymás11()z.
3. lVézzÜk át a Példakód részt, hogy lássunk egy konkrét példát a mínta kádba ágya-
zására. A kód lanultnányozása segít a mint3 megvalósításának mcgtanul:1sában.
"Í. Válas..'{zunk olyan neveket a minta résztveufiinek, amelyek ih1elmesek lesznek az al-
kall11azott kŐ1-',l),tezetbe11. A tervezési rnint3.1<11an lll5Jllató 11cve]{ által;íllal1 ttrl eIV()11-
tak ahhoz, hogyegyalkalmazásban hasznáIl1atók legyenek. Mind3zonállal hasznos
a résztvevő nevének bdeFoglalása abba a névbe, an1i n13jd az alkalmazásban megje:-
lenik. Ennek segítségéve] nyilvánvalóbbá váIik a minta 31kalmazása a megvalósítás-
ban. Például ha a Stratégia nlintát hasLnáljuk egy szÖvegszerkes7tő algorit111ushoz,
akkor olyan oS7tályaink lehclnek, mint például az EgyszerlíElrendczésStratégia vagy
a l eAJ:lrcn(1ezésStrltégia..
5. j-fatározzuk meg az osztályokat. Adjuk meg a feJÜlctÜket, (S hozzuk létre az öröklő-
d6si kapcsolataikat, majd határozzunk lllCg olyan pL'ldányváltozókat, amik: rnutatják
az adat- és obje]<tuI1111i\rat]{()zá.s()kat+ Az()nosÍtsuk 3.2 alkaJ.rnazás azon ]étez(j ()SZt3,-
]yait, amelyekre hatássa] le.sz a minta, és cnnek megfelelőe:n módosítsuk a7:okat.
6. ArYl/nk az alkalmazás"ra jellemző neveket a n1intában szereplő múveletek'Jlek. .tr
a nevek Újra csak az alkalmazástói függnek. Használjuk a mCívelctLkhez rendeJt fd-
adatokat és egyÜtlmLíködési kapcsoLltokat útmutatÓként. 10vábbá legyÜnk köve:tke-
7ete.sek az elnevezési rendslert illctően. Például egy gyártófÜggvény nevében hasz-
náljuk mindig a "LétrehoL-: J (vagy Create) dé5tagol.
7. ValósíLsuk meg a mintában található feladatokat és együttmiIködéscket ellátó l1n7ve-
leleket. A Megvalósítás rész lippekct ad a megvalósításra, dc a Példakód Iés7ben leírt
péld3.l( is segítllLtl1ek+
Ezek pers7e csak tanácsok a kezdéshcL Id6vcl mindenkinek kifejlődik a S3j3t munkamÓcJ-
S7ere a lervczési n1intik 11lsLnálltára
A tcrve7ési minták has7nálatának tárgyalása nem lenne teljes anélkül, hogyarrÓl is írnánk,
hogyan ne has7.náljuk őket. Nos! ne: használjuk őket megfontolatl' nul. Gyakran úgy érnek
el nJ.galmassáf,ot és változtathatóságot, hogy további kÖ7vetítő s7intcket vezetnek be, áIn
ez bonyolíthatja ::1 szerkezetet, illetve csökkentheti a hatékonyságot. rgy tervezési mintát
cS3k akkor alkalmazzunk, ha 3. rugalrnasság, 3.lnit nYÚjt, valóban szÜkséges. A KÖvetkezmé-
nyek rész segíthet a legtöbbet egy lninta előnyetnek és hátrányainak kiszámításában.
.
l' m
.
.
rk.
t.
a
.
..
.
Eh11en a fejezetben egy grafi1(us C\XTI'SlWYG, "ALt 1<3}Jod} amit látsz') szövegszerJ{es7té5 .el-
ép/tését vÍ7sgáljuk rneg, amelynek neve Lexi 1 EleI11 éévellálni ogjuk, milyen megolcláso-
kal adnalc a te vezésl mintá],\: az i1yen és el11cz 11asonló prog ''all101< l-cészítése s(Jrán felmerü-
lő terve7ési prolJlélnákra. A fejezet végére nyolc lninla byakOflati llasznála.t3.ba 1 sze zünk
...... ".
J a,rtassago t
A 2.1 áb a a 1 exi fel11dsználói felületét mlltatja. A7 alJla1{ kc)zepénel( nagy részét egy tégla.-
lap alakú lern et foglalja el, a 1 elyben a (lokul11cntum gra.fJ(us 11egjelenítése l<ap 11elyel.
A doku 11enlumban s ___öveges részel( és képek vegyeSeJl lejlelnek különféle formázási be-
áll.....tásolc me lett A. d.olcumenlumtLtillctct a sza (á.sos len)Titl13tó men.ük és görd.ít(5sávcJk SZL-
gélye il() il et\'L olda.l+ (onok, amelye], a7t s7o]gá ják, ]-l()gy a clol{umcntum a.dott oldalára
ugorlla.ssun (.
.1 ervezési pro I m
A Lexi szerl{ezetét tlélfélc SLe npontból vizsgálju](:
1 [Joku IneltllJ 111szerkezet. A dO]{ll nenlurn belsé5 áll:rázolásának megvá.la.sztá.sa a prog-
ral11 szerke7elénel< sr___inte valarllcnn)Ti elemét é inti, ]ljszen ]11inden szerl<esztLt:. 1 fOf=
n1ázási, rn.cgjelenítésj és s7ö\Tegelemzéi n1u\lelet ezen. áb ázo]ás lJejárasát igényli.
A7, ahogyan ct d.okumcntuln})an ]evő adatokat e]rend.ez7ük, az alkalmazás többi ré-
sLének mcgtervezésére is ](illat.
2. Form.ázás. Hogyan "endezi sarokba és l1asáb()lcba a Lexi ct SLÖVCgct és l(épel{et? Mi-
lyen olJjel<tuJJ10k fele]nek a különböző fo +mázási módok érvényre juttatásáért? 1-Io-
gy dO kapcsolódnal{ ezek a fOfJJldZási nlc)d()k a dokulnLntu II be ső ábrázolásá110z?
3. A fellla211álói felület fi11011lítása. A Lcxi fel112.sználói felülete gördítősávol<at, sLegé-
lyekcl és árnyél(oláso1{at tartalma?, amelyek a grdf+kus do (Ull1entuffilnegjelel."'tést
) A Lexí szerkezete Doc-on alapul) amely egy szö.vegszerkesztő all{almazás j amelyet C"11dcr lCL92j ](éS7ítctl.
34 Programtervezési minták
teszik !-1zebbé. Ezek a díszít6 elemek valósZÍn(íJeg változni fognak, ahogya felhas7-
nálÓi felületet továbbfejlesztjük, ezért fontos, hObty andküllegyenek kÖnnyen eltá-
volíthatók, illetve kiegészíthet6k, hogy ez a program többi részét érintené.
4. Több megjelenítési szabvány támogatása. Célunk, hogya lcxi könnyen alkalmaz-
kodjon az olyan kÜlönböző megjelenítési szabványokhoz, mint ct Motif vagy a Pre-
senlition Manager (I)M) és elll1cz ne Jegyen szi.il(ség t13.gyc)111J lnó(iosít.is()Jra.
5. '[Öhb abla/:?kezelő rendszer támogatása. A különféle lnegjelenítési szabványok áJtalá-
ban tÖbbféle ablakkezelő rendszeren működnek. A 1 exit annyira függetleníteni kelJ
az ablakrendszerekt61, alllennyire csak lehetséges.
6. Felhasználói műveletek. A felhasználÓk külÖnféle grafikus felÜleti elemeken - gom-
bokon, lcnyílÓ menÜkön stb. - keres7tÜl ve7érelhetik a prograinot, melyek JnfíkÖdé-
sét az alkaln1azás különböző rés7ein szétszórt objektumok biztosítják. A kihívást az
jelenti, hogyegységesen kezeljÜk e7ekct a7 objcktull1okat, illctve egy,<,égescn vo 1-
11assllk vissza az általllk végrcllljtott n1ű\Teleteket+
7. Helye,,,,'í1ás-e!lenőrzés és elválasztás. 1 ogyan tán10gatja a lexi az olyan ekm7ő művele-
teket, lnint a helytelenÜl írt szavak megkeresése vagy az elv5Jas7tási pontok meghatá-
rozása? Hogyan csökkenthetjÜk a lehető lcgkisebbre azon osztályok számát, amelye-
ket módosítanunk kell, ha új elcl11z6 művelettcl szeretnénk kicgés7ítcni a programot?
. . ..." .1. ...... .1. ....1 "- _o. ... ...... _o.." _o.." . "-..--- , .." ....1.-. . ..- ..- .......... . . ... ." u" .1.."..- .... ." .. ..." ... .L.... .1. ...... .....L.... ." .".
.:: n(.W>.1 .: ,. y.. .\ -t. ,.\.:c!, \ :.'''\m.J,..t "t.'".....: . .:, ..ri'. ' ...:';" ..... : i...:.\:)v.";;:"" .... "''\r.:.:.::-J b:fj ,ff:
.:... ..I'!-.I'!-..... ......................................-:a..-=--...&.-J..r..-:r-. ......In....................... ..,.......11:'1..... ..............."I.L-nIl.-nIl;'l.-:::-.II;"o...........................-:ro!:1.. .:. :I.......... .......... ....1:"'"......rtJ......... .I.:..
"
.. 1- th [dit .tyj.Y.. s mbof ,.
Align left ) j.
CtÚ1Lcr
AHgEl rtght' .J/ !'X ) .
:....:............ -'Jr ;r;;: . t
.Ror,''':m ; . , 7. OH-
nllJot...", _ / / 1.. ..:$::) .../ ..
:;',;tJ.(" -l/ II'" /-1 :. i Y ,:l:...r. .-
1'1.,;>e-w"("11..I£:l. .L ! J""'7 / r.,. t:..:. '::....."!.. _
S(:I} cli' t-+/lf II-..:;:.::." ;it ::l'..r
..... ........... ""' \.,." . ! . ' 7 ! / ,.:,:£ ..... ::.:.:(}{'-;
GrH .. ,- '1r:'..;,.
'f'.... 4. I ".:-:r.'.:\,:..:.. "'1:
'l;; J}. . / '".. .. ,....... i"
--- (::::\.W'\.:.".. .,
:" I ::'.o....X.:
.... ; . ,..k;::t::.;,.
· i:7 :.. .,....\,...........
: :.:.:-:r- .:::.y. .
4.M ,:...
fl'4 .
G .1.1.1
1 Gm.
t.:. O.v.t:"...:.;-:-
ernU
G IllI
..
..
.:
..
:.:
) ...1 4 JI.. n".J.itQ'"...,,; idnw ru """1"Li
.
,
.',
\:
th.- U"lv.l['J.;1 np:(:!II!";\.l;,\Nn -';If ... 1.tx1.'/IEW. tur .::!:.:..\\.
<:Ip t<ltOrL {WlLnth h. [)i'1. sho".m} -jl['J'';'ly ,,]]-O; .-1:.0. <n «L W
TIO BOJ.
TtM' ..O tJ-:..H L"J.iU.:i ;i; rO:::HV['I,"" 1.. r'mi...:.: 1) '\ho::
0.lg1l"'" L '.'...!........ .-C', x.:. t tlu' ir.HI! , -:- J: (.IJ h
j o.IlLt ....:.m. t".,;J (I;r.,..... '!.he ..:tu.n'- t...'Ij, bU.Ld (Jbjr t'j.
'lh.:.1 wi] dnw r.-.!Id .."¥"; r. 'I!("t L\I:i:'::J.:i"i" T) S!["Ij:
'I1t.j...( t5 W] \'M r.....h;ll...- p;rt)bl1:m ,::...'b" ["I:>"," 1..'"1.0::.(-
o/'Ibk>:t::. 1II'I..iI" ht W1U"!.in t..ht o:tt:"......J. (;E1 wiU gitt
d:r..U'" CI a:S.. rl,t [I"I'r.j;"'::'ro£'L C!J.'o(:!I flo:. L 1...:.1'"1' tI) ""'-:':1'\.1: 1.Jtt
{oojt 1.J'LI t &("1.-'1 u.tl.i1. ')IJ)ro:. t 1;,0 "'.-t-ilW- Wt t (:.11- 1'5
1£'1 ..tl.. 'I,I:)....]kit m '!hi:s -I!.I-;:;IIlrJpJ {, ir. 1ÍI( irrc1?Ru:n')1 ifi
0:.0:( ti),. I:Q;t; ct..w 'ilpnJ t11)IL, tn&!li:d. 1Í1 g]Wh bi- .d
iI.-:....mt1('fL o:" TI!":-:t'ljr\.l1W is tWI'J Iho{']n 1A;.{'J. '\h€
IH i1iru I (",J.>: 3!(n ..\.:i" 'h.. ....-:ÚJ:ilL w:r L1(" d ....rdy M.J iJ:1:'
ld.::!;'" ....b'(': L tu" .......£'I'ti - h dc.' r.(J r nr.::" to s.;1I::dry "" II'
1,. c-li l(;r....:I :itoLlJ d m'\l.:.:....r..
- "hdQ[ili: funhi
..
..
..=.: ...n "b'JU 1;, 1\);:'tv 1.:...... ......-i.h t:;pl'.:s, '....r,: ,...1.1 n.. i]y
..: .1.rM 't. 1..0 ..& :t......-..:....1.mJlj ty r.h2J.. cmrh... .l'tI'W',,, tn:
ifi':11] . tv Uh.,.l':"l1L.:n.. nn: (ilIT\'l':". r!'JH 1. SM'O''':j
:ji {E:":r, &.IJ'I. .0:;' ...-.:'Ji""r. O;:: TE":..:t .t 'rI:w r1)-'. du,;.l....-:s
(::1..' C - nLC....koJ l)pr.":n tE::W: t. A&'ln[ th.:,,; f.- till'" 1..0 ..
t.o;:): t \"'inc.. }(:h "; 1]1.0;: A .ru-1kI TO!:. 1. I1Tilt:i:t 'I.VOulo1 ':o.lt'l (
,) ("....fL'IJ'L(;'I.(" ('.....ÜtE. H l-.:E: 'vP.; t'ILLf dt tw-:: 1 ir..::s (f I.,L-1-- .
f£u:t :íI"L1'W"'; t.h (ru.I"It'::
CLIJIU("1 t gb;'ph5 u:i-..£ :J. D('I ti0('1,;1] sli:cMld (-")LU'..i:'.I.r r./u.
[JJlw.....t.o;::r ':ru.. :!.p("(1fu.. 1"'" ;(L)£'It lj) I!.SI!: ......bo:<:1. <!II:jI<.
r .8'SCH - t1'IL'-'td 1..'If'. {:J:I!"Ho:: Ch..J J("t: s 'N1. us'::
th-! 8-i.... ,P.,;::C"[] .'nr'1':!.E..... ..JL.t. 'IJlot, f;j"l' .:qS-cu.( Jyo.!'
..
..
,.)
:. 8 [!][g)fJj IJ [Z) [9
.................. '..0... J"'. ...............
lI!"'t ,'\.;.;onl ii M ll.ilru. d (J to:.:i!l. '1.1:''( CHi1..(- CII,,),,:,
Llu1. ".:i" u..o:: :1 - b-tt ]' - tl:l.I:o:.do': "Id '10" ]-(I£'It.
1.1' tcn r p'J.hi.l.iIö
..
.:
'ilf ":irL pU.\ :;arr. f]h ILS. c('''rIf'(:'5h h..h,
It. i. .:.'1t!l.tj.f....f. .. .i .:.!.t..1 J;.w 1..-' .:.r
't....(:.iL.- .: .H)u: 91..r,.." :..,,{...::.#
2I..\\..:.\iy....m;.l:9:-í...tJ?t-:.lir;''';:'t:.:Ó.):r. ;.r...j[\::'::"
YI.;... ;..!::. Úp:i..)I\):j..:{ ..
fw.::.-i::to..-iitl:'i.",;:. r:tu)"( 7.1 1j-......IM.;'Iii
,old" '1.1:\;11. {lu.,ht.:s 1,.1.11: '.'N.......
lJ, :::VI'..: II il 1:--1,j:1 1t ":'1!lP w! IJnrl:Ulll, ,!In, H t
(!:t;:t\\':j i Mr' ':;o,)l.)...l : in". -.n A V tilw TrJ1YI!! {'Jt 'I!"E',,':1
b Liffi sI"".,:: ih. ("I)I'1.:5'1.1JJct.n: I'Hr-Lr:1.1!"'; r..rt RuJ. ;L
wJule (r: .. 9 1-0:: {file.n r .E'U} l
H (: .... '....)1,) f
ir. t. = .L\"'" J.LIJ'.f1 If O ;
+ i: 15:£ olt: (1 JS" "\j"':'{ c") (
,. l.i.;.:.",-) ;OP)) 1F:r. d
r.w (:!,':'o;:i: .....(
L.IJ J ;i. (r, lJ E: t {: {tI. V}}, J-:14
,
,.
,
\'
:.:
) ;
.o: 1..... (
lJJLO=- - .> .....,p o:: t1 (
:rtE"-" I;!LJ J o 1/:.0;; r (:. :::'I-)
);
:
,
\.
\
i.l.
'1'
fi('\I:':E'. :1\.,')(1 fI.::tHn .Vuw '=.........1..J.I::.I\L..}. ]..,p...[1 O( t.E' ,.;
,'}
: V
... ... . ................ ....... . ... ".. ... '.. ....... ". .
2.1 abra
A Lex! felhasználói felülete.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 35
A fenti tcrvezési pro1)lém3.klt a 1<övetkeh(5 f[szekl)en altposa1)lJ£ln rnegvizsg51ju]{. MiI1.<i-
egyiklle7 cé] okat lea pcs()lunk, illet\'c 111cgszorításo]{at, anlelye]{ dZ eJ1llílell (él()k eléréséncl{
I11Ó(lj[irt vonat.l<oznal(. Elf)ször részletesell elmlgyarázzuk .l célul(at és m.cgszorításokat és
csak eZlllán lérüJlk rá ct megolclá.si ja.vasla.to](ra. Egy-eg)l pf()}-)léJl1a és meg()I(LíSGl eg)' vagy
töb1J tc:rvezési lTI.intát Jllutat ile; l 11fc)1}léolál( rllv"ázolása 111inden esetben a \Tonatk()7é) ter-
veési nlinli rc)\/itllJc'vcLctésé\rel zá.rul.
.
Dokumentumszerkeze
A dukllll1cntlln1 végső SOrOJl ne]11 Jl1ás, nlinl alapvető graJII(li elemek - 1{3.f,lktere}<, \'ona-
la]{J S()}.csz()gek és más alakzatol( a.dott e]ren{lezése F7e]( az e]eInek l1atáruzzák meg a do
I<Llnle .ltl..lrD tej jes i ]lformácié)tartlIIná[, d.c ct cl.o!<umcntuIIl készítője o.eIn grlfjJ<aj, 11a]lel11 a fi-
zi kai szerl<ezelllcz ka!)csolócló elel11el<}<ént - s()f()l<, llasál)()]{: ábrák, tál)lázatok és 1113.5
szcrJrezetck -látjl a7()kat 2 , aJlle])'ek magu!\. is 1(iscb1J h3.sonló ele1TI.eJ<.l)(51 állJlal<.
A Lcxi felJ1aszD.álól fellllet[l úgy kell clkészítcn_lLl1k llOgy a lJrogr:lrl1()t 11lSZ]lálé)]( kéJ]esek
leg)7cnck c.lckct lZ cle111eket közvetlenül elérni. Nem árt például, lIa ct felllasználó egy d.i-
a.gr:1111.ot egységkénl és 11em ()niilló grafilcai a.la-!JelelI1e]{ Cprill1itívek) ]lalnllzal<énl kezclllct,
'fagy lla eg)' tá.l)1.zatr3. 111i11t egészre és nem mint ké}Jel(kel !<.evcrt szövegek 31aJ{talln
masszájára }.li\r1tl{()zlllt. Ettől lesz a fellilet egys7erű és ]{()nl1yen lla.sználllaló. AIIIIUZ, 110gy
ezt a Lcxi csetélJcn. is clér]1essül<, ()l)Tan l)eis(S álJr3.z()lást választunk al11i illcszl(edil{ ct dO]{ll-
l11en tu 111 fizil<a i szcrl(czctéllcL.
A llels(j ál-}ráz()l{lsnak l(onl(rétan a.2 3.lábbial('-1t l{ell táJl1.ogalJlia:
A UükUlllcntllll1 fizil(ai szerkezeténe]( J11eg(5Tzése: vagyis a szövegcl( és kélJek soro]{-
11a 1-1asál)()1{1)t. láblázatoklJl st1). rC11ctezése+
, i
A dol(umentuIll grafil(us l(épéne]{ elé5áliÍtása és l11egjelenítésc.
· A l11egjelel1ített l(éj=> pontja.ina.l( lnegfeleltetése a 1)e]ső {illrázolás elemeinek. Ez t.eszi
lellctővé 110gy a Lexi 111eghatár()ZZlJ lnire is lli\'au(ozil{ a. fclllaszn31ó, aJl1i]<or a d.o-
]<umentum grlril(llS megjelenítésél1 lleliil va.la11()v3. l<allint.
E cé1()lc elérésében bizon)!()s 111egkötéseket l(el] tetlJ1Ünl{. EléSsz()r iSt a 1cél)ekct és szö\rcge
l{ct cg)lségesen_ ]{el1 )<ezelnünl< AL all{all11azás meg l{cll, 110gy cn.gedje 3. felllaszná](Jnal{,
JIOgy SLÖ\'<:gct ill<:s52cn. Ile ]{éplle és for(J.itvl. El k:ell ]{erülniink, 110g)/ l l(élJckct 3. szöveg
kiilÖ11Jeges esetel<ént kezeljük) vag)' a szöv'cgckct !(ülö.oleges ]<ér}ké11t, ]llás](épp felesleges
sZerkcLtő s formázó l11űve]etekkel fogun]( renclelkezni. Egyetlen lIlűvelctllall11az e)egeJl-
(jé5 ](eIlleg)rcn I11inci a SZC)\lcgck11CZ, 11110(1 a 1<.éI1el<.n.e7.
2 l\ doku 111cnlulTIok. készítői en1ellelt. gyakraJ1 a J()gik.ai sZLrkczel. aId J)ján g(Jno()lnak a dCJkul11cntll111ra, vag)is 111Ínl
nl0nU.::llOk, bckczdésC'k fcjczetcl{ és alfejezetek összességére, A él(l egyszcrűstsc érdckél)cn az általllnk
11lSZIláll belső áL)ráLolás kifcjc' eLten nenl tárol nlajd Ínfornl{lci()l a logil{ai szerkezetrőL bár a leÍ1t lervezéj OH:g-
()l(lás az Jlven infofJnáciÓk ábrázolására is tökéletesen al1cihnas.
..
36 Programtervezési minták
1
Másodszor, a belső ábrá701ás megvalóstásáhan az Ö 1á ló e eme { LS elemcsoportok között
nem s7abad különbséget tennünk. A Lexi képes ke .1 legyen arr., hogy az egyszerű, · letve
összetett elemeket egységesen ke7e1je, és így támogassa a tetszőlehesen összetett doku-
mentumoklt. "A Jnásodik haáb ötöd'k <.;orában a tizedik elem" lehessen egyetlen ka -a In er,
de SZálllOS ale emmel enJel-cező bonyolult diagram is. Amíg az elem meg -ajzoJhatja magát
és 111ehhatáro7hatjuk kiterjedését, bonyoluJtságJ. neJn le7. latással arra, hogy az oldalon
1101 és l10gyal1 jelenik meg.
A második megszorítással szemben azonban a s7övegct abban az esetben igenis eleme _
nü 1k kel ha helyes'"rái hibákat és elválasztási pontokat {eresünk. Sokszo l.em szá 1 "t,
hogy egy sor egy eleme egysze ű vagy összeteu objektum-e, máskor azonban a7 ele llzés
az adott objektum típusától függ. Nincs értelme például egy sokszög helyesírását ellenőriz-
ni vagy elválasztani an. A program bds6 szelke7etének ezeket és más ellent nondó meg-
szorításol(at is 19yeleJnbc kelj vennie.
II
nhfvó e 'pf tes
A hierarchikus felé 1ítésű infof1nációk ábrázolásának egyik elte jedt módja az önhívó felépítés
(rekur7Ív kon1pozíció), melynek során egyszcrlí elemekből egyre össz tettebbeket építünk
fel. E módszer lévén a doku nentum egys7erű grafikai elemekből állítható Össze. Első lé-
pésként karakterek és képe { 1alm.az/. rakhatjuk sorba balról jobbra, hogy kia 1k'"tsunk ebry
sort. Aztán több sort has.1bba rcnde7hetünk, a hasábokból oldalakat építhctÜnk és így to
vá11b (lásd. a 2.2 ábrát).
karakter
té oz
ké
összet'tef (sor)
,
. ... ..,.. '\" . ,.--\
I .. ..:...:.:....::...:.:I...::. ..:.. ,.
",.... . . Lo:'
-I!!f!\ \ ..\r.\\' " '.'II \\ '. , ...:.,','(I., . ..,'i.'o
". . .. ".1 . l/l .1" . .... II . .'1 .... .,..". .
,... .....\ .,., 0\ -$
(]. ., . '\' .\'...\...\:.,' ,.\ :.. '. , I .
., .. ... .. , . ., '. .
\' L\\ : .:,-"iJJ.-":jJ.\,\.,,: :J..i.J. '" ,lh\.I" '. ,,:, . . . '
-
össze tel (hasáb)
2.2 ábra
Képek és szöveg önhívó felépítése
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 37
összetétel
(hasá )
összetétel
( sor)
öss etétel
( sor)
I
"
I
I
térkoz
"
... . .,... .. . '."'
. ..... II 1.....
IJ!. ...:... .
,\\r:. ,.., ::". \.. ,.\ " . , '",\. ."",.. ..
. O \1 .-\,.:,.'.. \,.,\,...,..,,' .\,. .,' . 0 .\;
...',,\ ,. .' :..\,
, ' . . ,OJ................... 'bJ..oJ..L ...... .,L'.'" . '\'
........11.. . .
2.3 ábra
Képek és szöveg önhívó telépítésének objek.tumszerkezete
retur
int
Glyph i- _
1--
Draw(Wjndow)
In tersects ( Point)
Insert(Glyp/l1 int)
. .
-....... -...... A - -
I i I gye tm ekek
Character Rectangle Row O
Draw(Window w) 0- - - --1 Draw(. ..) Draw(Window w) ű"""'" -- - - - --- ---------
I
I I
tntersects(Pont p) 9 I Inte rsects(. .) Intersects(Polnt p) o...... -&........&.1.--............. ..... ... ..... .
I
I I .
Insort(Glyph g, int i) o ,
I .
I I
char c r f
I ,
I I
I . I 1
I
. I I
I Polygon I
.
I I t
I
i .
I insert g íntc I
n true, if point p Draw(.. .) gyermekek a2 i poz(ciónál I
J I
ers€cts el a karakter I tntersects(. u) .
I I
w-. > DrawCharacter{ c)
10r Ininden c in gyürmckek
if c->Intersects{p} return true
!
.
I
.
.
,
,
.
,
1
I
I
t
forali c in gyermekek,
biztosftjuk c helyes
el he [yezé s ét;
c-> Draw(w)
2.4 ábra
Rész/eges képjel-osztályhierercJ1ia.
38 ProgramtelVezési minták
..
A fjzikai s7erkezLlet úgy ábrá7.olhatjuk, hogy minden lényeges eleméhez egy objektL mo
rcndelünk. Tehát neIn csak a látható elemekhez, amilyenek a karakterek és képek, hanem
a láthatatlan szerkezeti ele nekhez, a 50rokh02 és hasábokhoL is, Az ercdményt a 2.3 ábrán
látlldté) o11jektumszerl{eLet mutatja..
Azzal, hogy a dokumentL ill minden karakteréheL és grafiku:::. eleméhez egy-egy objektu-
mottársftunk, a 1 exi szerkezetének minden szintjén b'ztoSítjuk a rugalmasságot. A szövege-
ket és képeket megrajzolásukat, formázásukat és egymásba valÓ ágyazottságukat n,gyelem-
be véve, egységesen keLelhetJük. A program.ot Új karaktcrkészletek támogatásával is kiq,é-
szíthctjük, anélkül, hogy ez érintené a többi szolgáltatást. A Lexi objektumszerkc ete a do-
kumentul11 lLika.i szerkczetét n10delle7i.
Ez a megközclíts két dolgot vo 1 maga után. Az első nyilvánvaló: az objektumho7 megfele-
lő osztályokat kelllétrehoznunh.. A lllásodik, ami Illár nem biztos, hogyannyira 11ag.1tól ér-
tetőd6, hogyeLek az osztályok összee1:,ryeztethető feJü1ctcket igényelnek, hiszen az objek-
tumokat egységesen s7eretnénk kezelni. Öss7eegyeztethető fclületeket pedig egyolyan
nyelvben) mint d C++, úgy kés7íthetünk, ba az osztályokat öröklés útján szármaLtatjuk.
Képjel
A dokuInentums7erkezetben megjdenő valanKnnyi objektum közös elvont osztálya a Kép-
jel CGlyph 3 ) lesz. Alos7tályai mind egys' eru grafikai eIen1cket (karakterek, képek), m.nd
szerkezeti elcmeket (so 'ok, hasábok) leírnak majd. A 2.4 ábra a Képjel (az ábrán angolul
Glyph) osztályhi.el.archia egy jellemző résLletét mutatja, míg a 2.1 táblázatban a C++ jelö é-
sét hasznáJva részletesebben is bemutat juk az alapvető képjdfelÜletet 4
Felelóssegi kör Múvelete
Megje1enés virtual void Draw (Window*)
virtua] void Bourlds (Rect&)
Ta álat-érzékelés virtual booJ lntersects(const Point&)
virtual void Tnsert (Glyph* I Int)
Szerkezet virtual void Remove(GJyph*)
virlual Glyph* Child(int)
virlual Glyph* l.Jarent ( )
2.1 táblázat
Alapvető képjelfe/üJet
3 A "glyph" kifejezést ebben az Üs.szetügg6ben először Calder ICL90J használta; a mai szövegszerkesztők többsé-
ge nen1 l1asznáI lnindcn l\.arakterre külön objektuJn()l, valós7inil1cg llatél{(')nysági ol<o]{I)óJ. Calder tdouJlnányá-
lJan lCa193J lJizonyílotta, hogya mego]cljs Jl1űköd.ől{épcs. A illi l{él)jclcink az övéinCl kevés11é ]..Jfinoml11ta1<) 111ert
a7: eg)rszerűség kc(lvéért s7igorú llierarchiába rendeztÜk űJ{el. Calder ijJypll-jeí a Lírolásl l{öltségel( csöl{l<cnlése
végett ITIcg()SZllla tó](, J gy iráIlyított l",ornlen les gráf zerke7:etet fornlálna k. A l)cllel ysú l)rú nll11la has7njh tá va] ha-
son]( eredménvt ér11eLlink el, (le ezt meghagy juk gyal.;orló feladatndk.
4 A7 iu leírl felületet szándéJ...o:-.an egyszcrű.sílcrtük le a végletekig, hogy magyará7atunk követhct6 legyen. Egy lel
je,; felülel az olyan grafiklls jellen1zők kczclé::;ére s7o]gáló lnűveletcJ"t.ll tarta] 111zn'Í tnint a szín vag"}' a bcl.űlí
pus, íJ1clve l{élJCS Jcnt1e koordináta-átalakításra, és nlagál)a f()glalna lJonyoJtllLab}) gy(:rlnekl{ezclő eljárásol{3t js.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 39
A. képjcle](l1.cl< ll.ároffi. 3.la.pvctő fcJ.3.cl(].tuk vt1.n. 1. 1'udniuk l<ell, 11()gY111 rajzoljál< !lleg önrnagtJ-
kat. 2. rlld.niuk kell mennyi llel')let fogl111111(. 3. sn1erniii1{ ke]] a sZllJőjiil<.ct és gycflTIckeil<cl.
A GIY1)11 alosztályai fclüllJíráljál\. a Draw (Rljz()l) műve]etel, így rljzoljál<. ]{i .11agllkat 3.2 al)-
la]{ fe]11letére; a Draw 11ívása sorál1 egy Wj ndow (Ablak) o1Jjektllmra v;'ll() l"li\.7atk()záSl kaJl-
nak A Windowosztály llatározza rneg lz()l{al a grariJ{li m(íve]eteket, a!llel)!eJ{ a- szövegelz és
más alaJl\Telő alakll()l( képern)!éSre rajzolásá]10í: szi.i]{ségcsel{. A GI)'pll Rectangle (fégla-
llr)) alosztályTa lJélclául a l{ö\'etl{czőkcppen írllatja felül a Draw Jl1(í v :oeletet:
void Rcctanglc: : Draw (Window* w) {
w->DrawXcct(_xO, -yO, _xl, -y1);
}
A fenti l<.óll.l)an aL _xO, 30, _xl és Ji a Rectangle a(ilttagjai, lJl1e])Tek a tégl;J13.p Jcét el-
lentétes sarJ{ánll{ koordjnátáit írják le, 3. DrawRect l)cdig é1 Winu.o\\l-nal( az()n Illű\relete,
amely ct léglalapnak a kéIJCfl1.yőn viléJ lnegjelenítéséért felelős+
A szülő 1célJjelekl1elc gyal<ra.n tlldniuk kell, rl1ekk()ra 11el y r et f()glal ehl\' l(i()tt g)!erJJ1e]<ü]<,
110gy azt m{lS képjele]{kel eg)TÜtl úgy rencJez11essék sorba. 110gy egyil{ sc fedje a lnásikat.
(Erre rnlltat példát 3. 2.2 3.11ra.) A l(él)jel által clfoglllt léglall1-) alaklJ terllletet a Bo,u nds (1 Il-
tár{)l{) mű\'elet a(ija vissza, lZ(}n legkisel)l) l)ef()gLllé) tlég)Tszög elJentétes sarkaina.l{ l{O()fdi-
n51a.ivJ.l, Jl11elyeklJc 3 l<éIJJC] 111ég lJclcfér. A GI)71)11 alosztálYii ezt l műveletet 1Írá]jáj{ fe]lil,
I-l()gy ITIcgl13t3rozllaSsál( a saját rajzolásllk11()Z sZLileséges lerl11etet
Az In L e r s ee t s (Metszi) mŰ'\lclct azt a(Jjl meg, hc)gy eg)! aciolt pOl1t nletszi -e a l(élJjelet.
Am1k()r a feIJ1{Sználé) vllah()l a d.o](umentumllaI1 klttint a lexi n1 eg ll. í v ja. ezt a rn(ívclctet,
llOgy" lncgl1ltá.rozZ3., mcl)ril( l(épjclcl1, illet.ve anI1ak Inel)!il{ részén t()rténl lZ egér](attintás.
A Recllngle ()sztá.ly ennek feliilírásá\'al SZálllítja ki d téglalap és az adott pont metszéspontját.
Miután l kélJjeleknek g')'ernlel<eik is lelletnel<, e7e]{ 11.o77{lad.ásállOZ 1 cl,rételéllcl illct\'c cl-
éréséllez ](ÖZÖS felületre \ra.o SZtikségün.l(. A lov/ (Sor) gy"CrI11cl\.ci I1él,JálJ l lz()k a ]{éJljelek,
éiIl1cl'yek ct sorl)an lalálI13lók. Az Inserl (11etIleszt) !11Ű,'elet egy képjeJet illeszt l)c egy
egész s()fszáIl1 állal 11legl.latárc)Z()lt lle1)Te]1 5 , fn íg a Renlove (Elt3 \'0 1 ít) cltá volítja a rnega(J()ll
l(épjclct, lIa az víllóban g)'crrTIck.
A CJlj_l d CG)TerrJlek) 111lí\'elet a 111ega(lott sorszámon la15.ll1aló gyermel{et a(lja ViSSZél (]11
'van olt ()lyan). A R(J\\lll()Z 11as()nlé) gyerme]<el<l<e] re.rld.ell<ezl1i képes képjelcl( belsőleg
1<.el1, llog)! Jla_szn.álják a Cll i ld Jl1.űveletet, v3.gyis nem jú, lIa a g)'crnlcke]( 1(i.lls7erl{ezetét
közvetlenül éril{ el. 19)! !<ésőb1) nem l(cll módosítani a Draw-ll()l 11aSOJ11ó ernle1{.l}ejáró
művelele}<el, 11a az a(i.ltszerJ<ezetet !110ncljlll< tÖJ11.1J[őllá.ncolt listárl \láltoztatjul<. UgY1.nígy
,.
5 Az egész sors7áIl1o]{ használata talán neTTI a legjoll]) Ill()dja annak H)gy lncgll::-ttr(JZZl 1J{ egy kélJjel gyerlnel<eít,
d.c ez a képjel által használt adatszerkczctl{)l függ. 1 la gycrlnc]{cit láncoltli.stálJall tárolja egy a listát cÍn1ző lTIll-
fató b:-iték()nyablJ lel1ne. A sOrSZálTIOzás (indexelés) problélnájára jol)l) nlcgoldást is látunk rnajJ a ?8 részben.,
ah01 a dokunlcnlunl clclnzését tárgyaljuk"
40 Programtervezési minták
aParen t (SzÜlé» a képjcI szÜlőjéhez bi7tosít szabványos felületet. A Lexiben a k6pjelek hi-
vatkozást tárolnak a szülőjükre, Parent lnűveletük pedig egyszerűen e7t a hivatkozást ad-
. .
Ja \'ISsza.
II
Az ss etéte te e ési inta
Az Önhívó öss7:etétel múds7.ere ncm csak a dokumentumok esetében működik; bármilyen
bonyolult, hierarchikus felépítményt ábrázolhatunk vele. A módszer objektumkÖzpontú fo-
galmakkal vázoltlénycgét az Összetétel (Conlposite) minta ragadja lneg - tulajdonképpen
itl is a7 ideje, I-IC)gy 1(özele1111rő1 rncbtyizsgáljlll( e 111iJ1tát szükség cselén vjssza.utalva a.z itt
Ile Jll U ta lc)tt forga tól«)J1)'\'r.
.3 Fo m 'zás
Már eldöntÖltÜk, hogyan ábrázoljuk a dokumentum fizikai szerkczetét; így a kÖvetkező lé-
pés, hogy kitaláljuk, hogyan építhetünk fe] egy konkrét szcrkezetet, ami megfelel eb')' he-
lyesen formá ott dokumentU1nnak. Az ábrázolás és formázás közÖlt különbséget kell ten-
nÜnk: attÓl, hogy képesek vabryunk ábrá70lni a dokumentU1n fizikai szerke7:etét, nég nem
tudjuk, hogyan készíthetünk el egy adott szerkezetet. Ez nagyrézt a 1 exi feladata lesz:
a szövegel sorol(ra kell tÖfclclnie, a sorokilllasábol(ba és így tO\lál)!lt figyclel1111e véve a feJ-
has7:náló kívánságait. A felhasználó például válto7tatható margószélességet, bchúzást és
térközöket, egyes és kettes sortávot, esetleg más [ürmá?ási lchet6ségekd szeretneG, ame-
lyeket a Lexi formá7ó algoritmusának mind figyelembe kdl majd vennie.
"Formá7ás" alatt ml lnot csupán azt f)gJuk érteni, hogy képjelek csoportját sorokba ren
de7zük, vagyis a "formá z ás" és "sortÖrés" kifejezéseket felcserélheLjük. A tárgyalt eljárás so
rok hasábokba. illetve hasábok olda ::ikra rendezésére is ugyanÚgy alkalmas.
Felelősségi kör Műveletek
Mit formázunk? vojd SetCompu s j t ion (Cl1lnpos i t ion * )
Mikor formázunk? virtual void Compose()
2.2 táblázat
Egyszerű összeállító felület.
6 A felhasználÓI még ennél is jobban érdc:kdhetí a dokurDl.:'lltum logika; szerkezete, v;jgyis a mondatok, bekczdé-
.sel{ fejc/ct:ck alfejezLtch: .sl]J. A Jizikat .szerkezet ez:rel ijs5zehasonlÜ va I(e,'és116 J0nyeges: a lcgt(")lJb elnberl nc]!)
ércJekli, h()gy egy IJel<ezc1ésben llüvá esnek a sürLörésck :dlnfg a 11ckcydés formá7ásd nlegfelelő és ugyanez ér-
.vén)rcs -I 11\sál)ok és ul(lalak fornlázáára is. Tchát a fe1l1as7.náJ{) c.sul)án J11agdS Zi11tŰ Jl1egk()téseket tesz a fi/ikai
szerkezetet illetlieIl, és a . xire bízza hogya!l elégiti ki a igén)le1{ct.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 41
A fo má ó algori mus egysé be zárása
A forl11ázási foJ.)l3.matot fJlcgszl1rításaj\'al és lIlás részJeteivcJ egyiitt, n<:lléz 3.l1t()ln.3.tizáln 1.
A IJf()111é!11ára s7áJll()S 111egkf)elítés lélezil<, és a pr()gralll()zé)}.( kü lc)n 11f>7Ő l)llé]{J)n)Tság(l
for llá.zó algoritlTIusol< egész sor{1t clolgozták l<.i. Miutáll a lexi \'izuá.lis szerl{esztő, az egyik
lényeges l(ércl.és, amelyben kOl11promissZUl11ot kell k<jtniiJll<, ll()gy melyik r()ntc)s-ll)t): a fc)r-
/
.t11áz3.s 111.iné5sége 'lagy a se11essége? AltalállaJl a7t \rárjul< el, }10gy a szer!{esztő \riSZOJ1)lllg
gyorStln llijtsa. \Tégrc utasít1sainl(at t de anélJül 110gy ez a dol<umcntu1111(ülala.l{ján l(lilönö-
selJ11en rC)ntanél. Enl1ek n1egol(lása szárTIos tén'}lcző függ'lél1)le J al11elyek kc)ziil ner11 minti-
eg)rlk befol)'ásol11ató ford.ítási i(i.ől1en. Előford.ul11at, 110g}l a felJ1aszn{tló :1 szelJll IIlegjelení-
tést részesíti előn)'t)en, és ennek Cru.el(ében Ilijlllld() elnl.7ni a n[ll1i]eg llSSll)I-) IllŰkc)désl,
arD.i. esetI eg telj esen ]11 ás al go ri lnl U s II as z n á 1 a tá t í gé]l )Tli, Inint a Z arll it é 1) lJ en_ 3.11(3 1111 a ZlJn]{ .
I:.g}l lnásik, a IDeg\! 1..lósítJ.S J11Ó(ljJ.r;1 nlgyol)l) 113.t3.st gY"ll(urló cIÜJ1t.és lellct llogy i forrná Z{iS
sel1ességét V3h7 a tárigényt lartjll]{ in]<álJl) Slelll eléSlt. A f()rrl1ázás \'égre11ajt3.sára :"orclít(Jtt
idő csö!()(cnt11ctó, ll:l töblJ inforn1ációt t1.roltJnl{ á.tm.cnLtilcg.
A fOf111áz() algoritll1USol( általában bonyolulta.k, ezért 1{ív3.natos, 110gy minél j()l)l)tn fiiggel-
lenítsük iz()l(élt a UCJl(UlnentUJTI szcr}(czctét{5l. Ideális esett)en anélkü] ]1()7l1atlln]< ]étre íjj
l{épjeJel(et, llOgy d. fornláló aIgoritmllsra figyeln.ün.1<. 1<elleJ1e, és fordítva, eg)' (lj forrn5..ló a.l-
gorillTIUS llozzáaclása. SCIn lenne szal)ad, 110g)! 3 meglevé) kél)jelel< nl()(I{)sÍtásánal< sZlll<sé-
gesseget yT()nJa mlga Ut1]1.
A fenti s7eI11pC)11tCJkl1()1 következik, 110b:ry l Lexit úgy kel1 megterve7n.ü11k, llc)gy a fOf111á7Ó
31goritll1ust legalább fordít3.skor de lellctőség szclint ll(ár flltásiclőlJLn lecserélllcsslik.
A7 lIg()ritmus elszigetelését és cgyszersmin(11{()n11)lű cserél11.eléSségét Úg)l biztosftl1.3Jjllk, 1.1'-1
egy o11jekturn113. to](o7zuk Ile, IJOJ1t<'lsa1111élIl }la ](ül()o oszrálylliera.rclliá.t llozunk létr c a.zon
objektumok részérc :'lIncJycl< fOllnáLú alg(Jritmus()kll zárn.al< eg)'ségtJe. A Ilierarcl1ia csú-
c,;án eh'Y fe]ülel f()g állni, ami f()rmá7.éJ alg()ril]TIllS()]{ széles körét tá.1TIogatja., a.losztáJya.i pc-
clig ezt a felületet \lalósítjfik majd lneg egy-egy alg()rilIl1l1S nlűkc)dteléséllez. Ezután f11ár
nincs akadálya, }l()g)' 11evezessünk eh:ry Glypll alc)sztályt, arnely g)7ernleJ(eit egy adott ;'llgo-
ritl11l1S objektum 118.szo.álatá"\la.l rendezi.
II.
sszeállítók és összet' telek
...
Először is készitünl{ egy OsszeáUító (Cump()sitor) ()sztályt az()n ()lljel<ll1m()j( szár11áfa J allle-
lye], eg)Tségl)e zárhatnaJ{ egy fortná7{) algc)rittnust. A felület (2.2 tábla.zat) tudatja az üsszcál-
lítóval 1ne(y l(él)jeleh..et l{cll forl11ázni, és miko1 A formázand.ó kél]jelek az Osszetétel
(C()lnpc)sitic)n) ne\'ű külcJnleges Képjel (Glypll) al()sztály gyerJnekei. Az Összetétel osztály
IJéldán)!ai létrellozásukkor megl(apjál( az Összeállító alosLtály egy pél(lán)'át (aIllel)7i]{ az
ct tJott. sortöl ési ;,!.lgC)ritlllLIsra szakosoJ.otl), arllclYLt élrr J. il tlsítanak, 1-1()gy l C OTIlpe) se (()ssze-
áJlít) rnű,relettel szi.ll(ség eseté 1 - például11a 3. felllasználó l11Ódosított:l a clukulnentllITlOl
rC11clezzék t képjeleket. A 2.5 á1J:ra az Összetétel (C01TI1)()siti()n) és az ()ss7eállíl{) (C()J11I)()-
sitar) oS7táJyok kc)zötti viszoJ1yol{at mutatja..
,
42 Programtervezésj minták
gyelTl1
- - Glyph
-- -
Insert(Gfyph, ;nt)
.
ekek ósszeálUt6 Composltor
L <J Composition K...-- ...
-
Compose{)
Insert(Gyph g, tnt i) o -- SetComposition()
.....
. ÖS 5zetétel
,
.
I
. /\
Glyph::nsert(g I i)
com positor. C orn pose{) ArrayCom pos itor TeXCompositor Si m pleCom pasi tor
. .
ComposeO Compose(} ComposeO
. ..
2.5 áb a
A Compositíon és Compositor osztályok kapcsolata.
A forn1ázatlan ÖssLetéte] objektumok csak azokat aLítható képjeleket tartalmazzák, ame-
lyek a dokumentum alaptartalnlát alkotják Olyan képjelek nen1 kapnak benne helyet
amelyek a dokumentum fizikai s7erkcLetét, például a sorokat (Row) vagy hasábokat
(Column) határoz7ák 111Cg. Most aL összetétclnek közvetlenÜl a létrehozása utáni állapotá-
ról bes7.élÜnk, amikor is kezdetben a7 általa forrnázandó képjelekkel feltÖltődik. Amikor
formázásra van szükség! az Óss7etétd meghívja összeállítója Composc míívcletét, az össze-
állító pedig végigjárja aL Összetétel gyennekcit és új Row és Column képjeleket illeszt be,
sortÖrésí algoritmusának rnegfelel6en 7 . Az előálló objektumszerkezetd a 2.6 ábrd mutatja;
ezen az ÖsszeállítÓ áklllétrehozotl (s a szerkezetbe beille.sztett képjeleket szürke háttérrel
3 bráz() 1tlll<..
N inden Összeállító alosztály más és nlás sortÖrési algoritmust valÓsíthat meg. Az Egyszerű-
ÖsszeállítÓ (SimpleComposÍtor) nev(í például gyors áttekintés re lehet alkalmas, ha neln nézj
3.Z ()l')'an "elllanyagolllGlté)" je]!cI11z(S]<el, mint l dol<11111CnltJJll. "színe'. CA el.o ku m.entum S7]11C
ct s7Öveg és ct térközök eloszlására utal: a "jÓ s7Ín" cLek egyenletességét jelenti.) A teljes TeX al-
goritmus 11legvalósítására használhatunk egy 1'eXÖsszeállító (TeXCompositor) new alosztályt,
lmi a .,.,s z Ínt)' is fJgyclemlle '/cszi \liszont llssal)l)a.n cl.olgozil(.
Az Összetétel-Összeállító osztálybontás biztosítja, hogy élesen elválasLthassuk egymástól
a dokumentum fizikai szerke7etét alakítÓ kódot a különbüzÓ fonnázÓ algoritmusok kódjá-
tóI. AnélkÜl vehetÜnk fel a rendszerbe új ÖsszeállítÓ osztályokat, hogy hozzá kel1enc nyúl-
nunJ< 3 kéJ1jelosztály()](l10Z és f()rciítva. Ha egy SeLComposi Loy (ÖsszeálIító-beálJÍté)) lnű-
velctct adunk az Összetétel képjcl-alapfelülctéhez, lnég arra is lchet6ségünk les7, hogy f1-1-
tásiclőlJcn kicseréljül( a sOltörési algorit.must.
"'T
I A s.()rt ()rések helyének kiszál.nJ1.ásához az Ö.s.sze{dlítÓn k llieg kel] kapnia a kardJ(ter képjc[cl( karaktcrk()djaiL.
A 2.H részI Jen n1cgnézzÜl{ hogyan jutllalun k hc}zzá ehhez az lIlfornláci()llOZ Löl)l)félcl(é}Jllen (a Ll)} )ba12kÚság S("-
gílségével) anélkÜl} h{)y kÜlön karakterlnűvc]clcl adnán1< a GiYIJh feIÜlc1.heL.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 3
A St atég"a t rv ési mi ta
A. Stratégia l11i 01(1 lél1 )l'cge J.L 8.lgofitmllSO!( ()1JjcklUffiC)klJa zá rása A nl i Illa ](u lcselerl1ei a Strél-
tégia (Slratey) ()]1je](tllJll01( (anle])!ek a küJÖll.1)ÖZŐ aIgoritn1usokat cgy'Vségbe zárják), é ezek
J11.ű.k(-)clési .körn.yezete. Az összeá.llítól{ -lévén czcl( is cgyr-eg)l f(Jrnláz() aIg()rimllSl f()glaJllll(
magukba - szintén Slr-ltégia (}l)jeklum()k műkc)d.ési körn.)'ezet(jk llCdig a.2 Össz(tétcl+
A Stratégia mintt all(11111azásá.l1al{ kul(sa olYln rel ii letek tet\le7ése a stratégi2 és körn.}rczctc
S7át11ár-l, amel)'e]< e1ég álta]án.()sa]< all..11.oz l1()GY aJgorit111USol( széles körét táIl1()gassil<. \'l-
g')lis egy új a.J.goritJ:JlllS t3.mogatásállOZ ncrn sza1)a(l. ll()g)' 3 stratégia \Tlgyr -l kC)rn)lezet meg-
,rá] t()latásárl leb7en SZl] 1<ség T J élc1án ]<!lan a KélJjel (( lYl)}l) a.la }JfcllilLl 1(cllé5eI1 általán()sln
tárn.ogatta a g')lerm.el<el( llozzá.3.dá.sát, cltá\lolítását és elérését all11()Z, l.l()gy a7 ÖsszeJil]1t() a]-
osztá11lok -iZ általuk I-13sználl alg()ritIl1ustéJI függetletlÜ 1 rnódos1t11.assá]{ ct do.1{llln.entlI111 fizi-
kai szerl(ezetét és ellllez 113.sonl<,San 3.Z Összcallító [elCilet is Il1egad()lt Jllind.etlt -lZ öss7etéte-
leknel<, 110gy l(ezdcIllényezllessék a fC)rnlázást.
." .:.....:.:.....:.:..... ::-:...:::...:.:...:... -
. ....
. .
. . .-
!.g':fít!ii;igrfi:;{>.
..:::....:::.:\:::.:.:::....:.:.:....:..::. ..:.:.-:::::.:..:... ..:.. :.::.0. .::....:..: :.:.:. :0::::0.: ::::.:.::.:.i::.:.:{:.::::::::-"::::::::\;:.;:::::.":.:.:::.:::::..-:-:.
.....:. ......,.: ..\......\,. .:_. k ,.. .... 1. k.o...:.........,....,...:.\.:..,:...\...:.,.-
... W[ií.ijl¥0.ig:fi;;f':
- ..
összetétel
.it#g1{?1]!J.:;'*:f1g{t:
.. ,.... ... .... .... L' asab :..'.1 ,..,.. . .
..\.. .,. ..,.. .'. .,' .1.:-1. . .. .,. ..\.. ,'. ...
.:"{fAi;t!fé1r£J.r.
:.... .
... ....
. ..::.:.::.:. .:.:.....::.:....:.:.\::.:... o
. .....\.:.:...:.:.;'.:.:: O . . S S ze a II , ' t o ...
...1:.:....:.:.... o
.. :....
..... ......::..:i.:..:.:.:..:.:..::...::...:.:. ...
":;j:ij:!;j;
. . .:. ="':.:.:.:::;:::::;:;:;;:r:::r::::;:;:::;::::::.;::::;:,:::.:::\..,.
.. .
I
térköz
. . n.... \Im.".......
,. '...'':1'" ..:':S:»\','
.\..1/1'" .......... ..... 1 ...: 1... 1 1. 1. ;111.. .
. 0 ..1,.' . ,'..,>,.,'.."....,'. 1nIi O ."
I . . .' ..
.......... .' :.:...........,..............;L....................;. :
I
2.6 ábra
Osszeállító irányította sot1örésl tükröző o bjektumszerkezet.
.
A f Ihas nálói fe lilet finomítása
A. Lexi fel11aszná.lói rlülct611cz két dfszÍté5 elenlet ad.un..1{: eg)T szegél)1: a SZÖ\'cgszcrl(cszt()
tcrliletllez, ami a szt:'-\legolcialt je]zi ffi3.jd, illeblc ct.2 old.al ki.l()nl)()zé5 részeinel< 111etekínté-
sét segfté5 gc)rd.fté5sá\To]<at. Ne!11 öröJ.\.Jésscl a.cljul( ezeket a .reliilell1ez Illert azt S7eret11én..1{, 1:13.
44 Programtervezési minták
ninéll<éJnn.yebben llozzáadl atól< és elvelletők ennének (klilönösen futásidőben). Al<1{or
érjük el a lc.gnagyobb rusalmasságot, ha a több' [clhas7nálói felü eti elem nem is tud róla,
hogy e7ek;; kicgés7ítő obJc {tumak léteznek, így anélkÜl kdpcsolhaLjuk ki-be őket, hogy
más ()sztályol(at módosítanunk kellene.
,
A láts ó efogla' s
Prog amoLási s7elnpontbÓI a fe1l1asLnálói felükt :ino 1 ítása a Ineglevő kód bővtését jelen-
ti, Ha ezt öröklés révén érjük el, megfoszt juk magu 1kat attÓl a lehe -öségtől, hogy a díszítő
el eIn eket utásidőben ár-ende7hessük, dc talan ennél is fontosabb, hogy az öröklés alapú
megközelítés az os Lílyok számának nembvánatos növekedését vonl at ja maga után.
A szegélyt az Összetétel osztályból egy S7egélycsÖsf:.7etétel (BOR eredCompasition) al057-
tályt lét-ehozva állíthatjuk elő, a gördítősávok 'elü ctét pedig ugyanígy a Görgethető-
Összetétel CScroUableComposition) alosztály elkészítésével. Ha segélyt LS gÖrditősávok.H
is akarunk, egy S7egélyesGörgethetőÖsszetéte. (BorderedScrollabkComposition) osztályt
is al]{otllatunk és így tová 'lb Szélsőséges esetlJcn a d.1sZJtés minden váltoLatára külön osz-
tá .yunk lehet, mel)' megoldát, a (i.íS7Ítő elemek vá]tozatosságának növekedéséveI llama
műkc)désképtelen 1é válllat.
A:L obje {tumösszetétel rugaln1asabb és (ezelhetőbb bővítési Inódot kma!. De milyen objek-
tumokat párosítsunk öss e? Tudjuk, hogy egy meglevó képjelet finon1Ítunk, ezér1 magát
a dbzítést is objektuillln{ tehetjük Ünondjuk a Szegély - Border - osztály egy példányává),
íhry- az öss _etétel két elemből ál hat elő: a képjelből és a szegélyből, A kövctke ő lépés an-
nak eldöntése, hogy lely' ( elemet adjuk melyikhez. Az, hogya szegély tartal11azLa a kép-
jelet, log' {usnak tűnik, his7en a képernyőn is a képjel esz a szegély belsejében. De te 1Ct-
jük ennek el enkezé5jét is, a szehélyt ágyazva a képjelhe: ám ekkor módosítása {at kell vég-
rehajtanunk .1 megfelelő Glypb a osztályon, hogy az tudomássa bírjan a ,()zegély étezésé-
ről. Az első választás tehát jobbnak tűn"{, h'szen így a szchélyrajzoló kÓdot teljes egészé-
ben ct Border oS7tályon belül tarthat juk, és nem zavar;uk a többi osztályt.
Hogyan nézzen ki a ]-3order oS7lály? A2 a ény, hogy a szegél' graf'kusan megjelenik a {é)-
ernyőn, aLt suga]]ja, hogy maga is képjel, gy a Bo 'der a Glyph alos7tálya ke 1 legyen. Arra,
hogy ezt tegyük, azonban van még egy okunk: a t'elhasználók nem törődnek azzal, hogy
egy J(é})jclnek vanc szegélye vagy sen1 t 1 anen1 eh7ségesen szeretnél( ke eJni azokat.
lIa egy szegéJy nélküli képjelnek azt rnol1djál, 1-1oh7 .ajzo ja meg magát, annak ezt minden-
féle díszítés nélkül kell végrehajtania, Ha a képjel a sLegély helsejében jön JétrL, a szegélyt
is ugyanúgy keze hetjük: arra, hogy raj70lja ki magát, ugyanúgy utasíthatjuk, mint bármely
l1áS képjelet. Ez 111utatja, hogyaBorder felületnek illeszkednie ke]] a Glyph felülethez; e7t
a kapcsolatot azzal b'ztosítjuk, hogy a Bor( ert a Glyph a osztályaként hozzuk létre.
M' 1dez e ve7et minket a7 átlátszó befoglalás (láthatatlan befoglalás, transpa ent endosure)
fogaln1ához, ame ynek alapját a7 (1) egyetlen gyern1ekef:. (vagy egyelemű) összetétel, i11et-
vc lZ (2) össLee!''Yeztet 1ct6 feIülete]{ l{Cpe ik. A lhasználó ) ogramok általába.ll nem llld-
2. fejezet · Esettanulmány. szövegszerkesztő tervezése 4J
ják megállapítani, l10gy mdgával az ddott clernmel vagy a be oglalójával (vagyis a gyermek
sülőjévLI) l{Lfültek-e kapcsolat11a, }{ülönc)sen ha d befoglaló CgYSLC llen átrullázza műve-
leteit a befoglalt e]emre. Emellett aLonban abefoglaló l{i is bOl)ítlleti elemének vise ked.ését,
Ila egy l11úvelet átru lázás előtt vagy után ajál művclctel{ct +5 vegez, illetve kiválóao. al](al-
mas az elem állapotának beá lltására is+ Hal1J.arosa.n meg]átjul<, h()hyan.
o Iyp
Az át átszó 11efoglalás "c)galmát barmcly olyan l(épjellel kapcsolatban alkalmazllatjuk ami
eby másil{at díszít. A foga]om konkreli7álásálloz léucllozzuk a Glyp 1 MonoGlyph nev( al-
osztál}'át, anlely az O yan d.í ílO képjelek elvont osztálya lesz, mint a. lorder (lásd. a 2 7 ál)-
rát). A MonoGlyp 1 egy ]1.ivat](07ást tárcJI egy elemre, és minden (é aell1et ,nna]{ továbllít.
Glyph
Ora w(Windo w )
/\
o MonoGlyph
elem
Draw(Window)
J\
or er
Scrolle
Draw(Wlndow)
o rawBorde r(W i ndow)
Draw(Window}
2.7 ábra
MonoGlyph osztalykapcsolatok.
Ez a MonoGlyph-et alaJ1állapotban teljesen észrcvcllctetlcnné tesz. a fe 11aS7nálé) pr()h ra -
il10k számá,rl. A MonoGlyph. pé]dáu] a ]{övetl{e7é5képpen valósítja ffic b a Draw műveletet:
void MonoGlyph: :Draw (Window* w) {
elem ->Draw (w) ;
}
A MonoGlypll alosztályai ezen továllbító műveleteknek legalább az egyikét fclülírjál(.
A Border : : Draw pél(Jául először meghívja a szül60sztálybeli MonoGlyph: : Draw műve-
letet az elemre, 110gy az elvégezhesse a d.olgál, vah'Yis a szegélytleszán1ítva lnindcnt l{iraj
7.()ljon. Ezután a Border : : Draw a DrawBorder (RajzoJSzegé]y) ne,rű p .ivát D1űve et 111eg
11ívásával ]{iraj7olja a s7egélyl. (Ennek résLletcibc most nem megyünk belc)
46 Programtervezési minták
vo'd Border::Draw (Window* w) {
MonoG yph:;Draw(w) i
DrawBorcJcr(w};
}
MegfigyelheLjük, lnilyen hatékonyan bővíti Ii a Border : : Draw a szÜl60sLtálybeli művele-
tet a szegélv lnegraj701ásáho7 ellentétben azzal, ha csupán lecscrélné azt, amikor is
a. MonoG lyph: : Draw JllVás kilrllr1(in3.
Eh'}' másik MonoGlyph alosztály a 2.7 ábrán látható. A Scroller (GÖrgető) olyan Tv onoGlyph:
anlely két gÖrdítősdV alapján raj70lja ki magát kÜlÖnböző heJyekrc Amikor a SCI"oller kiraj-
zolja az elemét, a grat1kus alrendsLert arra utasítja, hogya f,örget6 határ.un tÚli részeket
vágja le, az elem láthatÓ területr61 kigöldített részei így nem jelennek meg a képernyőn.
Ezzel meg is vannak azok az elemek, amelyek segítségével a Lexi szövegszerkesztő teriile-
téhez szegélyt és gÖrdítősávokat 3dhatunk. A meglevő Összetétel példanyt;] gördíthető fe-
lÜlet kial3kítáához egy Cörgető péJdányban hozzuk létre, aIt pedig egy Szegély példány-
lJan. Al előáll{) ()lJjektllDlSZ<:rkel:et 3. 2.8 állr.l11áll-lató.
..........................,....:...........1. .,
.i:::" .....
:- .
,:" :-.: . ..... .:: o.... ":.. -.::.1. .:.1."".. . -:.-0.
:: ;..j: .:: ,.',,-".c. :.cx..
o:. _:II:.L" IL: ..:_. :..=:r"
.. .."... ,. ,..........\.... ::..::......:'.:...,,::":::.
,
,.
'.'
\
,.
.:......::.............:..........1.... ..-:......
..::: ..
. . .
.,.. ...;., L." .\;..,:
. ::-:- ( -.:..- :..i .;. :
:.:
.:....
.J."
.,. ...."....... .."."..,."..."...,\".,.....,..:....:.,,_ ....,...\..i. ...
. ...
........
........
o:.
.........
...........
.
:.:
....:...1--.. ...."..........
.....
..
." ..........:................
..
.....
'.......
:::
..\... ."..
.L
...
.::.
.:.....
"
.\..
.:"
.. . ....
. :. ,J '.
\
.:;:
"1..
....
..... .... 0.-
., ,
.... .!".
".:-.
.:l
r
.,
.....
:';.::::... .:.:::::::::::. .::::::::::::.
..... .1
: ,. ."}" ...:..... .,..:. ,-:.,...
.:-0
-:0-
\.
.0
..,
".1 ..
....................;.,1:.-....:.......:...\..
\.
,
:":.
...
.\
.o.,
. ....
.. . .....................
...........
j. ,., ,k ü;: , ,-- ':<>.<...: ";; :::;;i:t,' .,
o." ..... .....:
.:
..:....
....... ,-:. 1 1 -:. 1 .... :...........
......-.:
.: ::\
.:.:.
::"
. ..........
. ..
,::::::.. .::::::.::::. :::::?::
.. .. -...\..
I.::...'
...
...:.... .:......." i::
.... ....":
....
...
........................ "..: ....
2.8 ábra
Finomított objek1umszerkezet.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 7
Megjegvzenclő: ll()gy az összetétel sorrenlljét meg is for<.lítl13tjuk, \lag)!is 1 szegéllyel ellátott.
Összetételt is te11etji..il< em! Cörgeté5 J1é](i.á]ly11a, (le ekkc)r l s7i)veggel egyLltt l slegél)' is l()-
válll1g{)rc1ül, aOli ne111 t)iLlüt" 110gy a l(ívánl 'viscll(e(lés. A lén)/eg lzon1Jln az, 110g)! az tlát
szó lJefoglalás eg)lszerűvé teszi l kiilc)nt)()ző Je]leté5ségekkel \71]é) }<lsérletezést, és l fell13sz-
nál() progral11ot megszalJ3.clítja. attól llog)r d. díszítő elell1ek l(ócljá\'a.llDglllkoznia. l<eIJjen.
Mcgfig)lclllCtjiik lzt is, h.ogy a szegél)T cSl1pán egyetlen kélJje11Jé5j ill, netn 1<etté511é51 vahY)'T ln-
náI is lc)-i)1l:é51. Ez lZ ed.dig bemuta.tott üsszctétclcl{től eltér, 11iszcn azc)l<nál a sLCI.lőolJjcl(ttl-
Jl10k tetsző]eges szánl(] gyerl11eket tartalIl1azI1attlk. A szegély azcJnlJan egyetlen Llemct fog-
llI Illagál)l, tellát csak cg)!t:tlcn ilycn lellct. Egyszerre töl)b clcrnllcz is adllttn1.nl{ clíszítést,
ele e1{k()f a (jfs7ítés f()galnlát t()l)l)féle ()sszetétel r()g11Inával - S()f: llisál) sllJ. - kellene l<c-
\lCl11link 3IllÍ ner11 szerencsés, 11.1.szen ezekll.ez rn.á r relldell<ezésre 3.l111a 1< a rnegfeleJ ő osztá-
1 )'()k. J ()}-Jll, Jla az ()sszeléteU.lez l Illegle\l() ()sztály()kll lltSználj Llk, és l cJ.íszÍlést (lj ()sztá-
lyol(f;a bízzul( Ezzel 3. kü13.J.aJ< fin.O!11ítflsát e]vá.laszt]13.tjul, ] t()b1)i összetételt{5J, aJl1.i egyrszer-
re egJlszerűsíti l cJíszÍt(5 ()sztál'}l()l{at, tartj:i al£;lCS()11)ll11 SZálllllkat, illet 've aJ{atiáljl()zza llleg
110g)! a J11.ár meglevő szolgáltatás<..lJ<at i,srnételten elkészÍrsi..iJ<.
A Díszítő minta
.l\. Díszítő IIlil1ta az átl[11SZó befog13.lás scgítségé\lcl ragadja. meg d clíszítést tál110ga.tó llsztá.ly-
és ()lljektumkapcs()]al()]<at. A ncJ.ísZÍlés' r(}giIIlla 11ersze szélesel)[J lll!l[tl Illint l] ]()gy ecJ.(Jig
lllsznállllk. A Díszítő mintá1Jan c fog;11om minc]cnrc vonatkozil\., alni eg)' ol)jch.tllm fclldat-
]«()rét l<il1őv"íli. l)él(lául egyr elvont szintaxisfát szemantikli lnű\"clcle!(kel díszíllletünJ( egyT
véges állapotll auto111atát í"j állapot-átmen.etel(l<el 'lagy rJla.radncló olJjektlll1101< ll:á.lóját jel-
] enlzéjcÍll1kékkel. A f)íszí léS 1n in la általánlJsítja t lexi ka 1-1csán lJemtl léll()tt nlegl{()zelítést
110gy az s/:élesel11) ]<örllen is al ](ll f11al11até) J egyen.
2.5 Több megjelenítési sz bvány t'mogatás
A ren.(is/:ertervezés egyik féS pr()bléI11ája 11(JgYln ()l(iju]{ Illeg a l<üii)Jl1)()zé5 l'1arcJver- és sl()ft-
\rerfclületel( l{öLötti á.tjárást+ 1 la a lexit 111á.s rendszerre szcret11énl( átültetni, n }rilvá.n l1el11
akarju 1(, }1()gy e7 l<i merfl() ml] n kával járj ()n, másképp neJ11 érné meg a7 egész. M {lS sZ()"ll:
3.Z á.tiiltetést olya.n eg)Tszer(jvé l{elJ. tenl1.i, 3.Jnen11}7ire csal( lelletséges.
A 110rclozllatóság egyil{ 3.kaclálY3 az alJ{3.J.lllazások eg')Tséges kinézctét biztosító lnegjelcníté-
si sZ3.LJ\lá.nyol( (luok-ln(I-f<.:cl St.3.11(larcl) sl)l(3s::1.ga. tzcl( ct sLabványol\. t(111al\.. irá.n}'cl\lekcl
1rra vonatkoz{)ln, 110gyT a z egyes J1rogralllOl{ llogvaJl jelenjenele l11eg és JlogyaIl reagá]jaJll](
:a f<:lllasználók tc.:vél{t:lT)lségér<:. A ma létező szab\ráI1)!ol< l)crszt.: nem térnek el túlságus,-ln
eg)7111ástól, mégis ()sszct.é\lcsztllctctlcnc}.c. A J\;l()lif alkaln1izás()]( 11éIc1álJ] nenl egészen Úg)l
néznel{ l{i n1ill.t l11á.s rell.clszerelcen flltó t.rs:1.ik, és azo].cról is el111oncl)latll, llugy más 113.tást
keltenel<, mint l Ml)lif l)f()gramcJk. Egy ()lytn alkalmlzásllal(, amely l<él1es l()l)t) rencJszerell
is flltn.i, ig8.zodll.i11(cl1 3.Z adott renelszerek fc]113sználói fcli.ilctéllcz.
48 Programte vezési minták
Tervezési célunk, hObY a Lex't képessé tegyük arra, hogy több meglevő megjelenítési s7ab-
ványhoz alkalmazkodjon, illetve hogy könnyű egyen az esetleges új szabvá :lyok támoga-
tását is beleépíteni. Emellett azt is szeretnénk, ha a rugalmasság csúcsaként futásidőben 's
móci.os1t]1atnánk a progra In lnegjelen[sét
Az O · ektu -1 ' treho ás e vonatko tása
Minden, amit látunk, és amivel kapcsolatba kerülünk a Lexi felhasználói felü]etén, egy kép-
jet amely rnás, láthatatlan képjelekbc (Sor, Hasáb stb,) ágyaLódik. A láthatatlan képje]ek
11 -hatÓkat ál ítanak elé5 (G01nb, Ka 'akter stb,), és mqJelelócn elrendezik a' okat. A kÜlön-
böző megjelenítési stllusok útmutatói rés71etesebben is leírják a felület e7en vczérlő elem.e-
'nek C,widget") - gombok, gördítősávok, lncnÜk - k'nézetét. A vezérlók egys7erúób képje-
lek, például karakterek, kö ök, né!'7fszögek és soks7ögek alapján építhetik feJ Inagukat.
rÚelezzÜk fe, hogy két vezérlőosztályunk van, an1elyc { a különbö7ő Inegjelcnítési sLab-
ván yC) k tállloba lásir d II 1va.to tlal<:
1, Elvo lt Képjel alos7tályok halmaza minden veLérlőelem-kategóri.:íhoz. Pék ául egy
e vont Gördít6Sáv (ScroUBar) osztállyal a k6pjeI alapfelÜ etet görd'tőművdetekkel
b6v'thetjÜk ki, egy GOlnb ( utton) osztál1yal gombJTIűveletek:et adhatunk hozzá és
így to.vább.
2. Konkrét alosztalyok halma a Ininden elvont alosztályhoz, amelyek megvalÓsítják a kü-
lönbözó megjelenítési szabványokat. A ScrnIlBar-nak péld.ául lehetnek MotJfScrolIHar
és PMSc .'ollBar aloszlályai, dn1elyek MotiI és PM (Prcsentation Manaher) stílusú gördí-
t{5sávokat 1102nak Jétrc.
A LeA'nek meg kell tudnia külÖnböztetni aZ egyes TIChjelenítési stíluokboz kapcsolódÓ
vezérl őket, például ha egy gombot keJl k'rajLo]nia a program felületére, tudnia kell, melyik
gornbváltozat oS7tályii keIl példányosítania (Mot'fButton, PMBulton, MacButton stb.).
Világos, hogy a Lexi mehJValósítása eZl neIn tudja közvetlenül, példJul C++-ban egy
konstruktorhívással 111egtenni. Ez :3. gornbst' us kÓdban való röbzítését vonná nuga után, így
ut:ísidóbcn nem váldszthatnánk stílu.st, ráadásll ha a programot másik . ends erre S7erct
nénk átültetni, a7 ÖSSLLS ilyen konstruktorh'vás meg kel1ene keresnünk és meg kelJene v.1l-
tOLtatnlUlh.. És a gomb ok csupán a ve7é 16k eh1J'ik fajtáját jelenek a Lexi felhas7J álói feJüle-
tén,.. Az adott megjelenítési módho7 kapcsolódó oS7tályok konstruktorhívásai 1ak elszórás::!
a kódban a karbantal1ók rém.:ílma - ha csak egy felett is átsiklik a tekintetÜnk, ott ta á hatj!. k
Inagunkat egy Mac programban, aminek a kÖ7epén egy Motif stílusú menü ékte]enkul"k,
A Lexinek meg kell határoLnia a Incgcélzott megjelenítési stílust, hogy létrcho7h:lssa a meg-
felelő vezérlőclemet. J"\em csak .:l kifejezett konstruktorhíváso cIt kelJ clherülni" nk, hanem
aLt is hiztosítanunk kel, hogy képesek legyünk könnyedén egy egés7 vezérl6készletet e-
cserélni. M indkeuő elérhető, ha az obJcktum-létrchozás folyamatát elvonttá tes.\'ZÜk. Egy
példával ru 'ndjárt meg is világítjuk, mire gondolunk.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 49
Gyárak ' s term' osztályok
NOflnális esetllel1 a l{cjvCU(CLŐ C+-I- kódclal 1107113tllnk létre egy MOlif stílusú görd.ítéSsáv-
példáJ1Yl:
ScrollBar* sb = new MotifScrollBar;
Ezt a fa.jt3 ](ódot ]<eJI elkerülnünk) 11a 3 Lexi m.egjelenílési szalJ\lányoktól való tliggé5ségét
:3 le11ető legki:=,cblJfc szeretnénl{ sz()rítani. Dc tcgyi.il< fel, 110gy a7 sb gc)rtiítősáv()t az alábbi-
al( szerint }ltlZZuk létre:
ScrollBar* sb = guiFactory->CrcateScroJ1Bar() i
It.t 3. gu i FacLory a MotifFactory (MOlifGyár) ()sztá]y egy rJélclánYl. A CreateScr'üllBar
(1 étrellozGörclítőSáv) a Jl1egfelelő ScrollBar 31osztál")' egy pédányál a(1j.a \riSSLl, a 1(í\r3.11t l11eg-
jelcl1.ítési stílusnak, clJucn. 3.Z eset11en a MC)lifnal< 111egfclelően. A111i :3 fel.laszJlál() prc)gram()kat
iJleti, a fenti kócl hatása lnegegyczil<. a.zzal, 1111n.t11a köZ\Tet]entil a MolifScrollBa.r l{()n.strll]{tort
]lÍ,'n[lnk meg - de V,ln. eg)llényeges különbség: a l(ódban irnmár 11em utal semmi név szer'.nt
aMotif stJlusra. A gu iF ac Lory 01)jeJ<tu111 ne111 csak a M()tif görciítős3.vol< létrell.ozásánlk f()
lyanlltát tesl.i ClVOll.ttá, 11anenl !-)(lr111eIJ} megjele 1ítési stílusl1al( ]J1egfeleléS gc)rclíté5sávét. E 11el-
lett a gu iFact.ory nem szorítJ{ozik a gc)rtiíté5sáv f ok előállításár3. vezérlő], széles l{{}rél kél)CS
eB{észíleni, így gOln.boJ(at 11evileli Il1ezőkct, mcnül{et és lnás vezérl(5ket is.
MiI1dez azért Jelletséges, mert a MotiíFactolY a GU1Factory (GUIGYTár) alosztálY2, anli a ve-
zér1é5elemcl( létrcllozására szo]gál{) általános fellilctLt lnegllatározó el\T()nl ()sztál)/. Olyan
rnűveletel<et tarlalI113z, Ini nt a Crea t eS era llBar vagy a Crea t eBu t t on (Létre11()z-
C-;()mlJ), imcl)rek lcülÖl1féle ve7érl(5elcmcket pélclál1)Tosítan.ak. A GUIFactory alosztá.l)Taj
ezco.lnű\Teletek I11egvalósíta.sával olyaJl kéJ1jeleket J,clnak vissza, mint::1 MotifScfc)IIBar vagy
a 1)I\tBlllton a 11el)rek egy lli Z011Y()S megjelcn.ítési stíl ust 1<épvjselne]{. A 2.9 ábra a. GU J -
F a c to ry ()ujektumok osztál)111 iera rcl1iá jál 1111J la tja..
A.2t mc)nujuk, llOgy ezek a ,g)r{lrlk" termék (prC)dllct, produl{tllI11) objel<tuIll()kat állítanal(
elő. Az egy aCl()tl g)rár á.1tallétre)10zott terrnéke}.( r()kc)nságlJa11 á.ll.nlk egytllással; esetiink-
llet1 min(.ien tCfl11ék egy ad.()tt megjelel1ítési stíltlS}lOZ igazad.c) "\le7érl(). A gyárak Szá111ára
a vezérlő], 111líkc)cilelésé]lCZ szükséges termé]{()sztáJy()k egy részét a 2.10 álJra 1nutalja
Az utols{) kérdés, 31nit meg kell vállSZ()lnllnk, llogy liono.a.rl sZárJna7ik a GUII:a(lory pél-
Cl.á11Y? A v,=í.lasz ped.ig a, }.I(Jgy bárllonnal1, }la Szál11unkra kényelInes. A guiFactory \Táltc)-
Zr) lellct álr.aI3.n.os (gJ011állS), lellel egyr jól iS111crt oSZt2.l)7 stati]<us tagja, tie lcllct llelyi változó
is, a.11len.o)liI1en a teljes f clllaszn5.lój fe1i] 1 etet egyetlen ()sztál yon vagy fliggv.éJlyel1 t)eli.i 1
]-lC)7Zuk létre. Az j.l)Ten olljekluffic)k kezelésére létezi.k egy ter\lezési minta is, az Egy (e
(S'n.gleton). A lén)reg az, 110gy a gu iJactory [)evezetésére a l)fogra 11. azo.n )()ntján \lan
sziil(ség, 3.111il<l1f lnég 11ell1 kell 'vczérl.őcle111eket létre110znlllll{ \'ele, J.e InáT. döntés születe-
tett a llasznJni l(ívánt rn.egjelellítési szabvdnyról.
o Programtervezési minták
Hd a luegjelenítési stílust fordításkor ismerjük, a guiFactory létrehozását a program ele
jen, egys7erúen egy új gv:irpéldányl hozzárendelve elinlL7hetjük:
GUI}acLory* guiFactory = new MotifFactory;
Ha a felhds7náló adhatja meg a program Indításakor .1 lnegjelenítesi stílust - lnondjuk egy
kara.l{terlánc beírásáva] -, a h'Yárat lélre110zó ]<ód l ]«)vct]<ező le11et
GUJ}actory* guiFactorYi
COD,st cn,ar* styleName - getenv (H LOOK_AND_FEEL 1' ) ;
/ I indításkor adja meg a környei et vagy a felhasrláló
if (strcmp (styleName, UMotif U ) == O) {
guiFactory = new MotifFactory;
} else if (strcmp(styleName l nprescntatjon_Manager U )
gujFactory = new PMFactory;
o ) {
} else {
gujFdctory - new DefaultGU1}actorYi
}
GU/Factory
CreateScrolJBar()
CreateButton()
CroateMenu()
. . r
1\
.......... - - -......-
MotifFactöry PMFactory MacFactory
-.
CreateScroU BarO 0- ---3 CreateScrortBarO 0- ------- CreateScro!IBarO o-
I
CreateBu1 tonO 0- 1---- 1 I CreateBut onO 0- - - 1 Create ButtonO 0-1-
I I J
CreateMenuO 0- ... I I CreateMcnuO o - i CreateMenuO 0-
. , I .
. 1 . I
. . . t . . . . . I '"
I I i
-----....1
- - -.
I
I
I
I
I
.
.
.
.
r
t
I
I
return new MotifMenu
I
r
1
1
I
I
I
l reu_n new MaCMenu
a
.
I
I
L
I
I
I
J
1
1
I
L
I
I
I
I ret_n new PMMeu
i
t
return new MotifButton
re1urn new PMButton
return new MacButton
return new MotffScrollBar
return naw PM Sc ron Sar
return new MacScrollBar
2.9 ábra
A GUIFactory osztályhierarchiája
I
I
.
I
I
.
.
I
I
I
I
I
.
I
.
.
I
I
I
I
I
2. fejezet · Esettanulmány: szövegszerkesztó tervezése 51
G/yph
J\
----.....--.
Scro/lBar Button MenLJ
$cro/lT o(jnt) Press() Pop up ()
/\ /\ /\
---... - - - - --
MDtifScroltBar MacScrollBar MotifButton Mac Button MotifMenu MacMenu
ScroUT o(nt) ScroUToOn1} PresO PressO Popup(} Popup(}
PMScTolIBar PMButton PMMenu
ScroIlTo(int) PressO PopupO
2.10 ábra
Elvont termékosztályok és konkrét a/osztályok
EnIlél persze va 1nal( kifinomullablJ módszerek is arra, 110gy futásid611en ki válasszuk a 11eg-
felelő hryáral. Készítlleti..1I1J{ pélci.ául egy bejegy7és-adatbázist, amely ](arakterlárlcokat tende]
az egyes gYlrobjektumok110z+ Igy anélkül jcgyezlletül1k lJe új gyár alosztályol<at, }lohry
a rneglevő kódot rnódosita.nunk kellene, amlt az e1é:57ó 111cgközelítés megkövetel - ráadásul
nL111 Jell m.nden rendszerfiiggő gyáral bclc[ordítan.llnJ( a7 alkalmaLásba.. Ez 1geJl fC)nlOS, lli-
S7en a MotifF3ctOry-t ebryJ a Motifot nem tám()gal() rendszeren esetleg neI11 is kapcsol11aljul{
a programll()7.
A lényeg azonban az, 110gy ]la ehyszcr beállítottuk a7 alkalmazást a 111.egfe elő gyár objek-
tum 11aszn.áJatára, azzal mcg11atáro7tll1< a mebjclcnítési stílusát Ha meggondoljul{ nagun-
l{at, újratcJltllctjül{ a gu iFactory t eID' más megjelenítést támogató g)Tárral és újraépíthet-
jük a fel(iJetel. Nem számít, JlJ.il<or és llogyan döntünJ< e l<érdésbLn t tuclni fogjul{, 110gy
a dc)nlés utá.n 3 program l<épes lesz bcállíta.n.1. saját Tnagál, anélkül, 110 11ármit is módosíta-
nunl\: ](ellene.
Az Elvo t a tervezési minta
A gyá "a.k és terJ11ékek az Elvont gyár 111inla lculcsfontosságú elemei. EL a m 1ta arra nyú.jt
rnegoldást, 110gyan Ilo?:11aljuk létre rokonság11an álló tefmél{objektllm{)}{ családját anéll<ül,
hogy az osztáJy()kat közvetlenül példányosítanu 1k kellene A móJ.szer 112.szn.álata akk()r
a legcélsLcrúob, l1a a terlnékubjel{tulTIok száma és típusa. állandó, az egyes termékcsaládok
között lJed.lg l<ülöl1-bscgcl( van.na],. A családok közül úgy válas tunl{ ki egyet, 11()gy egy
konkrét gyárat példányosílunk, és követl{ezetesen azzalllozzuk létre a termékel{ct. lIa a7
52 Programtervezési minták
:3dott gyárat egy másik egy példányával vált juk fel, egész termékcsalidokat cscrélhetünk ki.
A7 Elvont gyárat az kÜlönbözteti meg:3 tÖbbi, egyctlen típusÚ termékobjektumot h:lsználó
alkotó létreho7ási mintátói, hogy a hangsÚlyt a termékek családjára helyezi.
2.6 Több blakkezeló rends r támogatasa
A megjeknítéi stílus csak egyike a hardozhatóság szempontj.1inak. A másik az ab13kkeze-
ló rends7.er nyÚjtotta környe7et, .1me1yben a r exi fut. Az ablakkezelő rendszer adja azt az il-
lúziót, hogy egy háttérképpej ellátott asztalon egymásra pakolt ablakokat látunk, ez lldtá-
razza meg, hogy az ablakok mckkora és mHycn képernyőteliiletet foglalhatnak el, és ez
irányítja hoz7ájuk a billentyíí- és egérűzenetekel. Számos elterjedt és egymással nagyrészt
összeegyeztethetetlen ablakkezclő rcndszer létezik (Macintosh, Presentation Mlnager,
Windows, X stb.). Ini pedig - ugyanabból 37 okból kifolyólag, amiért a különböző megjele-
nítési stílusokat is támogattuk -azt s7erclnénk, ha a exi a lehető legtöbbjükÖn futna.
Haszn r ha unk elvont gy r rat?
Első pillantásra Úgy tűnik, itt egy Újabb lehetőség a7 Elvont gyár mint.1 használatára.
Csakhogy a7 ablakke7elő rendszer hordozhatÓság.:ira vonatkozó messzorítások jelcntő
sen különböznek azoktÓl a kÖvctelményektől, amelyek a megjelenítési stílus független-
ségét bi7tosítJ5.l(.
AL Elvont gyár alkal1137ásánál fcJtétcleztiik, hogy minden megjelen"tési szabványho7 meg-
határo7unk egy konkrét ve7érl6osztályt, ami a7t Jelentette, hogy ebl}' elvont ternékosztály
ból (alnilyen pl. ct Scrol1Uar) adott megjeknítési stílusnak megfelelő konkrét termékeket
(MotifScrolJBar, MacScrollBar stb.) sLármaztdthatlunk. Fbben az esetben azonban azzal a fel-
tevéssel kell élnÜnk, hOb? kÜlÖnbÖző f,yártóktól szál110s osztályhierarchiával rendelke7ünk,
amelyek egy-egy megjelenítési szabványt támogatnak, és nag} valós7ínűséggel egytnással
egyáltalán nem összeegyeztethetők. Így azt3n nem lesz egy közös elvont termékosztályunk
a kÜlönbÖző vezérl6khÖ7 (ScrollBar, Button, Menu stb.), c létfontosságú osztály nélkÜ pe-
dig az Elvont gyár nem m(íködik. Elős7Ör meg kell oldanunk, hogy a kÜlönböz6 ve7érlőh.ie-
rlfdliák képesek leh'Y cnek igazodni elvont termékfelülelek egy kÖ7Ö halInaz;jhoz, csak ez-
után vezethetjük be megfelelően a Crea te - . . rníívcleteket elvont gyárunk felület.ében.
A vezérléSk csetében a fenti probléluát úgy oldottuk meg, hogy mcgalkottuk saját elvont és
konkrét tl"rmékosztályainkat. Most, amikor a lexit megpróbáljuk kép<.:ssé tenni arra, hogy
több külÜnböz{5 ablakke7elő rends7ercn is működőképes legycn, hasonló problémával ke-
rülÜnk s7embe, mégpedig .172'11, hugy e rendszerck ÖSSLe nem egyeztethető programo7.ási
[elületekkel rendelkeznek. Ez egy kicsit keményebb dió, mint az e16ző, hiszen nem enged-
hetjük meg magunknak, hogy saját, nem szabványos ablak rend szert fejlesszünk ki.
Szerencsére van megoldás. Akárcsak a JTIcgjelcnítési szabványok, 3.Z ablakkezelő rendsze-
rek fclÜletei scm külÖnbÖznek gyÖkeresen egymástól, hiszen lényegébcn ugyanazokat
2. feje z et · Esettanulmány: szövegszerkesztő tervezése 53
l fcI3.datol{at ]lljtjál{ ,régrc. 1'e11át az ahlal{l<e7elé5 rentiszcr fogaJm.aina]{ egységes 11almazára
lesz szül(ségünJ így a kll]c)nlJ()ző lllcgva.lósításo]<at egyetlen közös rclülctlJe tus7kol11atjllk.
A egvalósl1as' f · ggőségek egysegbe zárás
A 2.2 rés ben £1 kél)jclcl(, illetve }{épjelszerkczctcl( kélJernyré5n valé) megjelenítésére beve-
zettük a \Vindow (All]al<) ()Sztfll"yt. Nem ]1atárc)Zlu}{ meg az ablaJ<:l(czelő rendszert, amellyeJ
tnűkc)clik t lliszcn ily.cn l<im(Jnd.c)lldn nem is volt. A \"X T j]ld()w ()sztály zárjél cg)7ségl)e a70kat
a llolg(Jkat, anlelyért lZ a.1)13.kc)]( eID' a111al(ren(lszerbcn áJta.lában fele]nel(:
MŰ\Telelekct biztosít1.1.3.1{ az a]ap\let(} gC()ffictrO aj a.laJ(zat()k rajz()lásálloz.
· lekicsinY1tlletik és fclna,g)71t.llatjá]{ 111agtlkat.
Felelósségi kör Muveletek
virtual vo'd Redraw ( )
virtual . ""'[ Raise ( )
V(1 LG
Ablakkezeles virtua 1 Vü i (J. Lower ( )
virtu.a 1 voi d. ICOl1.i fy ( )
virtual vo Ld DeicOll.ify ( )
+ + +
virtual void D I ct w Lill e ( - . . )
virtual void DrawRec:t ( . . . )
Grafika virtual voj eJ DrawPolygon(. . +)
virtual void. Drawrrext(.. .)
- . .
2 3 táblázat
A VVindow osztály felülete,
· Átl11.éretezI1eljk magukat+
,
lartalmul(at igény s7erint újrGlrajzolI13.tjá.k, péld.ául amikc)f l(is mérctről visszaállítják
őket ere(i.eti Inérelül(re, 3111il{or eg\7mással fc(lésbe ker(\lnek, vagy anlikc)f ld.d.ig clfe
d.ctt tcrületül( a képernyő előtcrélJe }<erül.
A Win(low osztályrna]( le kell fc(lnic a 1<i.i]öJl11ö7c) ll):lakrcndsz<.:rel{ szo]gáltatásaitlak teljes
l{()rét. 1 áSStlnk l<.ét széls(jséges megközelítést:
1. A 7;olgáltatások lnl!tszetCr A Wind.o\v osztály felülete csaJ( azol(at a szolg'iltatás()kal
tartalmazza., ame yek 1Ilitlderl ablakrcndszer1)en megtalál11atók. Ezzel a lllegközelí-
téssel az a gon.d, hO b 7 \Vin(1ow fcliiletiinl{ csal{ 1nnyit fog ludni, 3.1Jlel1nyit a legl<eve-
se1111 sz()lgálta.tá.st nyllJtó rend.szer így nem a.knázh.atjuk 1najd. ki a fejlettebb képessé-
gcl{ct, még 11a a Jegt()l11J: (cIc nem a.z öss7es) a1Iak:kezelő rendszer tárJl()gatjl js az()kat.
2. A szolgáltalások unió}a. rétrellOZunk eg)' felületet, a]11e]ylJen llLl)lel kal) 111i'flden lé-
tezéS ren.clszer mincl.cn l<:épessége. A gCJnd ilt az, 110gy az ere(lmén)l}<ént előá.lló felü
5 Programtervezési minták
let ]1atalmassá és }(övetl{ezetlenné válllat, rá3.(J.áslll minden alkalomma.! l11é)d.Qsíla-
nunk kell (és vele a Lexit is, amely rá támaszkodik), ha akár csal\. egyetlen fejlesztő-
cég is átalakítja al1]a!zl(czelő rcnd.szerénelc felülctét.
Egy'k szélsőséges megoldás sem kivítcle7hető, íh7 az arany kÖ7éputat 'gyeks7ünk megta-
lálni. \Vindow osztályunk ke elhető ielülettcl fog rendelkezni, és a legtöbb népszení SLol-
gáltatást támogatj.a majd. Miután a Lexi kÖ7:vetlenül használja ezt a7 osztályt, a Window-nak
támogatnia kell a70kat a7 elcmeket 's, amelyeket a Lcxi ismer, vagyis a képjdeket. 1.7: azt je_
lenti, hogy: Window felületének "ilapvető grafikai műveleteket is tartalmaznia kell, ame-
lyek segíLégé\tel a képjelek kirajzolhatják rnagl1kat az ablakban. A 2,3 táblá at egy lehetsé-
ges művelethalmazt mutat, amit a Window oS7tály felÜlete t.lrtahna71 at.
A Window dvont OS7lály. Konkrét alosztályai biztosítják .1 különféle ablakok támogatását:
az aIkalma7ások ablakai, az ikonok, a figyehneztető üzenetek mind ablakok, de v'selkedé-
sÜk némileg kÜlönbö7ő. ELeknek megfelelően olyan alos7tályokat lalározhatl1nk rneg,
mint az Alkaln1aLásAblak (ApplicationWindow), az IkonAblak CIconWindow) vagyaPá _
beszédAblak (Di.llog\Xlindow). Az előállított oS7tályhierarchia a Lexi! ez hasonló alkalna-
zásoknak egységes, elvont ablakmlíködést biztosít, amely nem fÜgg egyetlen fejlesztőcég
al)l-lkl(czelő ren,Jszerélől sem.
Glyph képje Window
--
-
Draw(Windovv) Redraw() 0-- ------ kép. el-- > D raw(th is) 'b;.
Jconífy()
Lower()
--
. . r -
DrawLJne()
. r.
A - -- -......
ApplicationWindow leo nWind ow DiajogWindow tulajdonos
IconifyO Lower() 9
I
tura. don os- >lower()
Most, hogy meghalároztunk egyablakfelületet a Lext sZámár2, amellyel m(íködhet, hol ke-
zeljÜk ténylegesen a rendszerfüggő ablakokat? lIa nem készítünk saját ablakkezelő rend-
sze t, elvont ablakainkat cl6bb-utóbb a célrendszer által bi7tosított fogalmak segítségéve]
kell felépítenÜnk. Vagyis mi lesz a illLgvaIósítással?
Az egYik lehetőség, hogy minden rendsLerre külön válto7atot kés7ítünk a Window osztály-
ból és alos7tályaiból, és akkor választjl1k ki a megfelelőt, arnikor egy oldott fclület'e lefo dít-
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 55
ju k a prograInot. Iz a70n 11a11 k()lll()l y fejfá já.st okozlla.t, }liszell s7;áI11()S \Xli o<.I() 'Nr nc\(í de
rnáS-]11ás renc.lszcrrc rncgvalósított oS7;tályt kell számc)o tJ.rt3.nllnJ{. A.zt lS 1negtelleljiJk, ll()g}'
a Windo\,\T llierarc11iá11an leve5 minuen usztjlylJó.J lnegvalósításfügg() alosztályokat 11(}Zllnk
létre - (le LZ aL osztályok SZálTI.áJlak llaS()nl() rol)L)anásá.lloz vezet, rninl al11ir(51 l clíSLítés
kalJcsán rnár S7ót ejtetttinl(. Emellett rnill(ilcét Jnóds7:erne]< \ltn még <:gr llátulütője: ebiJ(
sern n)lújt kellő ruga.l111asságol, ug'}'allis a 1)rogral111cfordít3.s1 utáll Tl1ár nincs lelletősc:gl"l.n.k
rnódosÍtan.i a7 a[Jlakrenciszclt, rí.a.d3sl1J eJ11iall tc)l)b fllttatllitó á11om3.oy"! l{e]l fennt-lrtanunk.
Egyil< lel-lelőség scm tl11 voo7:é), (ie mi Inásl tcllctünl<? Kos, llgyal1.azt, al11It a fOflnázás és
l ll.íszítés cseté})e .1: a {Júltozó tél1yezó-' eg}'ségbe kell zárlllll1k. F.7 pe(J.ig eblJen 3.2 csetlJen az
alJla]{]<ezelé5 rc'nclszer f)leg\'alósítá.sa. Ja az ilJlal(rcndszcr szolgáJtatásait egy ()lJjektuIIlba
Lá.rjlll{t az o11je]{tll nl fel tilet.éllcL iga ZOC1V3. J<.észít11etjii]( e] l \Xlin(J()v\l osztál rl és a.D.Jl.a.1< al ()S7-
tál)Tait lia l)ecl.ig J. felület lnin.<len l,ívánt alJI:ikrcnclszert l(él)eS 1{jszolgá1ni, az eJll]ítClt OSZt3-
lyok egyU(ét sem kell 111()c!osíta.nllnl( 3. reo.dszer tám()gatás[tll()Z. AL 3.blal(objcktUJJ1.c)](-lt egy-
szer(íel1 (Igy' iga.zítllatjuk a ]{ívánt ren(J.szerllcz 110g)T átadjuk a rnegfelel(5 aLJIll{rendsl.cr-
1 )etol<oz<í olJjeklllI11()t. így 3.Z abJal,-ok futási.d.őllen is I11ÓtlosÍtllatók+
Window és Windowimp
1.étrcll0Zl101( tellát egy kil}c)n Windowlmp (Ab13.l\1egval()sítás) ()sztályllicrarclliát, a111elybeJl
e1rejljllJ< l ktilönböző 3.blakl<ezelé5 rentiszerek mcg\ralósítá.sait. A Win<-ic)w1n1IJ eg)1 LIV011t
()szt.ály lesz 2.Z0Jl olljel<lUm()k számára, a.m.cl)lel< a rend.szerfüggő kódokat. ta11allll3.2Zák.
A11]1()Z, 110gy a Lcxi egy adott al11lkrendszcrcn működ.llesse11, az eg)'es lblal(objcl{lllmo].;at
a Windl1V\'IJllp megfelelő alusztályán.lk egy I)él<-J.ányával állíljul( be. Az alál111i ciiagram
l WincJ.()Vv 6s WinclowIJJ1IJ ]lierlrcl.liá}{ k()zötti ka!Jcsolatot 111utalj1:
Window
me gval6srtás Windowimp
Raise(} <> --
..
OrawRect(. r.) Oe vjceRaJse ()
DeviceRect{. ..)
J\ . . .
u -----
-
ApplicationWindow I DialegWindow /\
IconWindow MacWindowimp PMWindowlrnp XWindowlmp
-
DeviceRaiseO Device Ra i5eO Devce Raise O
DevJcoRoct(., .) DevceRec1(.. ) DevceRcct(., .}
- . . , . . - - .
A meg\/alósítá.sol<at :1 Winti()wll11P osztál)l"okb3 rejtve e]ken111-1etjill< a Wintlo\v osztá1yok
rel1ds2ertiiggő l{{)dokl(al \Talá ,,11eszennyezésél", és a \\7ind()\v llicrarcll.iát kis Jl1érelen és
sla11ilan ta.rrl13tjl1k, 111i1<ö7;11en a Inegval(Jsításí llierarcllia lJő,rítésével tZ új ablakkezelők ti-
Dlogatása kÖnn)!C11 o1ego]d.l1ató l11dra(1.
56 rogramtervezési minták
A Windowl palosztályai
A Window mp alos7tályai a kérc1meket ablakrendszer-f-C ggő művdelekké alakítják :JL
Ha viss7aemléks7Ünk a 2.2 részben bemutatott példára, ott a tégla bp rajzolÓ Rec lang-
le: : Dr.aw m(ívelctet a Window péJdányon ct DrawRecL mÚvdet alapján határoztuk meg:
-v1"olc) RecLarlgle: : Dra.w (W'nc]ow* w) f
w->DrawRect (XO, -yO, _xl, -yl);
}
A DrawRect alapértelmezett megvalósítása a \VíndowJmp által beve7etett elvont téglala )-
f3 j Lolé) 111űveletet }l1.szná] ja:
vo id Window: : JJrawRect (
Coord xO I Coord yO, Coord xli Coord yl
) {
_ i Inp->D(viceRect (xO, yQ I xli yl);
}
A fenti kódban az _lmp a Window tdgváltoLója, és az annak beállítására használt Wín-
dowlmp-et tartalmazza. A7 ablak-megvalósítást tchát azon Windowimp alosztáJypéldány
határo77a nleg, an1dyre az _imp mutat. Egy X\Xfindowlmp (vagyis a7. X Window rendszer
57ámára k(.sztett \Vindowlmp alosztály) esetében a Devi ceRect mq::>rvalósÍtása például a7
alá11l>i -tla](ot ölllleti:
void XWindowJmp: :DeviceRecl (
Coord xO, Coord yO, Coord xl, Coord yJ
) {
int x - round(min(xO I xl));
jnt y - round(min(yOE yl));
int w - round(min(ÁO -xl));
int h - round(min(yO - yl)):
XDrawRectanglc(_dpy, _win.ld, _gcI X, Y, WI h);
}
A DeviceRect meghatározása azért Így fest, mert a7 XDrawRectangle (a téglalapraJzo-
lásra használt X felület) a téglalapo (at bal alsó sarkukkal, széJességükkcl és magasságukkal
llaLározza llleg; a Devj ceRect-nck a l<alJotl ada.tokbc)) eZ<.:l{et kell kiszál1101nia. FJóször
megállapítja, melyik a bal alsó sarok elvégre az (xO I yO) bármelyik ehct a négy sarok
köáil -, lnajd kiszámíLja a szélességct és magasságot.
A PMWÜ1ClowImp (a WindowImp alosztálya a Presentation Manager számára) l1ásképp ha-
tárC)711á Ineg a DevicelecL-et:
void PMWindowTrnp: :DeviceRect (
Coord xO, Coord yOE Coord xli Coord yl
) {
2 fejezet · Esettanulmány: szövegszerkesztő tervezése 57
Coord left = illln(xO, xl);
Coord rlght = max (xO, xl);
Coord bottom = min(yO, yl);
Coord top max(yOI yl);
PPOINTL point[4];
point[O] ..x left; point rO] .y - top;
- -
point[l] .x - right;point[J] .y - top;
- -
point{2].x - right;point[?] .y - botlom;
- -
point[3] .x - left; point[3]..y - bottomj
- -
if (
(GpiBeginPath{_hps ,lL) == faj se) I I
(GpiSetCurrentPosition{_hps, &point[3]) == false) II
(GpiPolyLine(_hps, 4L, point) GPI_ERROR) II
(GpiEndPath(_hps) == false)
) {
//hibajelentes
} else (
GpjStrokePath( hps, lL, OL);
}
}
Miért külcJnbözik ez ennyire az X változattói? Nos, az az oka, l10gy az X-szel ellentétben
a PM nem endelkezjk kifeje7eLt léglalapraj7()ló művelettel, csak cbry általános felülettel,
aJnjt a l()lJbszakaszos alakzatok (úgynevezett görbék, path) vekto a'.na ( megllatározására, il-
letve az általuk ]{örllezárt terülelilatáro 'ására és kitöltésére llasznál.
A PM DeviceRect-megvalósításd tc11át mcglellctősen különböz+l{ az X étől, de ez nem
számít. A WindowImp az ablakrendszer-fe ületek vá .lozatosságát lehet) 110gy nagy, de kel-
lően stalJil fe ülel mögé rejti, így a W+ndow a.losztályol< írói az elvont ábrázolással foglal-
l{ozllatnal( és nem l{ell az ablakkezelé5 ren(lszer részleleive törődniük, áa(lásul az új rend-
szerek támogatásának beépítése is lehetővé válik a Window osztályok módosítása né l{ü .
abla ok beállítása az ablak-megvalósftások s gftség v I
Egy l{u csfontosságú kérd.és, amelyet még nenl [rintettünk, 110gyan állítunk bL egy ab alcot
a megfelelő WindowImp a osztál yal? Másképp fogalmazva: mikor kerül sor a7 _imp kez-
eti l)eállítására, és 10gyan állapít juk meg t hogy éppen melyik abla!{}{ezelőt (és l{övetke-
zésképpen mely.k WindowImp alos7tá yt) kell 11asználjuk? A7 adott al]laknak valamilyen
Windowimp-re mindenképpen szül{sége lesz, mielőtt bá . tn't csin.álhatna.
rfölJb lehetőségünk is van, dc m. 3.fra összpontosítllok, alne yik az E .vont gyár nlin.tát alka]-
mazza. Létreh.oz11atunk egy elvont gyár osztályt (WindowSystemFactc)ryJ AblakRendszer
Gyár), amely felületet biztosít a különféle rendszerfüggő megvalós.tási objektum.ok létre-
11.ozásáho7:
58 Programtervezési minták
class WindowSysternFactory {
public:
virtual WindowImp* CreateWindowlmp() = O;
virlual ColorImp* CreateColorImp{) - O;
virtual Fontlmp* CreateFontImp() = Oi
/1 Create... müvelet minden ablak-er6forráshoz
} ;
Ezután mmden abJakkezelő rendszerhez m<'.{,hat:hozhalunk egy kan { -ét byárat:
cJass PMWindowSystemFactory : pubJic WindowSystemFactory {
virtual Windowlmp* CreateWindowlmp()
{ return new PMWindowlmp; }
I / · · ·
} ;
class XWlndowSystemFactory : public WindowSystemFactory {
virtual WindowJmp* CreateWindowImp()
{ return new XWjndowImp; }
/ I . A -
} ;
A Windowalaposztály konstruktora a WindowSystemFactory fe ü et segítségével adhat kcz-
dóértékel Ca haszn.:ilatban levő ablakkezelőnek n1egfelelő Windowimp-et) az _lmp tagnak:
Window.:Window () {
imp = wlndowSystemFactory->Createw.ndowlmp();
}
A windowSysternFactory változo egy WindowSystcmFactOlY .llos7tály jól iS111Ul példá-
nya, anlely llasonló a meg"elenílési r"lust megh tá.rozó guiractory változó11o A win-
dowSysternFactory-nek ugyana.zzal a O1.ódszerrel adhatunk Jezd.őértékct"
A ' d rve ési i ta
A Windowimp osztály a7 ablaklLndszer szolgáltatásainak közös felületét határozza meg. de
felépítesél más m<...gs2ü ítások kötik, mint amik a W.ndow fe ületére vonat {oznak" Az a kal-
mazdsprogramo7ó ( nem nYÚlnak közvet cnüJ a WindowJmp felületéllez, csak a Window-
objektumokat kezelik. Így a Windowimp fe Ületének nem ke 1 igazodn'a aL alkalma ás-
programozó nézőpont jához, ami a Window osztály 1iLrarchia és felÜlet mebtervezésénél
szempont volt" A Wind.owI np eJületc kc)zelebbrőJ lül{rözlleti az ablal<kezelő rendszer
nyújtotta szolgáltatásokat, (s a metszet, ilJetvc unió megkö7elítés felé tetszőlegesen tolód-
J1at, alt()] függően t melyik il]eszl{cdik jobban acél endszerekllez.
A lényeg az, hogy JnegCrtsük, a Window felülel az alkalmazásprogramoLó, míg a Window-
Imp az ablakkezelő rendszer igénye't elégíti ki. Az, hogy a sza gáltatásokat két bierarc liá-
ba rc.nde7ZÜ {, lehetővé leszi, 10gy a két felületet egyn1ástól függet cnül valósíthassuk
meg, a Lexi löbb rendzeren való működését pedig a két hierarc lia abjektumainak együU-
műl(ödée b".ztosítja.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 59
A \Xlind.ow é::, a Wind.o'NImp kcjz()tti kapcs()lat a 11-)ci tervezési nlintára ad pél(1át. A IIíd l11Ö-
gf)lt megl1úv{) shánd.ék a7, hogy le11etővé tegyü]{ ön.álló, egylllástól független.lil fc.:jlcsztllető
oSLlályllierarclliák együttműkc)désél. l'ervezési céljainl{ al"l!-}()Z ,lezette]<, 110g)T létre]1.0ztll0.k
J{ét iJyen oS7tályllierarcl1iát 1 ameyek J{Ö7Ü] az eg}lj]{ az ahla]{o]{ logik3.i fog3.l1nát, a. 111á.silc
pedig különlJöző mcgvalósÍl3.sail(a.t támogatta. A Hítl minta alk11n1azásával a7 e]1l0]lt ]ogj-
](ai lhllk()](at úgy fejles7t}letjlik. továbl), ]logy D.en1 J<el1 3.Z abla.krenclszerfLiggő l(ódlloZ
l10zzánjrúlnunlz, és ez fordítva is igaz
2. Felh s nálói műve ete
A I exi s7o]gál tatásai11ak eg)T része a d.okuJll.e11tu nl vizuál is megjelenítését1 kereszlül érllclő
cI: szövegel Írunl\._ be és tötlunk, arrélJb ViSSLÜk a beSZllrási J)()ntcJt, az egérrel s7ö\legrészle-
teket jelöllink ]{i Más szolgáltatásokat ]<őzvetve, a Lexi m.cnllÍn, gombjain és gy()rst)illen
tyűin k<:lCSzlülllasználunk Az ezek mögötti művelctek k<.)7;é a kc)\relke7:é5k tlrto7:n.ak:
· Uj dol{llfficntU.1TI létrcllozása
Létezé5 (i.c)l<umentllnl 111egnyitása, ]l1entés és kin}Torntatása
· I(j.jelölt szöveg kivágás3. a doku ncntumból illc.:t\rc bcillesi'tése a dokuJnelltum más
,.. ,..
reszere
· I(ijelölt szöveg stílusán.aJ( és bet(ítílJUsán.3.lc Inó<.1osítása
· A sz()vegf()rmá7;ás - igazítás, sorki7árt elre]lc.iezés - Jnócl()s1tás3.
· KiJélJés a IJfograJll.ból
· Egyéb mű\'eletek
E lnűveleteket a Lcxi különböző felülctt:kcn teszi elérlletővé él felllashnálé) szálllára. de
.
eg)7etlen Jn(íveJel senl 1{()lőd.i]{ egyet]en feliiletllez. Célunl( az, l1og)"F a lnű\Tclctek t(il)lJfélc
rnódo 1 is végre11ajtllatól( leg)7enel{, példaul egy Inásik oldalra átugorllassunk egy gc)mh, de
al<:ár eg).! menüpc)nl segítségéve1 is. Az is e]képzelJlető, 110gy a jövőben váltoLtatni szcret-
nénl{ a fel11aszná.lói felületen.
A 111űveletel{et e 11ellett több l{ülönböző oSLtál)!bln vtlósítjuk meg. Fejles7té5kélll a]léU(Lil
sLcrctnénk elérni őket, llogy l ielllasználói felületi és megvl]é)sílé) osztályo]{ J{özött tttl sol(
függőséget a.lakítanáI11{ kl, lIle t a túl S2orOS3.n csat()lt n1cgvalósítás l(c'vésbé állátl-llté) és
1<arbantalt11at.ó, illetve ncllczLbbc.n bővÍtllető.
ToválJ}J bonyolítja. ct dolgokat, l10gy 3.zr sze "ctnénk t 11a i Lexi tám()gatná néhány, dc l1Cln
n1,il1den művelet visszavonását és megismétlését 8 . fgés7en 11ontosan az olyan_ d()1(ll111Cn-
tUffi-D1Ód.osÍtó rnűvelete]{ ViSS7a\Tonására szeretnénlc lellctőséget 111int a törlét" at11i'vel a fel-
llasznál() szánd.ékán I<Ívül rengeteg adal()t törölhet \'életJen_ül, de ne II kívánunl{ ViSSL3von-
ni oJyan műveletel<et, mint egy ra.jz men.tése vagy a plogra.mból víll() kilépés. E mtíveletek-
nek rüggctlcneknek kelllenniül{ a visszavc)nási f()IYlmattó1. E 11el]ett korlátozl1i SeJ)1 kívá.n-
jul< a vjss7avon.áso]{ s7átnát.
8 V.J.gyis egy éPP(:11 viSLaV()11l mlvelel újlJóli végreI13jl:Jsál.
60 Programtervezési minták
Nyilvánvaló, h0'N a felhasználói műveletek támogatása az egés7 alkahnazást át meg átszö-
vi. A dh'v{Íst az jelenti, hogy olyan megoldással kell előrukkolnunk, ami az igények kie é-
gítése nlellett egyszerű és könnyen llővítllető
\.ér em egys' be z rása
Tervező' zempontból a lenyilható menű is csak egy képjel, ami további képjeleket taltal-
maz. Az különbözteti meg más, gyermekekkel rendelkező képjclcktól, hogy a benne levó {
kattintásra valamllyen műveletet hajtanak végre.
Tegyük fel, 110 17 ezek a müvelctvég7ő képjelek a Glyph Menultem (MenüElejn) alosztályá-
nak példányai, és műkÖdésü <et egy Ügyféll6J9 érkező kérdem vá tja ki. A kérelem teljesíté-
se járhat egyetlen objektumon végzett művdettel, több objektumon végLetl több művelet-
tel, 'l3.gjT lel let va.lallol a J{ettő k()zött
Meglehetnénk, hogy minden felhasználói művelethez létrehozzuk a MenuItem ebry alosztá-
Iyát, majd ezekbe "bedrótoLLuk" a {érelem végrehajtását biztosító kódot, de ez nem · gazán jó
JllegkÖ7elJtés; semivel sincs jobban szü {ségÜnk minden kérelemhez {ülön alosztályra, mint
külön osztályokra eb7lenyíló menü lllinden eleméhe7. Ráadásul "gy a kérelmet egy adott fe -
hasLnálÓl felÜlethez kötnénk, ami megnehezílené, 10gy más módon is teljesíthessÜk a kérést.
Példaként tegyük fel, hogya dokumentum utolsó oldalára szeretnénk ugrani, és erre kétfé-
le mÓdszert s7.eetnénk. Az egyik, hogy egy menüben megjelenő MenuItemre kattintunk,
a másik pedig r Ilc)gy 3 Lcxi ab akánal{ alján ev(5 oldalikc)nra (ami röv'deb11 dokumentu-
moknál jóval kényelmesebb lehet). Ha a kérelrnct Öröklés útján a MenuItem-hez kapcsol-
juk, akkor ugyanezt kell tennünk aL oldalikon esetében is, sőt minden olyan vezérlő eseté-
ben, amellyel esetleg llgyaneLt a műveletet kívánjuk végrehajtani. [zze! az osztályok száma
ugrásszerűen megnőhet, akár a vezédőtfpusok és kérelemtípusok sLámának szorzatáig.
Amivel nem ren delkc7.:ü nk, az egy rnegoldás, amellyel a J11enüeJemeknek paramétereket ad-
J1atnánk át, 3.1.nelye]<11en lnegJ<apják a végre11ajtan.( ó kére]met+ Ezzel eJJ{erüllletn.énl{ az osztá-
lyok számának növelését, és nagyobb flltásidejű ruga] nasságot érhetnénk el. A Menultem
például kaphatna paraméterként egy függvényt, a nit rneghívhat, de ez három okból nern
nyíljtana tökéletes megoldást:
1. "J eIn ol(111atnánk Il1eg a viss7avonás-islnétlés prcJ111élná ját.
"
2. Allapotot függvénnyel öss7ekapcsolni nehé7.:. Például egy függvénynek, ami megvál-
toztatja a betűtíput, tudnia kell, melyik betűtípus van érvényben.
3. A fÜggvényck nehezen bővíthetők, és részleteikhen nehe7.:en úJrahasznosíthatók.
A fentiek azt sugallják, hogy ct menüelerneknek nem függvényt, hanem objeklumot kellene
paraméterként átadnunk. E7után már használhatunk öröklést a kérelem megvalósításának
bővítéséhez, iIJetve újrabasznosításához, lesz helyünk, ahol táolhatjuk aL állapotot, és
9 blvben .17 ügyfél a Lcxi felhaszn:tIÓja, valójában ;Jzonban egy másik objektum (pklául egy eseményLová.bbító),
an1clv a felhaszn1.1óí beo1cn.ctel{cl kezeli.
,
2. fejezet · Esettanu1mány: szövegszerkesztő tervezése 61
megvalósítllatjuk a visszavonást illetve i,;métlést biztosító l1űveleteket. Ime egy úja.bb pél
da a változó e]em. egyéglle zárá.sá +3., aJni ebllell az esetben egy kérelejTI. A ]{érelmeket
egy-egy parancs objcktumba zárjll](.
A Camma d os ly es a osztály i
Először is, létreho7zuk a Command (Parancs) elv()ot osztá.lyt, alni a 1{ére]Jl1e]( ki-l(i.ásállOZ
lli7t()sítja a felületet. Az alapfelülel egyetlen elvont műveletb(51 állJ an .elyet Execl1te-nak
(Vég e]1aJt) nevezünk. A Command. alo7tályai a külön}Jöző ]{érelmek végrellajtás1.hoz l(ü-
lönfélc módo}(on valósítják meg a.2 Execute 1nííveletet. Eg)'es a.losztályoJ< mUnl{{ljuk egy ré-
szét vagy egészét más objc <tumra ru11ázllatjá.k át, fia.sok J(épesek ()nmaguk kielégíteni
a kérelmet (lásd a 2.11 á11rát). A kérelmező l1gyanakkor nem lát külön.1)séget a Cc)mmand
(Parancs) ()11jektumol{ l(özött, mindet egyf()rmán l{ezeli.
A Menultem tárol11atja a Co nman(J ()t)jektllmot 3.Ini 3. ]<érelmel egységbe záfja. (2.12 álJr:.)
.Minden nenüelem objektumnal( 3. ITlegfe]elő C(JmmaI1Cl alosztály egy péld.ányát a(J.jllk át,
illetve meglldtározzuk a szöveget ami 3 mcnl\elem l1elyén nlegjeleni <. 1\.mil<or a felllaSZJlá-
ló l(iválaszt eb menüpontot, a Menu tern egyzerűcn meg11í\rja a7 Execute műveletet az ál
tala tárult Comma.nd objektumra, így teljesíti a kérelmet. A gC1InOcJk és más vezérlők ug)Tan-
úgy használhatják a parancsokat, Dlint l menüclcmcl{.
Command
Execute()
-----...... 1\
..............-
PasteCommand FontCommand SaveComman mentás uitCommand
.....
--
Execute() 9 Execute{) O Execute() '( Execute() cr
I r .
butter newFont t & I
t t . I
. I I
I ! .....
..
a tér tartalmának
(buffer) be illesztése
8 dokumentumba
párbesz.édablak megje-
lenftése, ahol a felhasz-
náló nevet adha a do
kumentumnak. majd
mentás a megadott
néven
if (a dokume nrum megváltozott) {
mentás-> Execu eO
}
kilépés a prog ramb6[
11 kijeliH szöveg meg-
jelent ésa az új beta
pussal (newFent)
2. 11 ábra
A Command osztályhierarchia részlete
62 Programtervezési minták
GI ph
Menultem
parancs
Command
Clicked() 9
Execute()
I
I
{
parancs-> -xecute();
..-_-......
- - -...-......
2M 12 ábra
A Menultem es a Command kapcso/ata
Viss vonás"le tóség
A visszavonás, illetve újbóli végrchajt2s lehetősége igen fontos a7 interaktiv alkalma7.ások-
ban. E parancsok végrehajtását a Command felÜlethez adott Unexecute (Ismét vagy !vlégse)
művdettel biztosít juk. AL Unexecllte n1egfÓrclítja a megelé57ő Execute művelet hatását, még-
pedig annak aL infollnációnak a fclhas7nálásával, amelyet az ExenItc tárol. A font-
Command (BetűtípusParancs) esetében például az Execute a betűtípusváltás áJtal érintett
szövegrészt, illetve az eredeti betűtíp II st raktáro2za el, 'így az adoll szövegrészletet az
UneXC(lJte visszaállítI1ltja l(ürábhi álllp()tábGl.
A visszavonás lehetőségéről néha futás kÖLben kell dönteni. A kijelÖlt szöveg betűtípusá-
nak megváho7tatására irányuló kérelem például nen1 eredménye7 semmit, ha a szöveg már
eredetileg i5 az új betűtípussal írÓdott. Tegyük fel, hob'Y a fclhas7náló kijelöl egy rés7t, és ki-
ad egy ilyen feleslege.s parancsot. Mt legyen 3 hatása az ezután kiadott Viss7avonás pa-
rancsnak? Járjon egy értelmetlen változtatás egy ugyanolyan értelmetlen művelettd? Termé-
s7etesen nem. Ira a felhaSLnáló néhányszor megismétli a felesleges betűtípusváltási paran-
csot, nenl szabad, hogy ugyanannyi visszavonási mííveletrc legyen s7Üks[g ahho7, hogy
visszjus.sunk az utolsÓ értelmes műve]etig. Ha egy parancs végrehajtása sen1milyen válto-
7ást nem eredményez, egyáltalán nincs szükség visszavonási műveletre.
Így aztán :1l1ho7., hogy meghatározhassuk, hogy Lh'Y művelet Viss73vonható-c, a Command
felÜlethez h07záadjuk az elvont Revcrsible (Megfordítható) műveletet, amely egy log'kai
(Bool-féle) értéket ad vissza. Az alosztályok e művelet felüIírásával adhatnak vjssza igaz
vagy 11a 11is (trlle-ilse) értéket fUlásidől)en.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 63
P ra cselózmények
A \'isszavoI1ás-újbóli végrcJ1.ajtás tets7c1leges sLintjének támogalásállCJZ az utolsó lépés a pa-
rancse.lőzmények listáján.ak l11egllatárOL1,Sa, vagyis a70n mű,releteknel( amelyel{et végrel13.j-
tottun.k \ragy visszavontunl(+ Eln1élet11en él parancselőzménye]{ lislája vala.llogy így fest:
ré ebbi parancsok
jelen
Mind.egyil( kör eg)'-egy IJarancs (C01TIJnaJld) olJjektumot jelképez+ EIJl1en az esetben a fel-
llasználé) négy parancsot éldott ]{i: a lJal szélsőt először, a 1J1ás()d.iI<3.l rnásoclszor, és így l()-
vább, l11íg a jobb s7élsé5, vagyis 3.Z utoljára l{jad,otl parancslloL neITI érünJ{. A "jelen' felirattal
ellátott vonal jelöli a legutolsé} \'égrellajtott (vagy visS7avont) parancsot.
Az ulcJ]sé) parancs visszavonásáll()Z egyszeruen l11egJlívjuk a7 Uncxccute lnűveletet az utol-
..'
so lJaran.csra:
Unexecu te ( )
jelen
A visszavonás után a Jele11" vonalát eggyel balra toljuk. la a felllasználó (Igy dönt, hOg)7 még
egy l11ú\reletet viSS7aV()n, a balra.l(övetkezé5 parancsra l(crül SOf, és az alá11bi llelvzcl áll elő:
"""IlE
múlt
... ,
JOVO
jelen
T áll1ató, 110gy ezen eljárás egyszer(í iSl11étlésével t(1l111szintíí visszavoná.sra. nyíJik le11etfiség;
a sz'ntel{ számát csupán a paral1cselőzmények listájának llossza ]{orlálc)77.a.
64 Programtervezési minták
Egy éppen vbszavont parancs újbóli végrchajtásához ugyanezt az eJjá "ást követjü k, csak
megfordítva. A jelen vonalától jobbra levő parancsok aLok, amelyek visszavonása viSS7a-
vonható. Az utoljá a visszavont arancs újbóli végrLhajtása úgy tö 1énik, hogy a jelen vona-
Jától jobbra levő elsó parancsra meghívjuk az Execute műveletet:
"'Execute ( )
jelen
ELután a jeJen vonalát jobbra visszük, hogy a legközelebbi Ismét műve et a következő
visszavont művelet lIatását álít11assa vissza:
múlt
jöv6
,..
jelen
Természetesen ha a {övetkező művelet nem egy újabb Ismét, hanem Visszavonás, a jelen
vonalától bak: levő els6 parancsot fogju IC visszavonni. Igy a felhasználó tetsző egesen lno-
70ghat a parancsok között, ha meggondolná magát vagy ki szeretne javítani egy hibát.
A ancs tervezesi mi ta
A Lex' parancsai a Parancs (Command) tervezési minta ajka mazását tüa'özik, ami azt írja
Je, hogy zár 1atun ( egységbe egy kérelmet. A minta a kérelmek kiadásához egységes felüle-
tet követel meg, amely lehetővé teszi, hO,gy az ügyfelek különbÖ7ő kéreneket fogadhassa-
nak, hiszen a fe ület elszlgeteli őket a kére em megvalósításától. A kérelem végrehajtását
a parancs végezheti teljes egészéhen maga, de részben vagy egészben át is ruházhatja
a megvalÓsftást más objektumokra, Ez a Lexihez hasonló alkalmazások számára tökéJetcs J
mert í1'Y a program különbÖző részein elszórt szoJgáJtatásokhoz központi elérést b'ztosít-
hatunk. A minta a Command alapfe ületre építve megoldást nyújt a visszavonás és újbóli
végrcllajtás prol11émájára is.
2. fejezet · Esettanulmány: szövegszerkesztő te vezése 65
2.8 H ly 51 5- II O és és elv I laszt I s
Az utolsó bel11utatandó tervezési probléma a s7öveg elemzését igényli, mégpedig a 11elytele-
nül írt szava]{ olegkeresésél és a szebb formázás érdekében elválasztási p011tok beszúrását.
Az elváráso]{ ."tl ]las()nl()k 1 mint a 2.3 részben betllutatott fo ll1ázási probléllla mega d.ásá-
nálo AllOgy d. sortörési módszerekből is tc)11b lel1etell, a lILlyesírás ellenőrzése és a.2 elvá.lasz-
tási pontok meglldtározása is többfélel{éppell történ11et, vagyis tcjblJ algoritmus támogalá
sára lesz szül(ség, így válas7tllatunk majd, mi a Dntos3.bb: a tá igény, a sebesség vagy
a "minőség". Eme lett azt is el 1{el] érnünk, hogy később könnyen aclllassunk a progra.mlloz
új algoritlTIusol{at.
Az emlftett s701gáJtatáscJk merev bekódolása a dol<:um.entumszer]{ezetl)e kenJ.Jend.ő, még
inkább, mint a for 11ázás esetéllen, mert a llelyesírás-ellené5rzés és clv{.lasztás csupán kettő
azon lehetséges elem7ő műveletek közül, melyek tán10gatását be szeretnénk épíleni
a Lexibe. Természetes, l10gy id{)\rel továbl)i il)len irányú képességekkel s.lcretnénl{ bővíteni
a programot, pé dául keresési lehetőségekkel, a szavak megs7ámláIásával, számológéppel
a táblázatos értékek lJeszúrásához, nyelvtani ellenőrzéssci és így továbl) A Glypll osztályt
és aloszlályail azonban nem szeretnénl{ m.indeJ1 alka .ommal méJd.osítani, amikcJf új szolgál-
tatá.st adunl{ 3.2 al]{almazáshoz.
A kiral(ósjátéknak tulajclc}oképpen két darabja van: (1) 3.2 elcmzendő információ elérése,
amely a dokull1.en.tumszerkezet képjeleiben széL')z(Jrva llelyezkedik el illetve (2) az cle1TI
zés végreJlajtása.. E kéllelada.tla.l külön roglall(ozunk.
Az. elszórt információ e ' rés
SZá.ffiOS elemzéstípusnáJ a s7öveg karakterr61 karaktcrre való átvizsgálására van szükség, az
elemzendő szöveg pedig l{épjel olJje <turnak hierarchikus sherkezetében szétszórva llclyeL:-
kcdil{ el. Egy ilyen felépítésű s7öveg 'vizsgálata olyan elérési módszc11 igényel) amely "is-
meri,t azokat a.2 adatszerJ<ezete]<et, amel)rekben az o11jektumok tárolódnak Egyes képjcleJ
gyermekeiket láncolt listában tárolllatják., másol{ tömböket all{altnazllatnak, megi lt mások
pedig még különlegesebb adatszer]{ezetel<et. Flérési nl()ds7erünknek mindegyik Ic 1c.tósé-
get tám()gatnia kell.
T(Jvá11l.J b()nyolítja a 11elYLctet, hogy a külö.1böző eletnző művelele1\.: más-más mócic)n érik
el az ad.atokal. A legtöbb elemző művelet elejétől végéig járja be aszöveget, de né lál1Y en-
nek ellenkezőjét teszi -ordított ize . esést alkaJma7 például hátulról előre lIalad a szöveg-
ben.. Az alge11rai kifejezések kiértékelése péld[.ul sokszo úgynevezett balról joblJra llaJadó
bejárást Cinorder bejárás, bal rés7fa-gy(jkér-jobb reszfa sorrend) igényel.
Tellát az elérési rnódszernek több dd.als7erkezeltcl kell működnie, és a bejárás lcü!önbö2ő
típusait - előre llaladó, vissza.fe é 11aladó, balról jobbra haladó - is támoaln.unk_l{ell.
66 Programtervezési minták
Az elérés és bejáras gys I gbe zárása
Pillanatnyilag képjcIfelületűnk egész sorslámokkal teszi lehet6vé az ügyfeleknek, hOh
a hryerrnekckre hivatkolzanak. Bár ez ésszerűnek tűnhet a gyermekeiket egy tömbben t3-
roló képjdosztályoknál, azoknál nem túl hatékony, amelyek láncoltlistát használnak erre.
AL elvont képjel-ábrázoJás egyik fontos feladata, hogy elrejtse, miJycn adatszerkezeteket
használ aL adott osztálya b'Yermekek tárolására, hisLen így anélkül változtathatjuk meg az
adatszerkezetet, hogy cz. más osztályokat érinte .1C. Ennélfogva csak a képjel tudjaj mílyen
adatszerkeLetet is haslnál. NyilvánvalÓ, hogy felületének nem szabad egyik s7erkezetct
sem előnyben részesítenie a többivel szemben, tehát a jelenlegi hclYlet, amikor is jobban
illeszkedik a tÖmbÖkhö7, mint például a láncolt listákhol, nem előnyös.
E problémát és a bej:árások kÜlönbÖző fajtáinak támogatását egyszerre oldhatjuk meg. Köz-
vetlenÜl ct képjelosztályokban clhelyclhetünk több elérési és bejárási módszer1, és mÓdot
adhatunk az azok kÖzötti válas7tásra, mondjuk egy felsoroló típusÚ állandÓt paraméterként
átadva. AL osztályok aztán ezt a paramétcrt továbbadhatják egymásnak, hogy btztosítsák,
mindannyian ugyanazt a bejárási mÓdszert has7nálják. Emellett tovább ke/1 adniuk a bejá-
rás közben megszerzett valamennyi információt is. A fenti Jnegközelítést támogatandó
a követkc7Ő elvont O1ííveleteket adhat juk a Glyph felületéhez:
vaj 0_ F lrst (1 l raversdl klnd)
void Next ()
baalIsDone {)
Glyph* GetCurrent ()
vo.d Insert (Glyph*)
A bejárást a FirsL (EIsé5), Next (KÖvetkező) és lsDone (Kész) műveletek vC7érlik. A F irsl
indítja el, miután a felsoroló állandó típusú Il'raversal (Bejárás) paraméterben nlegkapja
a bejárás módját (kind), A paraméter érté .7e CH1LDREN, PREORDER, POSTORDER és
INORDER lehet. Al első esetében csak a képjel kÖ7vctJen gyermekeit járju { be, a másodiknái
a teljes slerke7etet, előrefelé haladva. A Nexl a követkclő képjelre ugrik, az IsDone pedig
jelentést ad, hobry a bejárás véget ért-c vagy sem. A Child (Gyermek) műveletet
a GetCurrent (ElérAktuális) váltja fel, amely a bejárás során éppen érintett képjclet éri el.
Al Insert (Beszúr) a korábbi, hasonlÓ nevű művelctet cscréli le és beszúrja az adott képje-
let az aktuális helyre. Az elelnLés során a következő C++ kódot hasznáIhatnánk egy g gyö-
kerű képjelsz.erkezet el6re haladó bej:.írásáho7:
Glyph* g;
for (g->Fírst(PREORDER); !g->TsDone(); g->Next()) {
Glyph* current = g->GetCurrcnt();
II valamilyen elemzGs
}
MegfÜwclhetjÜk, hogy az egész számokkal való sorsl'ámozást kigyomláltuk a képJel felületé-
ből, így al nem tolÓdik el többé egyik gyűjtcrnénytípus tánlogatása felé sem. Attól is megkí-
méltük aL ü!wfeleket, hogy maguknak kelljen nlegvalósítaniuk az általános bejárástípusokat.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 67
A tneg]<öze]itéssel azonban továbbra lS 1/annal{ gontiok. Először is, nenl képes támC)galni új
bejárá.s. módokat anél]{l11, 110gy (lj értél{cl{l{el egészfte]lénl< ki ct felsoroló típust vagy (lj műve-
leteJ<et írnánk. S-11ebryül( fel, 11og)! az előre J1alacJó lJcjárás egy olyan válto7atát szeretnénk, imi
autornatikusan átug(lrja a nem szöveget Jelölő ]{épjelel<el. Ekkor aTraversa] felsorolát
..
módosítanunk kellene, 110gy tartal na77C)n egyr TEXTUALPREORDER (S70YEGES_ELOllli)
'lagy 113.sonló értél{et.
A rnegle\'(5 d.ek {rá(iók mcgvá.ltoztatását el s7eretn6nk kcrlilrlj. Hl a bejárás1 m()(lszert teljes
egészélJen a C_;lypJl ()sztálylljcrarc11i:á.lJa 11elyezzü1<J m()dosítát,illOZ va.gy lJővítésé11ez való-
SZí11líleg számos osztályt ill.eg l{el] váltc)ztatnunk, :l.Z is ncllézzé váIj]<, llC)h7 más tíPlISÚ ob-
jel(tun1szerl(ezetek 11ejárá.sá110z lljra113.szD.OsítsllJ{, rál(J.ásul cS-lk egy folyalJlat11an ]ev{S bejá-
rás JeJletségl.s.
Ismét csak jobb megoldás 3 váll()Z() lén}'CZŐ cgység11e zárása e7 peciig ebben az esetlJen az
elérési és hejárási In(JdsLcr. Ezért bevezetjü]{ a Bejáró (ltclator) objektuI11()k ()szlályát,
amelynek cgy<.:tlen feladata a kÜlÖnböző bejárási mÓdszerek meghatározása, Öröklés segít-
ségéve] egységesíljlil( a küJÖI1L1Ö7Ő aclatszerkezctck clérését és tátllogatjlll{ iZ új bcjá.r:lsi
mé)dszcrckct is+ Így nem kell megváltoztatnllnk a ](épjeJfelülelel{et ,'agy 3. k0pjelel( 111egva-
lósítása it terl-lelnLink cLzcl 3 fela.da.tta]
bej
-- . .
- - Iterator
- -
Fírst()
Next()
IsDone()
Curren tJtem()
J\
P reorderlte rator Array terator Li stlterator N ulllterato
árók
FirstO Ftrst{) First() Fi rst()
Ne xt() NextO N extO N ext()
'sDoneO - sDoneO IsDoneO tsDone() o - "-
Gu rrentttG m{) Gu rrent ftem() Currentaem() Gu rre ntl tem ()
.. .. ..
öker eu rrenttem
return tru
.... -- GJyph - --
- - .... -
-
--
. . .
Createlterator{) 0- --....---- return new NuUUerd10r
-
I
I
I
I
e
2. 13 ábra
Az Iterator osztály és a/osztályai
68 Programtervezési minták
Az Iterator os 'ly és laszt yal
Az elérés és bejárás köúJS felületét az Iterator (BejárÓ) nevű e vont oS7tály llitározz3 meg,
A konkrét alosztályok közül a7 Arraylterator (TömbBejáró) és a Listiterator (ListaBejáró) e felület
megvalósításával a tömbök és lbták elérését biztosítják, míg a Preorderlterator, a Postorderlterator
és hasonlók az egyes szerkezetek bejárását. Mindegyik 1 eralo alos7tályegy hivatkozást tartal-
maz arra a sze cezetre, amit bejár; példányaik létrehozásukkor eJ:t a hivatko7ást kapják keL.déS-
értékül. A 2,13 ábra az Iterato · osztályt és néhány alosztályát mutatja, MegflgycJhető rajta, hogy
abejárók támoga12sához aG yph osztályhoz adtunk egy CreateI-erator (LétrehozBejárÓ) nevű
e]vont műveletet.
A bejárás vezérléséhez az Iteralor felület a First, Next és IsDone m(íveleteket biztosítja.
A ListIterator osztály F.rstmeb'Valósítása a lista cls(5 ele nére 11lUtat, a Next a listában k()vetkL
7Ő elem e lép, az IsDone pedig aLt adja vissza, hogy a Hstamutató az utolsó elcmen túlra mu-
tat-eo A CurrentItem (AktuálisE em) a bejáró livatko7ásának követésével a livatkozott képje-
let adja vissza. A7 Arraylterato. oSLtály feladata hasonlÓ, de cépjelek tötnbjére vonatkozi (.
A képjdszerkezet gyermekeit most már anélkÜl érhetjük e, lOgy ismernénk a szerkezet áb-
rázolását:
Glyph* gi
lterator<Glyph*>* i = g->Createlterator() ·
for (i->First(); i->IsDone(); i->Next(}) {
Glyph* child i->Currentltem(};
1/ csinalunk valamit az aktuálls gyermekkel
}
A CreatcIterator alapértclme7és szerint egy NullIterator (Nu IBejáró) példányt ad Vlssza.
A Nulllte ator egy csökevényes bejáró a gyermekkel nem rende kező képjelek, vagyis a le-
vél képjclek s7ámára. A NullIterator lsDone művelete n'ndig igazat ad vissza,
A gyerme {kel renddkező képjel-alosL.tályok felülbírálják a Creatdteratort, Ígyegy másik
Iterator aJos2tály ehty példányát adják vissza. A7, 10gy melyiket, attól fÜI:,g, Jnilyen szerkezet
tárolja a gyermekeket. Ha a Glyph Row alos2tálya gyermekeit példáu a _children nevű
listában tárolja, CreateIterator művelete a7 alábbiboz hasonlóan fog festen':
Iterator<Glyph*>* Row: :CreateJterator () {
return new L.stIterator<Glyph*>(_children);
}
A7 előre haladó és ba TóI jobbra haladó Cinorder) bejárások képjelfüggő bejárÓkkal (o]goz-
nak. Ebejárókat a bejárandó szerkezet gyÖkerében levő képjel adja meg. A bejárók meg-
hívják a CreateIteratort a szerkezetben evő képjelekre és az eredményként kapott bejáró-
kat egy verem segítségével :rövetik nyomon.
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 69
A )reof{Jerlterator osztály például megszerzi a bejárót a gyökér](épjeltől t beállítja, l10gy az
első e em.ére mutasson, majd a verem tetejére helyezi:
void Preorderlterator::Firsl () {
Iterator<Glyph*>* i = _root->CreateIteralor() i
if (i) {
i ->Fi rst () ;
iterators.RemoveAll() ;
iterators.Push(i) ,
}
}
A CurrentJtem egyszerűen meghívja a CurrLntltcm-et a verem tetején levő bejáróra:
Glyph* Preorderlterator: :Currentltem () const {
return
iterators.Size() > O ?
.terators.Top{)->CurrentItem() : Oj
}
A Next művelet veszi a verem letején levő bLjáról és első clemét eh')' bejáró lélre110zására
utasítja, 110gy olyan messzire nyúlhasson a l(épjelsze l{ezetben, amenn.yire csak lehet (végül
is előre ha acJ() lJejárásrc)1 van szó). A Next az új bejárót a bejárandó szerkezet első elemére
állítja, majd 3. verem tetejére llelyezi. Ezután a Next ellenéSrzi a leguté)h11j lJejáréJt: 113 IsDone
rnűvelete igazat acI viss7a, az aktuális részia (vagy levél) bejárását befejezettnek te {inthetjük.
Ebben az esetben a Next leves7i a verem tetején lev{5l)ejáré)t és ad.dig smétli a fo yamatot)
anlíg csak teljesen be nem járt szcrkczetel<et t3.lá.l+ Ha elfogytak a bejárást befejeztü]{.
void Preorderlterator::Next () {
Iteralor<Glyph*>* i =
_iterators.Top()->Currentltem()->Createlterator() ;
i->First() ;
iterators.Push(i) ;
whi le (
iLerators.Size() > O && iterators.Top()->lsDone{)
) {
delete _iteratorsPop();
_iterators.Top()->Next() ;
}
}
Fib)lcljük meg, 110gy az Iterator osztályll'erarchia hogyal1 teszi lel1.etővé, 10g)7 új fajta lJe-
járásc)kat adjunk megj anélkül, 110t,y a képjelosztályolcat módos"'tanunl{ {ellene egysze-
rűen új Iterator alosztályo]{at l107unk létre, majd megadjuk az új bejárási mód.ot, mint
o Programtervezési minták
a PreorderIlerator-nél. A képje -alosztályok ugyana7t a felületet has7nálják, hogy az
ügyfelel{ a gye Jneke <et a ta.rolásuk -a 11as7D.ált adatsze .keLetel< felfcd.ése nélkül ér]1essCl<
e · Miután a bejárák a bejárás állapotát mabuk is tárolják, egyszerre több bejárást végez-
hetünk, akár ugyana on a szerkezeten. EmeJlett - bár a pé dában <:épjelszerkezeteket jár-
tunk be - a PreorderIterator-ho 1asonló osztályoknak paraméterként átadhat'uk az
objektumok típusát, 'Sy a kódot újrahasznosítva más sLcrkezeteket is bLjárhatunk.
A C++ban erre sablc)Dolcat alkalrn.3.zná11](.
'" , .. .
ej ro tervezes minta
A Bejáró (Iterator) n1ínta az objektumszerkezetek elérését és bejárását támogatja. Nem csak
Öss7etett sZerkezetek esetébcn alkalmazható, de gyűjteményekre is. Elvonatkoztatja a bejá-
rási algoritmust és elrejti a bejárandó objektumok belső szerkezetét a7 ügyfelek elől. Vagyis,
a Bejáró minta ismét csak ar 'a példa, hOb'Yan érhetünk el nagyobb rugalmasságot és újra-
hasznosíthatóságot a váltoLó elem egységbe zárásáva . A bejárás kérdésköre persze 'ge 1 bo-
nyolu]t, e d minta szerencsére az itt ben1ulatottnál s()kl<al több mindenre h.3.5zná.lllató+
B j ás V gy e"árá m ve etek
Most, hogy rendelke7ünk cSy módszerrel a képjels7erkezet bejárására, e]]enőri7hetjük a he-
lyesírást és az elválasztát. Mindkét eleJTIzés információk gyűjtését igényli a bejárá közben.
Először is el kell döntenünk, hová helyezzük a7 e emzésért felelős kódot. ;ehetnénk példá
ul az Jterator osztályokba, így .lZ eemzést a bejárás szerves részévé tennénk. nnéJ azon-
ban nagyobb n galmasságot és Újrahas7nosítl atÓságot érhetü 1k el, ha a bejárást és a bejá-
rás kÖ7ben vég7ett műveletekL elválaszt juk egymástól, már csak azért is, mcrt különböző
e emző mÜveletek igényelhet' { ugyanazt a fajta bejárást; ennélfogva ugyan.lzt a bej(róhal-
lllaZl különféle eJelllzésekhez has. nálhatjuk. Az előre haladó bejárás például szárnos elem-
zés a apja: ilyen a 1 dyes ás-ellenőrzés, az elválaztás, az elő oe haladÓ keresés vagy a S7a-
va (megszá.mlálása.
Te .lát dZ eJemzés és a bejárás legyen egyl11.á.stól független. De akkor kire rU]lázzul{ a7 e .em-
zés felelősscgét? Tudjuk, hogy tÖbbféle elemzést is végezni s "eretnénk, melyek mindegyike
a bejá 'ás más- nás pontján hajt végre műveleteket. Az clem7éstől függően egyes képjelek
fontosabbak lehetnek másoknál. ITa a helyesírást ellenőrizzük vagy szavakat vá asztunk el,
a karakter képjckket szeretnénk figyele nbe venni, és nem a grafikusakat, am'lyenck a so-
ro <: Vb'Y a bitképek. H't szín alapján válogatunk, nyilván a láthatÓ képjelckre, és nem a lát
hatatlanokra esz szükségünk. A különböző elcm7ések során tehát más- ná képjeleket
elemLünk.
Egy adott elemzLsnek nyilvánvalóan különbséget kell tudnia tenni a különböLő képjel-
tipusok közölt. Így kézenfekvőnek látszik, hogy az elem7.ő képességgel magukat
a J T épjcloS7tá yokat bővítsük. Mondjuk nlinden elemzésLípushoz egy vagy több elvont JllŰ
velLtct 1atá ozunk 1 eg a Glyph oS7tályban, az a osztályok ped'g ezeket a7 e elllzésben ját-
szott szercpüktől függően valósítják me ö .
2 fejezet · Esettanulmány: szövegszerkesztő tervezése 71
E7zel a Dleg]<ö7elftéssel a70nLlan az a gon.d., h.ogy Dl1nden (lj elclnzéstí}JUS csetében l11Ódo
stanunk l-cell aL ÖSSZ<:S l{épjclosLtályt. Egyes csc:tckben ezen enyllítlletüllk: pélci-áuJ ha al
elemzésben cSlk ](evés osztály vesz részt t vagy 113 az elel11zést 3. legtöbb oSLtály azonos
módon végzi, az elvont művelet eg)' a.1a!JéltclmcLctt megvalósítását megati11atjuk a GJypll
osztályban. E7 lefel né az alaJ1esetekel, és szüJ<ség esetéo. csaJ<. a Gl)Tpll osztályt l(cllcnc lnó-
(losít3.ni 'Iletve azokat az a.losztá.lyoJcat t amelyek eltérnek aL alapértelmezetl visell{ed.ésl(51.
De nlég 11a az alapértelmezett JJlegvalósítás csökl<enti is a szükséges változtatások számát,
ma.ra.d egy gond: a Glypll felülete lnind.cn hozz{laJcJlt elemzési kél)ességgel né5, e7eJ< pedjg
időlel eJfedik d. GIY1)11 a121Jfelületét. Nel1éz Jesz lnegI13tá.rOZ11i, Ini is a képjel crecl.ct. célja:
a mcgjclenítllctő, a.1akl{a.1 rendcll<czó olJjekt.llffiok megllatár()zása és ren(ls7erezése. A felii-
lel elveszik a ,)zajllan".
elem és e ysé be ' rása
Úgy tűnik tehát, az elemzést mégis csak külön objektumba kell zárnunk, ahogy eddig is tet-
ttik. így eg)T aci.cJtt elemzés ké)cija saját OSZl{llyha kerülJ és enn.eJ( az osztá.lynaJ{ egy pélclá-
nyát h.as7nálju]{ m.ajd a 111.egfelelő bejáróval a.mi a pélclányt 3. sLcrl<czct egyes kélJjeleille7
szállílja)', allol az elemLő ()l)jeklum l l)ej{trás pc)ntjain elvégzi a nllloJ{áját. A bejárás előre-
haladtá\'al az elemző inform.ációt gyűjt (e11ben 3.2 esct}Jcn karal\..t.crckct):
bejáró
. II". .
".1 :.- ." .:...::.::.:..:....:.:.......
. .1.:.:.:.:.:;.::..
.........
". :..
elemzá
LL" ":::1 .". ".o. .1.... ....:...;.... ...o....
II -.:"
...:.... :.......
..\.
'-
\.
".o.
-..o.
Ua II
2
".
"::
:::.
,.
:
\
'.. ..\.
-.":.. I"
"\ ..:.-
.. ).,.""" ,.....,....",."",'\:'
.:.:
i,
\.
..
,:.,.
}
..II"
,!.
...
\....
..\.
"i:
.:h
\;.
,/;.
.,.
...
.... "\.:..."'.:":..,. 1"
....11.'... . o..",.. ,,:I .
.1-... ......:...
.1". ....
. ....
".:\ .
,:
\
..
3
}
:::;
..'ö
...
\'
".:.. .:..
,
....\ .,J:\
:.:::'.. \:'0:..\..:.".:, ,,::.,,::. ",;:' ..(':..
":. ."."
f. "\
:.. .. \
.-.o.
1::
,'.
',i
...
. ..... ...\;:'1,....".:,........",\,..
........... .".1".
d=......... ..-:::....=:-
"
'\.
..,
-.:".
5
"
'"'
..o...
'..
.\. ...
.'\..:.. .::.
1. .l'I1......
..\..:.:..... -. "- .......:.......
:
"
:::
,..
...
1:.::
.,\
:.o-
I . .L':
:..:....II..:..........:.....II....:....:i.
.)'.:.:
o.::.
,::( II
"
.'.\...
II \
:.:
4
/.
..'.
;., II
.::
".:..
.....
";...
..:.:-..
\:::. .. :..:11..:...:.....:.....
\'..., ".. . ,..:;..
"'"" .
.:: .....,:...
...\.
.:.
\.
II \
,\
:1"
.......-.. .".":_ o" ::...
.;.
;;.
.l-::
.:.
.:....::.
}::
Ji
"
..:...
.:..... ...::.
..... .......
. .....:.....' -:1.:. C :.,I..::....
..
:......
-
2 Programtervezési minták
Az ala vető kérdé eZ7e a mcgközel"téssel kapcsolatban az, hogyan különbözteti meg az
eletnző a különféle képjeleket anélkül hogy típusellenőrzést vab'Y -átalakítást végezne
Az aLább>hoz lasonló (ál)kód megjelenését a SpellingChecker (Helyesírás-ellenéSrző)
osztá yban el szeretnénl{ kerülni:
void SpellingChecker: : Check (Glyph* glyph) {
Character* c.
Row* r;
Image* ij
if (c = dynamic_cast<Character*>(glyph)) {
/1 a karakter elemzése
} else if (r = dynamic_cast<Row*>{glyph)) {
/ / előJ<:észület r gyermekeinek elemzésére
} else if (i = dynamic_cast<Image*> (glyph) ) {
II semmit nem csinálunk
}
}
Iz meglehetósen csunya {ód, ami olyan kerülendő műveleteken alapu , mint a típusbiztos
átalakítás Cdynamic casL), áadásul nel ezen bővíthető és a Glyph osztályhierarchia módos"-
tása esetén a fent' függvény törzsét 's módos'tanunk kell. Pontosan a a fajta kód, a 'linek
elkerülésére az objektumközpontú nyelvel{et megalkották.
Tehát a nyers erőfitogtatás kerülendő - de hogyan? Néz ük, mi történik, ha a G yph osztály-
hoz a következő elvont nűve etet dL juk:
void CheckMe (SpellingChecker&)
A CheckMe-t (EHenőri Engeln) a G yph valamenny' alosztályában a kövcLke7őképpen hL-
...
tarozzu ?" meg:
vOld GlyphAlosztaly::CheckMe (SpellingChecker& checker) {
checker.CheckGlyphAlosztaly(this) ;
}
A fenti 7ódban a GlyphAlosztaly 1 elyére a megfelelő alosztály neve Jrandó. E azt jelen
ti, hogy amikor a CheckMe htvására SOf {erül, a7 adott alosztály >s nett - végül is az egyik
műveletében vagyunk. A SpeU'ngChecker oS7táJyfelükt cserébe minden Glyp 1 alosztály-
hoz 10 tarta maz egy CheckGlyphAlosztaly vagy }1asonIó műve etet.
tO Ha függvény-lúlterhelLst alkalma7unk, eLen tagfüggvények mindegy"kének ugyana _1 a !levet adhat juk, hi-
s....cn a paramé ereik úgyis mgkülönbö7lctik ől{et. Itt azért !(a!Jlak különbö ő nevel, hogy különbségeikct
l1angsú lyozzuk,
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 73
class SpellingChecker {
public:
SpellingChecker() ;
vi-tual void CheckCharacter(Character*)/
virtual void CheckRow(Row*)i
virtual void Checklmage(Image*) i
II .. .68 így tovább
List<char*>& GetMisspeJlings();
protected:
virtual boal IsMisspelled(const char*);
prlvate:
char _currentWord[MAX_WORD_SIZEJ ·
List<char*> _misspellings;
} ;
A SpellingChecker ellenőrző művelete a Character képjekk esetében valahogy így
festhet:
void SpellingChecker::CheckCharacter (Character* e) {
const char ch = c->GetCharCode();
if (isalpha(ch)) {
1/ betűkarakter hozzáfűzése a currentWord-höz
} else {
/1 a karakter nem betú
if (IsMisspelled(currentWord)) {
1/ a _currentWord hozzáadása a _misspellingshez
_misspellings.Append(strdup(_currentWord)) ;
}
_currentWord[O] = '\0';
1/ a currentWord visszaálJítása a kövelkező szó vizsgálatához
}
}
Észrevehetjük, hogya GetCharCode (LekérKarakterKód) művelet csak a Character 05Z-
tállyal működik, így a he]yeírás-ellenőrző a különböző alosztályokhoz kapcsolódó műve-
leteket anélkül végezheti el, hogy típuscllenőrzést vagy -átalakítást kellene végeznie, va-
gyis az objektumokat egyedileg ke7elheti.
7 Programtervezési minták
A Cl1.eckCharacter (EllenőrizKarakter) a l)etűkara}.clere]{et a- currentWord ( al<luális-
- -
Szó) átmeneti tárban gylÍJti össze. fIa nem bettl karakterrel, péld1iul egyaláhÚ7.ásjellcltalál-
....
l(ozik, az 1 sMi s s pe II ed (f Iil18.sanlrl) mlÍvelet segltségé\'el cllené5rz.i 3. tárlJan levő szó
hclyesírását t1 . Ha a s7ót helytelenül írták, a CheckCharacter hozzáadja azt a rossLul irt
szavak listájához, rnajd kiüríti a _currentWord tárat, hogy helyet csináljon :1 kÖvetkező
szónak. A llejárás végeztével a ile lylelel1.lil írt szavakat a Gc tMi s spe II ing s (Szerez-
llel),telencl() ill űveI ettel kér(Jezl1 etJII l( le.
Most már bejárhatjuk a dokumentumot: meghívjuk a CheckMe mlívelctet minden képjelre,
argumentumként pedig a helyesírá,,-ellenórzőt adjuk át neki. Ez minden képjelet azonosít
a Spellil1gCllccl<er szánlá.ra. és az eJlenórzőt elc)re lépteti:
SpeJlingCheckcr spelllngChecker;
Composition* c;
;I ...
C 1 \"p II * g;
PrcorderTterator i(c);
for (i .}'irst(); !i.IsDone{); i.Nexl{)) {
g = i.Currentltem();
g->CheckMG(spellingChocker);
}
Az alábbi egyÜttműkÖdési diaglalTI azt mutatja be, hogyan dolgoznak egyÜtt a Ka -akter
(Character) képjelek és a HclyesírásEllenőrző (SpellingChecker) objektum:
egyKarakter (IIaU)
másikKarakter e l _ U )
egyHelyesírásEI enórzo
ElIen6rizEngem( egvHelyesf rásElle n6rz5)
EllenórizKa rakter(thi 5)
SzerezKarakterO
EUe n6nzEn gem{ e gyHelyesf rásEllen Órlő)
SzerezKara kter()
teljes szof
vi sgál
Ellen6rilKara kter(this)
1 Az IsMisspdkd valósítja mLg: helyesírás-cllentífző algorilmust, amit itt nem rés'ldezÜnk, hiszen rÜggetlenítcl-
lük a LCAi fe1él)ítését()1. l\. SpellingChcckcr-ből alosztályokatlétrel10zva, vagy a Slratégia nliJ1t 11 Ca 2.3 részbel1,
a fornlázással J<alJcsolalban l""Jcrrlutalotl módon) aH(ahnazva 1<ülönb()z(5 algoriLnlusokal tálnogathalunk
2. fejezet · Esettanu[mány: szövegszerkesztő tervezése 75
A Jl1Ódszer l11egfeJel a l1el)resírási 11.i1Ják meglalálására, de llogyan segítllct a.1Jban, 11()g)'
többféle clen1Lésl tál11ogassunk? Jelenleg Ú tűnik, a G]ypll-et és a.losztálYlil minelen eset-
ben ki ]<e] 1 egészítenünk eg)' Che c kMe ( Sp e III ngChec ker & ) -11ez 11asol1ló 111Ű velette1, lIa
új elemzési módsLcrt építtinl{ a prc)granlba. Fz így is val1, 1ll3.f 113 ragaszkc)d.unl< a]-11107 t
ll()gy mincien eJem.zéshez ó11álló osztá.ly ta.rtozzon Azt viszcJnt sernT11i nenl in.dokolja, hogy
ezen osztá.lyoknal<. ne legyen közös felülete. 1 la kés7ítün]{ egyr iJ)ret, kil13.s zn5.l 1 lat juk a tCJ1111-
alakúság előnyeit, vahryis a CheckMe (Spell ingChec]zer&) -llez llas()nléJ, az eleülzési
Inódtól függő műveleteket egy ol)'an clclnzésfüggetlen n1űvelettel vá.ltl13.tjllk fel, i111i álta
lánosabb pararnélcrt vár.
A Visitor os ály és los ' yai
A látogató (visitor) kifejezéssel általánoss2.gban olyan objektLlmol< oszt{llyára utalunk 3 l(ünyv
ben, amclyek bejárás közben más (JIJjektulTIoJ<at .látogatnal{ ITIeg': és ott valamil)'en rnŰveJe-
let végeneJ<12. Ebben az esetbe 1 eg)' ol)ran Látog'ató (visI tor) osztályt Izészítünk, ami
a l{épjelcl<. "meglátobatásánil{' elv()nt feliiJetét ]latározza 111eg:
class visitor {
public:
virtual void visitCharacter(Character*) { }
virtual void VisitRow(Row*) { }
virtual void Visitlmage(Image*) { }
/1 és így tovább...
} ;
A Visi Lor kc)nkrét alC)Slt{l]yai ki.ilönlJöző elemzéseket végeznek. A 11elyesírás-ellenőrzés
el\régzésére lJéldá.ul létrcllozllalunk egy Spe II ingCh ee k j.ngV isi tor (1el)resírásIi len-
órzőLátogató) al()sztálylr az elválasztásra pedig eg)' Ilyphena L lonv isi tor (Elv31asztás
Látogató) ne\iit. A SpellingChecJ<lngVis i tor osztályt IJontosa.n ugyanllg)T \lal(JsÍlaná]lk
meg, rninr fcljcl)lJ l SpellingCheckel-t, azzal '-l.z eltéréssel, l1()gy a műveletek neve az ál
taláJl0Sallll Visi tor felületre uta.lnának 1 pél(Jálll a CheckChayacter a Visi tCharac Ler
(Látogltl(arakter) nevetl<allná.
Mivel 3. CheckMe azon látogatók szánlára, akjJ( n.eJl1. el1el1.őrizncl scmmil l1em l11egfe] elő,
a llel)Iénvalé)1111 Accept (Elfogad) l1evct adjul( neki. ArgLlmentumánal( lS n1eg l{cll változnia
(Vi si tor&), 11og)! tül<:fözzc, bárn1ilycn lát()gat{)t e]f()gad+ Ig)! egy (lj clelTIzési m()(l.szer ll()7-
záadásáll()Z csal\: létre 1< el 1 ]loznunk a Visitor eg)' új al()sztáJyát - eg)retlen. kélJjel-
oS7tál'),rll07 se.111 kell110zzá.n)íúlnunk. A jö'vőbeni kiegészítése1< támogatásállOZ ezt az eg)'el-
lcn l11űvclctct l<.cllllozzáad.nll.nk a Glypl1.-11ez és alosztáljrailloz.
Már lá.ttu!(, llugyan lnűködik a Jlelyesírás-elleJ1Őr7és. A I-Iyphena t ionv isi tor'-11an a szö-
veg b ryífjtésllez J1asonló 11l.egközclítést all(almizunk, ele lmi]{or 3nI1al{ Vi sitCharac Ler
12 A J.n1g]áh}gat' kifejezés az .,elen1ez általánosa1)b vált()zata, arnit a llan1ar(JSa1.1. belnutalandó tervezési Jninta
szóllasznála la ban all<alo1a7u nk.
76 Programtervezesi minták
művelete megtalált egy leljes szót, kissé másképp működi . Nem ellenőfli, hogy he yesen
írtá{-e a szót, 1anem egy elválas tási algoritmussal fficgá II apít ja benne a lehetséges elv.:Í-
las7tási helyeket, ha vannak ilyenek. E7után lninden e válasLtási ponton beszúr egy elválasz-
to (é )je et az összet[le be Az elválasztó képjelel( d. Glyph osztály Discretionary (r:lvá
aszté)) a osztál yán ak példá TI ya 4
Az elválasztó képjelek két eleképpen jdenbetnek ITIeg, attó fÜggóen, hogya sor utoiso ka-
rakteré ől van-e szó. Ha igen, az elvá asztó egy kötője formáját ölti, 1a nem, rejtett elem
lesz belőle. Az elválasztó szüló'e (egy Row, vagy"s Sor obje tum) ellené5rzésével állapltja
meg, hogy a utolsó gyermek-e a sorban, es ezt az el e 1Ő -zést mindig elvégli, amikor meg-
hívjá (, llohI"f rajzolja ki magát vagy számítsa. k a helyét. A formázási mód.s7er az elválasztó
kat ugya lÚgy keze i, mint az üreshelyekel Ctérközöket), vagyis lehetséges sorz.:iró .arakle-
rek {é 1t. A következő diagra II azt mlJtatja, hogyan je enhct meg egy beáhT}'azott elválasztó.
.\'.'.'\ .:. .:.. ..:......
\\:::: :.3M \,..;.:;'
"',...\ ':1i'.;.-..)'r- 'x.:...":....
........:...........:.".
..!,.:.' . -, .,.... .
.".. ......
. \
\ 1'" II ..
l
. r.
: \ .,.
. 1;.
.
.\\ A'
;-\. .,,11'.'
......................111
,.\,...\..,\).......-.,
",.,..,., -\,\...
f" '-1.\\
i \
!. I II.
.
\\\., d.. ifJ
.....\; ,.:..
.......:......;.Iv.;l............. .
eNálaszt6
........\.,."...................""'%, 'it\,
,"'" .\..
t. ...,
( III )
..\ I
\\..... II....
"'-\ ....\\\
'\:,-..'n.,u.,:I......,'..
............[IIOu....".,.........
il\... .\\.\J,\.
; \l.;-
III n\
:. 18
. ".
\ .l
c,;. .J.'.
::." )..\'_.
. ..........to. .... .,".
.........L.............
.' ,,,,,........'..........,,.,...."".,1,\,,..
iif!' \\0...
.{ II ,
\ . ;
f
. lj
, "
.... ..
'\.. \..-(iiiI
.................I..I
;.,'::'IL. :'..-.;;. ..:';\:..
'.....:.w. .\.:. .:\\'.- ,..\\.\.
t.\,..,. ,..::..,\\, \..:.:')
.. 1;." ..,....', v.:,\\. '.
---------r
I [
I lium oy I
I--------_J
vagy
r .......---- - ---.......-- -- - -.................,
--------II
t 1 . I
[ uml m a - I
I f___ ___J j
I --------I
Ir y : :
I ---------------------_-J
A latoga ó terv SI minta
.Amit fenteb1) vázoltunk, ,-1 egy pé da a Látogató (Viilor) tervezési linta dlka mazására.
E mintában a korabban bemutatott Látogató (Visilor) osztály és alosztályai játszanak kulcs-
szerepel. A mOnta Jényege, 1 ogy segítségével a l(épjelszer](ezetelc tets7ő eges számú elem-
ését támogat lat juk, anélkil, ho!,'Y magukat a képjelosztályokat móc osítanunk kel erre.
A látogatók masik hasznos s olgáltatása, hogy nem csak a fentebb bemutatott, öszetétel tí-
pusú szerkezetekre alkalmazható {, hanem bármilyen objektumszerkezetrc, vagyis halma-
zokra, listákra, SŐl, irányított körmentes g 'áfokra 's. Ráadásul a ]átogató á la] ] eglátogatha-
tó osztályok nem fehétlcnül kell, hogy egy közös szülőosztá yon keresztül kapcsolatban
álJjanaJc egymással, vabyis a látogatók osztályllierarcJljákon átívelve is 11asznál11atók.
A átogató minta alkalmalása előtt egy fontos kérdést kell feltennnÜk magun {nak. lely
osztályh'erarchiák változnak majd a leggyak abban? A minta ugyan's akkor hajlja a egtöbb
hasznot, lIa a stabil oS7táJyszer {e elle] ren elkező objektumokon so úélc m(íve etet szeret-
2. fejezet · Esettanulmány: szövegszerkesztő tervezése 77
nénl( végrcllajtlni. Egy új lát()gaté) l()zzáad.ása ne!11 igényl 110bY)'11()7Zányúljun1{ elll1ez a.2
osztályszerke7etl1e7 J anli kü]ön.ösen 3.l{1{or jön jól, lla a 11ierarcllia nagy méretű. Amikor
3.zonban a szerkczcthLZ (lj alos7tál)l()kat aciun](t J)1.inde 1 látogató felületet frissítenün ( l{ell,
110gy tartalmazzák a7 új (Js7tály Vis it. .. .. (Lá t aga t .. .. .) n1űv'elelét. Példánkban ez azt je-
lenti, 110gy l1a a Glyph-ből Izé néven eh7 új oS7táJyt ]10zun!<: létrc 1 2. Vlsitor-t és aJlnak al-
osztályait is módosítanunk l<el1, }10g\7 tartaltl1azzák a LáLogatIzé műveletet Jelenlegi tLr
vezésÍ céljajnk azonban. inkább a.zt valoszínűsítik, 11()gy a Iexjt .11kább uj cIc nző műveletel<-
kel, SCffilnint új képjelekkel bővítjük majd, így a Iátogató minta lnegfelel az igényeln]{nek+
..
2 Oss e oglalás
A Lexi tervezése során nyolc tervezési mintát alkablla7tunJ<:
· az Összetétel mintát a dol<umenl.um fi7il<ai S7e kezetének ábrázolására,
· d Stratégia mintát a l<üJönböző formázási algoritn1us()k tátnogatására,
· a Díszítő l11intát a felllaszná.lói felület rinCJffiítására,
· a.2 Elvont gyár illintáttc)lJl)[éle Inegje]enJtés'. szalJvány támogatására,
a IIíd ill.intát a ki..i]önféle abla.kkcLclő rendszerel<en való futásl.oz t
· d. Parancs mintát l visSZaVC)llható felh.as7nálói művele ckllez,
· a Bejáré) tnintát az obje]{tulllszerkezetel( e16réséllez és l1ejárásálloZ,
· valatnint a Látogató mintát, a01i tetszőleg'es szálnú elemzési l(épesség 11eépítését tette
lel1etőv[ anéll<ül, Jl0g)T a dol{umentulllszerkcLet mehrva!{)sítását bonyolította volna.
Egy+k terve__ési minta all<almaz}1atósága Se!11 szorítl\:oLik a Lexihez 11ason.ló szövcgsLcrkesz-
tő pr()grarnol<ra. A legtöbb alkalma.z3.sban lelletőség nyílil{ a]{ár többncl{ a llasználatára is,
persze nen1 feltétlenül ugyanezekel a feladatok3t megoldandó. Egy pénzügyi elemző prüg-
ramlJan jó sz()lgálatot tehet az Összetétel n1inta r d l1efel-ctetési partfal + ók össLcállításánál;
egy fordítóprogramban a Stratégia mintát all{a.lmazllatjllk 110gy klilc)nbc.J7(5 célrendszcrcl(re
más-más regis7terfoglalási módszert lJiztosítsunk; a grafikl1s felllaszná.lói felületű all<alIna-
7ásoJzlJan pedjg valószínűleg szükségünk les7 legalálJl1 3 Díszítő és a l)arancs mintára, l11int
ahogy az itllJemulaloll s7c)vegszer]{esztő programl)an is.
Bár a Lcxi kapcsin SZá010S terve7ésj kére és felmerüIt) ezeken kívüJ ITI.ég sol( léteLil(, ame-
lyekel ne 11 érintettÜ.11k. A l{önyvbcn azonban nem csal{ az ernlített nyolc lerve7ési 11intát
tárgya.ljul{ és mindegyol( ismertetésénél érc e.mes elgo 1dolkodni az()n, l10gyan ]lasznosít-
llatnánk a Lexi eseté11en - vagy JJ1.ég inká.blJ saját programjlinkha11+
A-
.
.. e I
.
I ·
· · 1. U .
.
r-
.1
. .
I ml
.k
r
r
A létrehozási minták a pé dányosítási folyamat elvont ábrá o ásai. Segítenek függetleníteni
a rendszert a benne lévő objektumok létreho ási módjától összeállításától és n1egjelenítésétől.
Az osztáIyletrehozási minták örc)klés útján módosítják azt a os táIyt, amelyből példány ké-
szül, íg az objektum létrehozás. minták átruház ák a pé dányosítást egy 1 ási objektumra
A létrehozási mn ák a kor válna pr fontossá, amikor a rendszer a fejlődés során elke d job-
ban függni az ob-ektumok összeált.tásátó , Ant a OS. tályörökléstől. Amikor e meg örté
nik, a ényeh dthelyeződik a rög 'tet viselkedéshalnlaz á andó jellegű bekódolásáról az
alapvető viselkedésmódok olyan kisebb ha ma ának meghatározására, a 1ely beépíthetó
akárhány összetettebb halma ba. E által adott visel'J'"edésű objektumok lét ehozásáho7
többre lesz szüksé ö pusLta osztá ypé dányosítdsnál
Ezen mintáknak ké visszatérő ism érve van. Az eső, hogy mindegyikbe be van ágya va an
nak ismerete, hogya rendszer valójában po tosan mely osztalyokat asználja) a másik,
hogy elrejtik, hogy ezen osztá yok pé dányait hogyan hozza étre és rakja össze a rendszer.
Nagyjából minden, ami a rendszer ezekről az objektumokról tud, az, hogy milyen fe ületet
határoznak meg hozzájuk az elvont os tályok. En.nek követke ben a lctrehozási m- ...tá. 7
nagy rugalmasságo tesznek lehet6vé annak te én, hogy mit hozunk lét e, ki h07za az lét
...
e, hogyan és mikor. Igy kia akí ható egy olyan rendszer, amely rendkívül vá tozatos fe épí-
tésű és szerepű objektumokat termel'). A kialakítás lehet stat-kus (a7az fordítási időben
megadott) vagy dinamikus ( utasidőben megadott)
A létrehozási osztályok néha versenyeznek egymással_ Vannak például olyan esetek 1 am+ko
a Protottpus vagy az E vont gyár ga daságosan használható, más Tor v+s ont kiegészítenek
....
más osztályokat: a Epítő más mintákat felhas nálva valósíthatja meg, mely összetevők legye
e 7 elkés ítv"e. A Prototípus mnta sdját megvalósításához az Egyke m.ntát hasLnálhat.a fe .
82 3. fejez t · Letrehozási minták
Mive a létrehozási minták rendkívül közeli kapcsolatban állnak egymással, mind az ötöt
együtt tanulmányozzuk, hOhry megtudjuk J miben hasonlítanak J és miben kü önbÖ" nek.
Megvalósításuk s7emléltetésere egy közös példát adunk - egy számítógépes játékhoz ho-
zunk létre egy labirintust. A labirinlUb és a játék mindegyik rnintánál más lesz cbY kicsit l\.é-
ha csak az lesz a feladat, hogy megtaláljuk a kiutat a labirintusból, ekkor a játékos valószÍ-
nűleg csak a labirintus helyi képét fogJa látni. Néha a labirintuson belül feladatokat is meg
kell oldani és veszélyeket kell leküzdeni, és ezeknél a játékoknál a labirintus egy rés7énck
térképe is megtekintllcté5 lesz.
SLdmos olyan rés7letet figyelmen kívül fogunk hagyni, hogy mi lehet a ldbirintuson belül,
és hogya labirintusját':kot egy vagy tÖbb játékos játs7hatja-e. E lclyett arra összpontosítunk,
hogyan kell létrehozni a labirintust, amelyet "szobák" halmaLaként aldktunk ki. Mindegyik
szoba tudja, hogy kik veszik kÖrül, kik a szomszédai. A lehetséges szoms7édok: egy másik
szoba, egy fal, vagy egy ajté) egy másik s. obába.
A Room (Szoba), a Door (Ajtó) és a Wall (Fal) osztály határozza meg a labirintus alkotóek-
meit minden pék ában. A7 oSLtályoknak csak a70n rés7eit határozLuk meg, amelyek fonto-
sak a labirintus létrchozása s7empontjából, és figye men kívül hd gy juk a játékosokat, a labl-
rintusban való mozgáshoz és al: ott látottak megjelenftéséhez szükséges műveleteket és
más olyan, egyébként fonto s70lgáltatásokat, amelyek magának a labirintusnak az e1készÍ-
téséhez nem Iétfontosságúak. Az alábbi ábra a osztályok közötti kdpcsoldtokat mutatja:
::::. MapSit
Enter()
1\
falak Room Wall
aor
Enter() Enter() Enter(}
Maze SetSide(}
sobák __ GetSide() isO pen
AddRoom() ....
RoomNo() roomNumber
l'vhndegyik szobának négy oldala van. A C++ nyelven történő megvalósításkor a Direction
felsorolás segítségéve! adJuk meg a szoba észdki, déli, keleti és nyugati oldalát:
enum Direct'on {North, South, East, West};
A Smalltalk megvalósításban az irdnyok jelölésére a megfelelő jeleket kel hasLnálni.
3. fejezet · Létrehozási minták 83
A MapsiLe (He]yTérkél)) osztálya labirintus összes alkolóelc111éllek ]()7()S elvont osztá]ya.
A péld.a egyszerűsítésé]lez a Map Sit e osztály csa.k eg)! műveletet (En t er) ]latároz meg,
amelynek jelentése altól függ, milyen adatot viszünk be. Ha szobát, akkor megváltozik
ct hely. Ha megpróbálunk belépni egy ajtÓn, két dolog történhet: ha az ajtó nyitva van, belé-
pünk a l(övetkező sLob3.ba, ]1a IJedjg Lárva, beverjük az orrunl{at+
class Ma.pS iLe {
public:
vir. tu al void Erlter () = O;
} ;
Az En t er cg)TSzerű alaI1()l .ld a játé]{ kjfino111ult3.bb 111íí\'eleteillcz. 1 la pé1d.ául vala111elyiJ<
szobá,ban \fagyunk, és a nKelelre!
' palJ.ncsot adjuk ki, a játé]{ egyszerűen rneg tllcija 11atá-
fozni, 11(Jgy mclyi]{ MapS i Le osztály esi)( k()zvl'ctlenül keletre, és mcgllívja rá a/ Enter rnű-
veletet. Az aJosztályfüggő Enter 111űvelet l<italálja, 110gy l1elyet vált()ztattunk
e, vagy aL Of-
fllI11{at verlül( lJe. Az jgazi jit61(ba11 az EnLer argul11.entumkénllTIcg]{aIJ}latná a jálékos ob-
jektumot is, amely
a labirintlls11an mozog.
A RoaDl a MapSi te llSZtály konkrét alos7tálya J ez llatáro77a n1eg a 13.birintus alkc)lóLlLmei
}{()7li főbb kapcs()latokat
A M
lpSjle osztályT töhlli ()lJjektumára valé) 11ivatkozásokat tarlal
nlaz, és lárolja 3. szobaszámcJt. A lal]irintuslJan a szobákat a SZ(}l)
lSzáll1mallehel azonosítal1.i
class Room: public MapSite {
public:
Room{lnt roomNo) i
MapSite* GctSlde(Direction) const;
vo'd SetSidc(Direction, MapSJle*);
virtual void Rnter()j
private:
MapSlte*
sidcs[4J;
.nt _rooml\Jumber;
II falak
} ;
Az a13.bhi osztály
ok a szol)a egyes oldalain. taJáltlató ajtól{at, illetve f
llaka.t jcll(épe7il<,
class Wall: public MapSite {
public:
Wall() ;
v'rtual void Enler();
} ;
84 3. fejezet · létrehozási minták
class Door : public MapSite {
public:
Door(Room* = O, Room* - O);
virtual void Enter() ;
Room* OtherSideFrom(Room*);
prlvate:
Room* _roomlj
Room* _room2i
boo] _isOpeni
} i
Több dolog'ó is tudnunk kell, nem csak a labirintus a kotóeleme'_ 'ől, ezért meg kell hata-
roznunk egy Maze (Labirintus) nevű os tályt is, ame y a s70bák összességét jelképezi.
A Maze osztály képes egy adott szobát is n1egtdlá n' a 'l)zobaszám alapján, a RoomNo
(SzabaSzám) művelet segítségéve!.
class Maze {
public:
Maze();
void AddRoom(Room*)j
Room* RoomNo(int) const;
private:
J''' ...
} ;
A RoomNo ineáris keresés, has'tótáb'a (k'vonattábla), de akár egyszerű tö nb használatával
is tue reresn ., de i yen észlete (ke most nem fog alkozunk. Ehelyett arra összpontos
tunk,
hOl:JTfan adhat juk meg egy labir'ntusobjektum alkotóeleme it.
Egy másik általun{ meghatározandó oS7tály aMazeGame CLabirintusjáték), amely magát
a labirintust hozza létre. A lab' -intus étreho ásának egyik leglogikusabb módja
ha olyan
műveletek soráva] ké:,zítjük el, ame yek alkotóelemeket adnak a labo 'intushoz
majd össze-
kdpCSO ják azokat, A következő tagfüggvény példáu egy két szobábó é
egy köztük lévő
ajtóból álló lab' rintust 110 letre:
Maze* MazeGarne: :CreateMaze () {
Maze* aMaze = new Maze;
Room* rl = new Room(l);
Room* r2 - new Room(2) ;
Door* the D oor = new Door(rl l r2);
aMaze->AddRoom(rl);
aMaze->AddRoom(r2) ,
3. fejezet · Létrehozási minták 8
rl->SetSide(North, new Wall);
rl->SetSide(East, theDoor) ;
rl->SetSide(South, new Wall) ;
rl->SetSide(West, new Wall);
r2->SetSide(North, new Wall);
r2->SetSide(East, new WaJl);
r2->SetSide(South, new Wall);
r2->SetSide(West, theOoor};
return aMaze;
}
Ez a fuggvény lneglel1etősen összetett, főleg l1a aLt is figyelel11be vesszül{t 110gy sem ni
mást nem tesz, csak létrc110z egy l{étszobás labirintust Nyilvánval()an van m()u a -" egysze
rűsítésére A Room konstruktor például előkészÍtllcti a szoba oldalait [alakkal, de ezzel csal{
másll()\7á kerül ál a kód. Az iga.zi gon.d ezze] a tagfüggvéol1yel nem a mérete, llanem a 'ru
gall11atla.,z;ága, mivel mereven kódolja be a labirintus elrendezését. I-Ia tnódosítal1' akarjuk
a labirintus kialak/tását, ezt a tagfüggvényt módosítanunk kell, akár fcliilbírá.lva a.zt (a.mi az
egész újbé}li InegvalósÍtását jelenti), al(ár egyes részeit l11egváltoztatva (allli viszont növel
a 11ibákra való llajlal11.ot, és nem tes7j lelletővé aL újrallaSLnosítást).
A létrc110Lási mintál{ azt tnutatjál< l11eg, hogyan le11et ezt az elrendezést 111galmasabbá de
nem feltétlenül kisebbé tenni; nevezetesen megkönn_yitik a labirintus elemeit nle b llatáro-
zó osztályok módosítását.
Tételezzük fel, 110 b Y)' egy már létező labirintuselrendezést szeretn.énk fell1.as7ná]ni egy új játék-
hoz, amely (többel( l{özött) elvarázsolt la11irintus()kat is tartalmaz. Az elvarázsolt labirintus já-
téklJan új elemek is vannal{, példáula. DoorNeedingSpeJ 1 (AjtóVarázsigével) egy ()lyan ajtó,
lmLlyet csal( varázsigével lellet be7árni, rnajd utána kinyitni, és 2.2 EnchanLedRoom
(Elvarázs()IL')Z()IJa) egy olyan szoba, 3.1nelyben szo]{atlan dolgok, péJdáullJűv()s kulcs(Jk vagy
varázsigék vannak. IJogyan lehet ehY)'szerűen módosíta,ni a CreateMaze CLétre110zLabirintu.s)
műveletet Ú6' l10 b "Y olyan labir+ntust l10zzon.létre, an1elyllen megtalálhaté)k ezek a7 új objek-
tu m.os7tályok?
El)ben az esetlJen a móclosítások legfőbb gátja a példán)rosítandó osztályok 111.erev ]{ódolá-
53.. A létrel10zási minták kil1önféle móds7ereket biztosítanak a kifcjczCllllival (ozáso ( pél-
d.ányc)sít{) k()dl)ól k{}nkrét osztályokba történő áthelyezésére:
· Ha a CreateMaze konstfll](torok }lellett virtuális függvényekellnLgI-lívva llozza létre
a szül(séges Szol1ákat, falakat és ajtókat, akkor a MazeGame a.losztályait létrellozva és
ezeket a virtuális függvényel<et felülírva m.ód.()sfthat(Jk a lJéldányosított osztályok.
Ezt a lTI.eg]<özelítést mutatja be a Gyártófüggvény minta (Factory Met110d).
· Ha a CreateMaze paraméterként kapott valamilyen objektumot a s7olJák, falak és
ajté)k lélrehozásállOZ, akkor a szobák, falal{ és ajtók osztályait úgy le]1et megváltoz-
86 3 fejezet Létrehozásj minták
j
tatni, ha egy másik paramétert .1dunk át a CreateMaze osztálynak. Frre jó példa a7
Elvont gy1r (Abstracl ractory) minta.
lIa a CreatoMaL.e olyan objektumot kapott, amely egy teljes új labirintust képes lét-
rehozni, műveleteket használva a szobák, ajtók és falak h07záadására a felépítendő
labirintushoz, örÖklés útján rnódosíthatjuk a labirintus elemeit vagy a labirintus fcl-
...
építésének méJdját. Erre jó IJéld.a a ElJítő (Builc!er) ml11ta+
Ha a CreateMaze osztály paraméterei különféle prototípus jellegű szoba-, ajtó- és
falobjektu1110k, a111elyeket aztán lemásol, és úgy ad a labirintushoz, a labirintus fel-
építése eZen prototípus jcllegLí objektumok 111ás objektumokkal való lccserdésével
módosítható. Erre jó példa a Prototípus (Prototype) minta.
A fennmaradó létrehozási minta, az E!:''Yke (Singleton) azt biztosíthatja, hogy játékonként
csak egyetlen labirintus legyen, és a játék minden objektumának legyen hozzá olvasási en
gedélyc anélkül, hogy glohllis váhozókhoz vagy függvényekhez keIlene folyamodni, ezen-
kívÜl megkÖnnyíti a labirintus bővítését vagy lecserélését anélkül, hogy hozzá kellene nyÚl-
ni a 1112.f meglévő l{ó(11}()7.
I
I
.r
Objelcturn-lélrel10z3.si Dlinta
cr
KapcsolódÓ vagy egymástól függ6 objcktu1110k családjának létrehozására szolgáló felületet
biztosílani a !«()n.l{rét ()sztál}7()k lnegadása nélkül.
Egyé nevek
Abstr3.ct Factory Kit (Készlet)
lad t
Vehryilnk egy olyan felhasználÓi felületi elemkészlctcl, amely többféle l1cgjelenílési szab-
ványt támogat - amilyen például a Motif vagy a Presentation Manager. E7ekbcn máshos'Y
néLnek ki és visclkednck a felhas7:nálói felÜlet grafikus elemei (vezérl6k, \\tidget), például
a gördít6sávok: az ablakok 65 a gombok. Ha a kÜlÖnféle megjelenítési sLabványok közÖtt
hordo7ható alkalmazásokat s7eretnénk készíteni, az alkalnla7ásokba nem lehet "bedrótozm"
a felhasználói fcliHeti elemeket, mert a kifejezetlen egy adott s'l'abványhoz tarlozó elemosztá-
lyok példányosítása az alkalmazásban ll1cgnehezíti a megjelenítés kés6bbi megváltoztatását.
Elvont gyár 87
[71 a 1foL11érnát úgy old.11atjll1< meg, 11a olyan e]vont Vezérl(-SGyár (\VidgetFa.ctolY) osztal)!t
készítiink J arTI.cly egy felületet llatároz 111Cg minden alap\Jclő clemfajta létrellozásá11()z.
Fn1.elJett mincien elemfajtál107 is tartozik egy elv7"ont osztál)', az egyes n1egjelenítési SZ3.1)V3.
11yoldlOZ t3.rtozó elenIeket pedig konl{rét alosztályok valósítják 111Cg. A VezérlőGyár felülc-
tének 'lan eg)! ()lyan művelete, amely nlincjen el\r()nt elemoszláJy110z e (lj vezérlőo1Jjel{tll-
l110t ad vissza. Az ü..fele]{ ezeket d. lllűveleteket rncgI1ívva.l<:érllcrnek elcrnpéldányokat, oe
nerll luuják llog)' pontosan mcly konkrét osztályokat llas7nálják, Íb7 független.ek rnarad.-
naJ< al é.ppen 11as711áJt Jl1egjelenitési s7allvin.ytóL
VezerIoGyár
--
--
Ügyfél
LétrehozGördft SávO
LétnJhozAbJak(J
Ab/ak
....
/\
.-...
j
PMAblak
I
MotifAblak
--t
L
L
r
r
L
I
r
/\
Létre 1ozGördftőSáv()
Létreho7Ab akO
MotifVezérlóGyár . - I
I
I
.
.
I
I
I
il
]
1
1
I
PMVezérloGyár
LétrehozGörd toS áv ()
LétrehozAblak()
I
I
.
.
]
1
....---,
GördftóSáv --
/\
[
t
I
1 :
I
MotifGördft6Sáv - I
I
I
-... PMGördft6Sáv
I____________________________________J
A \Tezérl(5Gyár osztály JTI.i.tlden JTI.egjelen.ítési sZ3.1Jványlloz konl{rét alosztállyal rcndcll(czik
Az a.loszt.ályol( a.Lol(at 3. műveleteket \r3.lósítjál( meg amel)Tek élZ a(J.()ll megjelenítési sZll)-
ványhoz sZli]{séges felületeleme]( ]étreh.l1zásá]10Z kellenek. Pélciá.ul a Motil\TczérlőGy"ár
(MotiiWidgctFactory) alosztál)T LétrelloLG'ÖloítóSáv (CreateScfc)IIBar) művelete egy M()lif
g()rdíl(5sá/()l lJéld.ányc)síl és ad vissza, a 111egfelel{j PMVezérlőGyár (PMWidgetFactolll) al-
osztályon végzett m.űvelet }Jcdig egy l'rcsent.ation Manager görd.ítős3.\l()t. Az ü)rfelek l(i7á-
rólag a VezérlőG'yár felületen keresztülll()znak létre felliletelemeket, és 11em tudnal( sem-
mit a.zol{ról az osztál)7okról, a111cl)lCk a. konkrét mcgjclenítés fclületelemeit val{)sílják meg.
Más szavakkal: az ühryfeleknek nincs más teencié5jük, ]nint rá11í7111 magul<at egy ol)ran eli.j-
]etre a]llelyet al: eJvont osztál)Tol< és neJll a megfelelő 1{onkrét osztályol( lloLna.l( létre.
A \T e 7érl(5Gyár függ"őségeket is h:éJlyszerít a l{()Jllcrét \rezérlőosztá.lyokrl A. Motif gÖldítő-
Sá\TO]{ Motif gOlnllba] és Motif szövegszerkesztő\Tcl }lasLnálllatók, és ezt a meg szorítá st
a Mc)tifVe7érlé5G,.rár l1asnála.tának követl<e7ményeJ{ént allto natil{usan kikényszelíti
a program.
j
88 3 fejezet · Létrehozási minták
Aik lma atósag
Az E]vont gyár minta az alábbi esetekben llasználJlató:
· A rends7ernek függetlennek ke J lennie attól, hogy "terméke "t" hogyan 10zza létre:
állítja össze és je]eníti nleg
· A rendszert úgy I{ell 1)eál1tani, hogy a termé (családc)k H eg)7ikévelllasználJlató le-
gyen.
· A7 egy családl10z tartC)7Ó termékobJe {tumokat egyi.itles haszná.latra tervLzték, és ezt
a megszorftást ki kel] kényszeríteni..ink.
· Ternlékek oS7tálykönyvtárát szeretnénk létre lozn.i, dc csak a felületeiket szeretnénl{
felfedni, n1egvalósításukat nem.
j
....
Sze et
ElvontGyár
LétrehDzT 8tmékA()
létrehoz T rmékB()
-
--......
Ugyfé
ElvontTermékA
/\
/\
1- -..
1
i
r
TennékA2
1
ermékA
..... -
.
.
.
.
.
r
t
1
1
1
Kon krét Gyá r1
létrehozT ermékA{)
létrehozT ermékB()
Kon rétGyár2
ltrahoz T ermékA()
LétrehozT onnékB()
f----------
ElvontTe mékB .:,:
--...
"
TerrnékB2
I
TermékB1
1
1
.
I
.
I
I
--.
J\
----------------------------------------------------.
, "
es ev
· ElvontGyár (VezérlőGyár)
- Elvont termékobjektulTIokat létrcllozó műveletek s7ámára vezet be felüjetet.
· KonkrétGyár (MotifVezérlőGyár t PMVezérlőGyár)
- Megvalósitja a. konkrét termékolJjel<lumc)kat létrc}lcJ7Ó műveleteket.
· ElvontTermék (Ablak, GördítőSáv)
Egy adottlípusú termékobjektumhoz 110L lélre felületet.
KonkrétTermék (MotjfAblak, Mot.fGördít{SSáv)
A megfelelő konkrét gyár (factory) által létrehozandó termékobjektu not határoz-
za meg.
- Megvalósítja az Elvonflermék felületet
Elvont gyár 89
..
· Ugyfél
- Csak az Elvon Gyár vah7 az Elv()ntTern1ék osztály által megllatározoll fe ületeket
haszná ja+
gyüttmukö 5
· Normál esetben a program futásidőben egy példányt l10z élre a l<.onkrétGyár OS7-
tályból Ez a konkrét gyár olyan termékobjektumokat h07 létre, amelyeknel{ egy
adott n1egvalósí ásuk van Ha más lermékobje tumokat szeretnénk létrelloLni) az
ügyfeleknek más konkrét gyárakat l{ell 1asználniuk.
· Az IlvontGyár a KonkrétGyár alosztályra lJí77a a termékobjektumok étre110zásál.
Következmények
Az Elvont gyár minta előnyei és látrányai a következ6k:
. Elszigeteli a konkrét osztályokat. Az Elvont gyár minta segíti az a _ka lnazások álta.l
létrehozott objLktumoszlályok kezelését. Mivel a gyá tartalmazza a termékobjektu-
mok létrehozásának felelősségét és folyalnatát, elszigeteli az ügyfelel{et a megvalósí
tás+ osztályoktói. Az ügyfelek saját elvc)n.t felületi..il{ön át kezelil{ a példányokat.
A termékos7tálynevel< el vannal{ szigetelve a konkrét gyár megvalósításában, és nem
jelenne 7' lneg az ügyfé kódjában.
2. Alegkönnyíti a termékcsaládok cseréjét. A konkrét gyár osztálya egy alkalmazásban
csak egyszer jelenik meg - akkor, amikor pé dányosítják. Ez n1egkönnyíti az alka -
mazá.s átal 11asznált k()nkrét gyár megváltoztatását. A különféle termékegyüttesek
Jlas7nálatához nem kell mást tenni, mint megválto7tatni a kan iaét gyárat. Mivel az
elvont gyárak teljes termékcsaládokat állítanak elő, egyszerre megvá tozik a teljes
termékcsalád A fe11asználói felületes példában pus7tán a megfelelő gyárobjeklu
mok közö ti átkapcsolással és a felületet új.a létrehozva átvá tl1atunk a Mc)tif felület-
elemekről a Presentation. Manager elemekrc.
3. Biztosítja a ferlnékek közti egységességet. Amlkor egy családon belül együttműk()-
désre tervezett termékc)lJjektumok vannak, fontos, 110gy az alkalrna7áso]{ egyidóóen
csak egy termékcsaládba tartozó objektumokat h.aszn.áljanak. Az E vontGyár leegy-
szenísíti ennek kikényszerítését.
1. Az új te111lékfajták tám.ogat.ása nehézségekbe ütközik. Az elvont gyárak kibővítése
újfajta termékek létre110zására nem könnyű. [nnel{ az az oka, 110bY az ElvontGyár
felület rögzíti a létrellozható termé (el{et. Az új :"ajta termékek támogatásához ki {ell
L1ővíteni a gyá 1 felületét, amilleL meg kell vá loztatni az FJvontGyár osztályt és annak
mincJ.en alosztályát. A probléma egyi { lnego dásá a Megvalé)s'tás rész ismerteti.
90 31 fejezet Létrehozási minták
r egy 1051 as
AL. alábbiakban a7 [lvont gyár ll'nt.a megvalós"'tásának nel ány módját mutatjuk be
1. Gyárak mint egykék. Egy alkalma7ásnak jellemzően csak egy KonkrétGyár péld2ny
ra van szüksége termékcsaládonként: így azokat álLaMban ct legjobb gyke fOllnájá-
L1an ncgva]ósítani.
2. A termékek léI1"ehozása. A E vontGy.1r csak a felületa adj. meg, amelyre a termé-
Telo( e16állításá11.0Z szükség van. A lerlnél{ek kon]{rét létreI10zá.sá' d Kan.( +ét1"erm.é <:
alosztályok végzik. Fnnek legáltalánosabb mÓdszere az, hogy minden termékhez
egy külön gyártófüggvényt határo7unk mLg (lásd a Gyártófüggveny mintát). A konk-
rét gyárak tennékeiket agyártófüggvény felülírásávaJ áHítják elő. Mikő- ben ez
a megvalósítás egyszerű, új konkrét b'Yár alosLtály kell minden termékcsaJádhoz, ak-
kor 's, ha a termékcsaládok csak kismertékben térnek el egymástól.
Ha sok termékcsaládra lehet szükség, a konkrét gyár ffiLf,TVaJósítható a Prototípus
minta segitségével is. A konkrét gyár . ct,aládba tarto7ó lninden ter .nékllez külön
prototípus-példányt használva készíthető elő, 6s az új termékek a prototípus klóno-
zásával jönnek létre. A Prototrpus aJapú megközelítést használva nincs szükség m"n-
den -új termekcsaJádhoz új konk ét gyá.r osztályra.
Az alábbi példa egy Prototípus alapú gyá · S:111dlltalk nye ven történéS megvalósítását
szemlélteti. A konkrét gyár eh7 partCatalog nevű katalógusban tárolja a klóno-
zandó prototípusokat. A make: metódus beolvassa és klónozz3 a prototípus:
make: partName
A (partCatalog at: partName) copy
Új alkatrésze (ct a konkrét gyár metódusáva vehetünk fel a katalógusba.
addPart: partTemplate narned: parlName
partCatalOQ at: parlName put: pa.rtremplate
A prototípusokal egy szilnbólum.1nal azcJno.sítva leJ let a gyá.rl107 adni:
aFactory addPart: aPrototype narned: #ACMEWidget
A Prototípus alapÚ meg (özelítés olyan nyelveken lehetséges, amelyek a7 osztályo-
kat első osztá yú objektumokként ke7elik Clyen Jéldául a Sn1alltalk és az Objective
C). Eeken a nyelveken aL osztáJyt úgy keJl elképzelni, mint egy olyan csÖkevényes
gyárat, ami csak egyfajta terméke áIrt elő, Az osztályokat olyan (onkréL gyárak bel-
sejében e}1et tá.roln. J amelyek a ki.ilönbö ő (on (rét termékeket vá]tozokba]l állítiák
elő, nagyjábÓl úgyI mint a prototípusok. Az osztályok egy konkrét gyár nevében
...
hoznak létre új példányokat. Uj !:,yárat egy <conkrét gy ar egy pé dányána ( termékosz-
tályok útján történő előkcszítésével lehet meghat.1rozn', nem pedrg alosztáJyo ( létre-
hozásával. Ez a negkö e .ítés ki las7nálja az ehyes nyelvck szolgáltatásainak előnye-
It, míg a lisztán !)rotot'" us ala.pú rnegköLclítés nyelv[ügget]en
Mint a fentebb említett Prototípus ala JÚ gyárban a Smalltalk nyelvben, az osztály aJa-
pÚ v.ílto7atban is egyetlen példányváltozó van (partCatalog), ame y egy olyan
katalógus vah'Y "szótár", an1e ynek kulcsa az alkatrész neve. A partCatalog nem
dónozandó prototípusokat "áraI, hanem tenllékoztályokat. A make: metódus eb-
ben a7 ese ben így néz k+:
Elvont gyár 9
make: partName
A (partCatalog at: partName) new
3. BővÍlhető gyárak mCf{határozása. Az ElvontGyár általában minden általa előállítható
terméktípushoz más- 11ás műveletet határoz Jneg. A tc "méktípusokat a míívelet alá-
írása azonosítja. Uj termékfa}ta hozzáadásához módosítani kell a7 ElvontGyár felüle-
tel és al. összes vele függé5ségi viszonyban lévő ()sztályt+
Rugalmasabb, bár kevésbé biztonságos megoldás, ha az objektumokat létrehozó
műveleteket látjuk el parelméterekkel. Ez a paraméter adja meg a létrehozandÓ ob-
jektum típusát. Ez ld et osztályazonosító, egész szám, karakterlánc vagy bárm1 más,
ami alkalmas a termékfajta azonosítására. Ezt a megközelítést használva az
EJvontGyá " oS7lálynak csak egyetlen "Make" műveletre van s7üksége, amely el van
látva egy olyan paramétcrrel, amely jelzj a létrehozandÓ objektum típusát. Ezt az el-
járást használjuk a fentebb említett Prototípus és osztály alapú elvont gyárakban.
Ezt a váltc)zatot a d.inamil{us jellegű nyelvekben amilyen péld.ául a SmaJltalk -
könnyebb _lasználni, mint a statikusokban j amjlyen például a C++. A C++ nyelvben
a megoldás csak akkor has7nálható, ha minden objektum ugyanazt az elvont alap-
osztályt has7nálja, vagy ha a termékobjektumok az őket igénylő ügyfél Útján bizton-
ságosan a 1 egfeJelő típusra korlátozhatÓk. A GyártÓfÜggvény minta megvalÓsítását
tárgyaló részben látni fogjuk, hogyan lehet ilyen paraméteres m(íveletekct megvalÓ-
sítani a C++ n.yelvl)en.
De akkor is marad még egy gond, ha nem kell semmit sem korláto7Dunk: az ügyfél-
nek minden terméket ugyanazzal a7 elvont felületteI ad viss7:a a program, amelyet
a visszatérési típus meghatároz: így az ügyfél nem lesz képes megkÜlönbÖztetni
vagy biLtonsággal felismerni a különféle termékos7tályokat. Amennyiben az ügyfél-
nek alosztályra je]lemző műveletet kell végrehajtania, az elvont felületen keresztüli
elérés lelletetlenné \ráli1{. Bár az üg)rfél lefelé irányuló típusátala.l{ítást (ez a C:++
nyelvben a dynamic_ca.st) tud vége7ni: eL nen1 mindig ésszerű és nem is mindig
biztonságos, mivel a7. átalakítás meghiúsulhat. Rendszerint ez az ára a nagy rugal-
TIasságú és bŐlílllClŐ fe]ületekncl{.
eid ód
Az Elvont gyár mjnta segítségével most létrehozzuk alt a labirintust, amelyről a fejezet ele-
jéJ1 volt szó.
A MazeFactory CLabirintusGyár) osztálya labirintus elemeit tudja létrehozni. Szobákat, fa-
lakat és szobák kÖzti ajtókat épít. Használhatja olyan program, amely képes fájlból kiolvas-
ni a labIrintus "aJaprajzát" , és felépíkni abbÓl 1 kívánt labirintust, vagy olyan, amely vélet-
lenszerűen építi fel a labirjntuL A labirintuskészítő progralllok argumentuD1ként veszik fel
a Ma z eF ac Lory osztályt, hogy a programozók megadhassák a kidlakÍlandó szobák, falak
és ajtók osztályait.
9 3. fejezet · Letrehozási minták
class MazeFactory {
public:
MazeFactorY()i
virtua] Maze* MakeMaze() const
{ return new Mazei }
virtual Wall* MakeWall() const
{ return new Wall; }
virtual Room* MakeRoom(int n) consl
{ return new Room(n)j }
virtual Door* MakeDoor{Room* rl 1 Room* r2) const
{ return new Door(rl/ r2); }
} ;
Jusson cS7Ün<:be, hogya korábban bemutatott CreateMaze (Létreho7Labirintus) tag ugg-
vény egy kis, két szobából és a köztük lévő ajtóbó álló labirintust épít fel. A CrealeMaze
mereven l1e]<ódolja 3.7 osztályn<...veket, mcgne11ezítve a kü önbözó e emekből kia]aktott la-
birintusok étrell()zását.
ÍlTIC a CreateMaze egy olyan vájtozata, ame]y kijavítja ezt a hiányosságot, mégpedig úgy,
11()gy egy MazeFactory ()sztályt kap !Jaraméterként:
Maze* MazeGame::CreaLeMaze (MazeFactory& factory) {
Maze* aMaze = factory.MakeMaze();
Room* rl factory.MakeRoorn(l);
Room* r2 = factory.MakeRoom(2);
Door* aDoor: factory.MakeDoor(rl 1 r2);
aMaze->AddRoom(rl);
aMaze->AddRoom(r2);
rl->SetSide(North, factory.MakeWall());
rl->SetSide(East, aDoor) j
rl->SetSide(South, factory.MakeWaJl ());
rl->SGtSide(West, faclory.MakeWaJl());
r/->SetSide(North, factory.MakeWall());
r2->SetSide(East, facto-y.MakeWall());
r2->SetSide(South, facto-y.MakeWall ());
r2->SetSide{West l aDoor);
return aMazei
}
Az elvará7solt labirintust építő EnchantedMazeFactory (FJvarázsoltLabirintusGyár) osz-
tályt a MazeFactory alosztálya]{ént 110z latjul{ étre. Az EnchantedMazeFactory kü ön-
böző tagfüggvényekel bírál felül, és a Room, Wall stb. osztályok kü önböző alosztályait ad-
. .
Ja VIssZa.
Ivont gyár 93
class EnchantedMazeFactory : public MazeFactory {
public:
EnchantedMaeFactory{);
virtual Room* MakeRoom{int n) const
{ return new EnchantedRoom(n, CastSpell()); }
virtual Door* MakeDoor(Room* rl, Room* r2) const
{ return new DoorNeedlngSpell(rl, r2)j }
prolected:
Spell* CastSpell() const;
} i
Most tételezzük fel azt, 10gy olyan lalJirintusjátékot szeretnénk készítel1i) amelyben az egyik
szobában egy l10mha van. lIa a llomba felrobba.n, a.2 erombolja (legalább) a ralakat KészÍt-
1etünl< o yan Room (Szoba) a1osztályt, amely nyilvántart ja, 10gy van-e bo nba az adott szo-
bában, és Ila igen, felrolJbant-e már. SZlil{ségün { lesz olyan Wall (Fal) alosztályra is, amely
a7t tartja nyilván, hogy megsérült-e a fal, és 1a igen, 110gyan. Legyen eze].cne]{ az alosztályok-
nal( a neve RoomWilhABomb (SzobaBoml1áva), j]]etve BombedWa II (LcrolnlJoltFal).
Az utolsó osztály, ame yel megllatározunk, a BombedMazeFactory CLerotnboltLabirintus-
Gyár). Ez a MazeFactory osztályalosztálya) és d BornbedWall oS7tály leronll10lt falait és
a RoomWithABomb osztaly bombat tartalmaz() z()11áit alal<ítja k_. A Bom.becllv1azeFactory
alosztálynak csak két függvényt ]<eJ] felülírn.a:
Wall* BombedMazeFactory::MakeWa11 () const {
return new BombedWallj
}
Room* BombedMazeFactory: : MakeRoorn (int n) const {
return new RoomWjthABomb(n);
}
Ha olyan egyszerű labirintust s7eretnénk készíteni, a nelybcn bomba van, ehY)Ts7erűen csak
a BombedMazeFactory alosLlállyalllÍvjuk meg a CreateMaze lnűveletet.
MazeGame game;
BombedMazeFactory factory;
game.CreateMaze(factory);
A CreateMaze 1 egkap11atja az r:nchanledM:azeFactory egy pé dá-nyát is, így tudunk
például elvardzsoltlabirintut ét ehozn ._
....
,
94
3. feezet · Létrehozási minták
]cgye7zük Inc..g, l0gy a MazeFactory nem más, mint gyártófüm;)JVények puszta gyűjtemé-
nye - ez a Elvont gyár minta legálta ánosabb megvalósítái módja -, valamint azt is, hogy
a MazeFactory ne:n elvont osztály, íbT)' az ElvontGyár és a KonkrétGyár szerepét is betÖl-
ti, ami eg)! másik gyakori megvalósítása az Elvont gyár mintának egysLerű al {almazások-
ban Mivel a MazeFactory olyan konkrCt osztály, amely tisztán gyártófüggvényekből állj
új MazeFactory osztályt könnyű létrehozni úf,ry, hogy készítünk egy alos7tályt, és fe ülJr-
juk 3. móclosÍtandó műveletel(et.
....
A CreaLeMaze 3. SelSide (BcállítOldal) művelettel hozta létre a szobák oldala.t.
Hd a Bombed1Y1azeFactory dlosztállyal 110773 létrc a s701Já}cat, akkor a labirOntus Bombed
Wall oldalú RoomWithABomb objektumokból áll Össze. Ha a RoomWithABomb alosztály-
nak a Bombe dWa 1 1 alosztá y eh:ry tagját kell elé nie, akkor a falaira egy hivat {O.lást kell átala-
kítania a Wa II * a .osLtályból a BombedWa II * alosztályba. Ez a lefelé irányuló átalakítás egé-
szen addig biztonságos, amíg ti argumentum tényleg Lbry BornbedWall alosztá y, amI akkor
igaz, ha a falakat kiz(rólag BombedMazeFactory alosztályokkal építjük [el.
A (Jinam.ikus típllso]{l<a.l dolgozó nyelvekben, a.milyen pé dául a Sm.alltalk, terr' észetesen
nincs s ükség lefelé irányuló átal:1kításra, de [utásidejű hibákat okozhat, ha Wall osztályba
ütkö7ünk ott, ahol a Wall oS7tály egy alosztávára számítunk. Ha a falakat az E vont gyár
minta segítségével építjü]< fej, az segt lnegelőzni az iJyen futásidejű 1ibákal, mivel bi tosít-
ja, 110gy cs.k bi7onyos lípusú fa akat lellessen étI ellozn . .
V'zsgáljuk meg a Ma zeFactory egy Smalltalk nyelvű változdtát, egy o yat, amelyben
egyetlen make művelet van, aIllely az objektUlll típusát kapja pa améterü1. Sőt mi több.
a konkrét gyá · táro jd a saját maga által létrehozott te mékos7tályokat
Először írju k Jneg a Crea t eMa z e megfe elójét Snlalltal ' ( nye]ven:
createMaze: aFactory
I rooml room2 aDoor I
room1 := (aFactory make: #room) number: 1.
room7 := (aFactory make: #room) number: 2
aDoor := (aFactory make: #door) from: rooml to: room2.
rooml atS ide: #north put: (aFactory make: #wall)
rooml atSide: #east put: aDoor_
rooml atS ide: #south put: (aFactory make: #wall)_
rooml atS ide: #west put: (aFactory make: #wall).
room2 atSide: #north put: (aFactory make: #wall).
room2 atS ide: #east put: (aFactory make: #wall).
room2 atSlde: #south put: (aFactor y make: ffwall).
roorn2 atSlde: #west put: aDoor.
A Maze newaddRoom: rooml; addRoom: room2; yoursell
Elvont gyár 95
Amint a Mcgvalósítás részben már volt ré)la szó, a MazeFaclory osztálynak csak a part-
Catalog változó egy példányára ,ran szüksége J hogy egy olyan szótárat biztosítson,
amelynek a kulcsa az összetevo osztálya. Jusson eszünkbe aL: is, 110gyan va ósítottuk meg
a make: metódust:
make: partName
A (partCatalog at: partName) new
Most létreh()zhatunk egy MazeFactory osztályt és használ11atjuk a createMaze mcgva-
Iósítására. A gyárat a MazeGame osztály createMazeFacLory l11Ltódusának segítségéve!
hOZ7Uk létre.
createMazeFactory
A (MazeFactory new
addPart: Wall named: #wall;
addPart: Room named: #room;
addPart: Door named: #door;
yoursel f)
A BombedMazeFactory vagy az EnchantedMazeFactory alosLtályt a kulcsoklloz kü-
lönböző osztályokat társítva hozhat juk létre Egy EnchantedMa7eFactory alc)szlálv pél-
dául íbry hozllató létre:
createMazeFactory
A (MazeFactory new
addPart: Wall named: ffwalli
addPart: EnchantedRoom named: #rOOffij
addPart: DoorNeedingSpell !amed: #door;
yoursel f)
Isme felhas nál' sok
Az InterViews a "Kit H ut()tdgC)t llasználja [Lin92] az ElvontGyár osztályok megjelölésére;
a WidgetKit és DialogKit elvont gyárak pél(iául a megjelenítési sZdbványlloz kapcsolódó
felhasználói felületi ()bjektumok (vezérlők, illetve párbeszédablakok) létrehozására valók.
Az InterVicws tartalmaz egy olyan IayoutKit osztályt is, amely különféle ÖSSLctctt obJektu-
mokat .11lít elő, attól függően, hog)7 milyen e rendezésre van s7ükség. Például egy alapvető-
en vízszintes elrendezésben másfajta összetett objektumokra lellet szükség a különfé e do-
kumentum-tájolásoklloz (álló vagy fekvő)
A7 ET++ [WGM88] az Elvont gyár mintát használja a különbö7ő alJlakkezelő rendszerek
(például X Window és SunView) közötti hordozllatóság elérésére. A WindowSystem elvont
alaposztály az ablakrendszer erőforrásait (például MakeWindow, MakeFont, MakeColor)
jelképező objektumok létrellozására sLolgáló felületet határozza meg A konkrét alosztály-
96 3. fejezet · Létrehozasi minták
ok egy-egy ablakrendszer felüetét valósítják meg. Fu ásidőben az ET++ abból a konkrét
WindowSystem alosztályból hoz létre egy példányt, amely a onkrét rendszererőforrás-ob-
ektumokat állít.a e 6
Ka csoló o mint k
Az ElvontGyár osztályokat gyakran gyártófüggvényekke valósítják meg (Gyártófüggvény
minta), de megvalósíthatók a Proto ípus minta seg''tségével is.
A konkré gyár gyakran Egyke.
"
I ,
...
Objektum-létrehozási minta
Egyéb n vek
Builder
CI
Az összete t objek urnok felépí ésének függetlenítése az ábrázo ásuktól, így ugyanazzal az
építési folyamattal különböző ábrázolásokat hozhatunk létre.
Fiad
Az RTF eRich Text Formai) dokumentumcsere-formátumot olvasó alkalmazásnak képesnek
kell lennie az RTF sok ehryéb szövegforrnátumba való átalakítására is. Az olvasóprogrdffi át-
alakíthatja az RTF dokumentumot sima ASCII szöveggé vagy interak(v módon szerkeszthe-
őszövegkezelő felülete emmé. A gond azonban az, hogya lehetséges átalakftások száma
korlát an, "gy az olvasóprogram módosítása nélkü is egyszeruen kell, hogy új átalakítást
adhassunk meg
Egy megoldás lehet, ha az RTFOlvasó (RTFReader) osztályt az RTF formátumot másfaj a
,;
szövegmegje enítéi formátumra áta akító SzövegAta akító (TextConverter) ob.ektummal
á lítjuk be. Amikor az RTFOlvasó elemzi az RTF dokumentumot, a SzövegÁtalakító objek-
tumot használja az átalaktás végrehajtására. Amikor az RTFOlvasó felismer egy RTF e emet
("tokent") (sima szöveget vagy RTF-vezér őszót), kiad egy kérést a SzövegÁtalakító objek-
tumnak, hogy alakí sa át azt. A SzövegÁtalakító objektumok fe e nek .lZ adatátalakítás vég-
rehajtááért és a7 elem kért formátumban való meg"elenítéséért is.
pf Ő 97
b....-....IV
ASzövegÁtalakító alosztályai különböző átalak"tásokra és formátumokra "szakosodhat-
nak J ,. Az ASCIIAtalakító (ASCIIConverter) alosztály például figyelmen kíVÜl hdgyhat mn-
den kérelmet, kivéve a sima szöveges átalakításra vonat rozóakat A TeXÁtalakító
(TeXConverter) alosztályok azoka a műveleteket valósíthatják meg, amely a TeX fOfll1á-
tumban való, a szöveg minden stílusinformációját tartalmazó szövegmegjelenítésre vonat
kazó kérel ekkel kapcso atosak. ASzövegVezér őÁtalakí ó (TextW-dgetConverter) alosz-
tá yak olyan összetett felhasználó. felületi objektumokat hozhatnak létre, amelyek lehetővé
teszik, hogy a felhasználó láthassa és szerkeszthesse aszöveget.
while (t =
S'Mtch
CHAR:
éprtó-
FONT:
éprt6-
PARA:
é rt6-
}}
RTFOlvas6 t6k
, SzövegÁtaJa kft6
\
épM
ElemezR1F( ) fO - Átalsk/tKJ1rakterlchar)
-
I ÁtaJakftBotI1VáltásfFontJ
.
I ÁtalakitBokszdés(}
I
...
.
ts.. ,
szerez követk.m e m} { . A
t Type { I I 1
> Átal kftKa kter(t. Char) AS C IIÁ lakft6 T exAt I kft6 SZÖVegVezárt6Á lakftó
'1
> Átalakft8et1lV tás(t. Font) j ÁtalakftKa kter( char) ÁtalakItKara kter(char) ÁtalakftKaraktB (char)
S%e I1flAS Cll Szöveg () ÁtalakftBetaVéltás( Font) ÁtalakitBetfiVáhés(Font)
> AtWakftBekezds()
t ÁtalakftBekezdésO ÁtalakftBekezdésU .
,
. . SmruzTeXSzoveg() SzerezSzövegVezér16()
r I
\
\.
I r
........................,..............,....,........,..,....,.................,...............-Jn....................................................... .................., ..,...,........,.............,...., ..,....................iJrJ.......................................Jr-......"...........................................................,-TI-1I..........................I.T............. ...................... ......... ...... .1. ........................... .................
1.
.
!.
.
\
:
,
.,.
'1
i:
II
.
...
\
"
"
.
'r
...
x
:L..,......",..JI....,,,,..........,....,.,..,,..,-,.......,.,. ..,.,,,...,,..,,.... .".." .. ........... .,- ..........................,.-..............................,...............,... .".,"'." "."m.' ."."..". ... ... .......w .. m'.,,'"'' .....,....."...,...,......,.".".,",.....,....,' . ...... ... ,..,.....,..,........,......m'
I
: - 1 ASCIISzöveg ]
: - TeXSzöveg J
L
: - -iSZöv gVezér16!
Mndegy..k áta akítóosztály-típus tartalmazza, am. az összetett objektumok létrehozásához
és ()sszeállításához zükséges, és egy elvon felület mögé rejti azt Az átalakító e külc)nül aL
olvasóprogramtói, amely az RTF dokuITlentum elemzéséért felelős
.Az Építő minta mindeme kapcsolatokat tartalmazza. A mintában az átalJ.kító osztályok neve
építő (builder), míg az olvasóprogramé irányító (director). A fen i példára alkalmazva: aL Épí-
tő minta elkülön'ti a szöveges formátumot értelmező algoritmust (azaz az RTF formátumot
elemző részt) az á alakított formátum létrehozásának é megjelenítésének módjától. Ez lehe-
tővé tesz, hogy az R FOlvasó elemző algoritmusát újra felhasználjuk RTF dokumentumok
alapján készített másfajta szövegmegje enítés. formátumok létrehozására, és ehheL nem kell
mást tenni, csak másik SzövegÁtalakító al osztályt meg adn . az RTFOlvasó osztályna ;r.
Aik Im hatosag
Az Építő mintát a következő esetekben használjuk:
. Az össze ett objektumok létrehozási algoritmuának függetlennek kell lennie az ob-
jektumot alkotá részegységektől és azok összeállítási módjától.
. Az építés folyamatának lehetővé kell tennie, hogya Iétrellozott objektum többféle-
képpen jelen.hessen meg
9a 3. fej zet Létrehozási minták
Serke t
rányíto
épft
ító
Felép ftO
o
.
ÉpftRész()
.
I
for an objektum in szerkezet {
épftó-> prtRész()
}
onkret Pltó
pftRészn
SzerezEredm ny()
- - - - - - - ,
ek '1
,
...
s vők
,
Eprtö (SzövegAtalaktó)
- Megadja a ermék objektumok a katórészeinek létrehozására sLolgáló elvont
'elü etet.
, ti' ,..
· KonkrétEprtő (ASCIIAtalakító, TeXAtdlakító, Szöveg Vezér őAtalakító)
- Az Ép"tő felü etét megva ÓS"tVd megalkotja és összeál tja a te mék részeit.
- Meg latározza és ny"lvántartja aL általa létrehozott mebje enítési módokat.
- A ermék beolvasására szolgáló felületet (például SzerezASCIISzöveg, SzerezS ö-
vegVezérlÖ) bi7tosít.
· Irányfto (RTFO vasó)
Az Építő felüle segítségével megalkot egy objek urnot.
· Termék (ASCIISzöveg, TeXSzöveg, SzövegVezérlő)
- A felépíte ldő összetett objek urnot jelképe7i. A KonkrétÉpítő fe építi a termék
belső ábrázolását, és meghatá o za a termék összeállítási folya 1atát.
- Tarta ma a az elemeket eghatá azó OSL .ályokat, köztük az elemek összeál ítá-
sára s o gá ó felületeket s
Együtt úk.. és
· Az ügyfél létrehoz za az Irányító objektu not, és beállítja a megfelelő Építő objektu nmal.
· Az Irányító értes"t' az ép"tőt, ha a termékhez hozzá ell adn' valam'lyen a koto észt.
.;
Az Epítő ke el' az irányítótóI érkező kérelmeket, és alkotórészeket ad a termékhez
· Az ügyfél e kéri a terméket az építőtől
A következő együttműködési diagram azt szemIé teti, hogyan működik együtt az Épí ő es az
Irányító az ügyfélIel.
,
Epíto 99
..
egyUgyfél
egylrányrto
,
egyKo nk étEp tó
new Konkrétprtó
-------------
--------r------
new Iránvrtó(egyKonkrétprtő}
----------------
Ép ftRészA(}
Fe1ép(tO
prtRé szB()
prffiészCn
SzerezEredrnény( )
Következm ' nyak
Az ÉpJtő minta legfőbb előnyei 3 követl{ező]<:
1. LC/let6vé teszi a tC1' 4 111.ék belso ábrázolásá1'lak meg'változtatását. Az E )Ítő objektum
egy eJv()nt feltiletet biztosft az irányító SZáJl1ára a termék összeálltásáho7. A felület
Icl1etővé teszi, 110gy az építő elrejtse a tLrmél{ belső s7erkezelél, valami 1t a termék
összeállításánal{ módját is. Mivel a termék c)sszeállítása egy elvont felületen át törté-
nik, a termék belső álJrázolásának megváltoztatásá]107 elegendő egy új építől n1eg-
határozni.
2. Elszigetelí az ósszeállítási és a megjelenítési kódot. A7 Építő nlinta úgy javtja a mo-
d.ulrcndszerű kialakítást, 110gy egységlle 7árja az összetett objektl1n1 összeáll/tásának
és megjelenítésének módját A7 ügyfélnek nem l<elltlldnia seiTIrnit a termék belső
szerkezetét meghatározó osztályokrÓl 1 így ilyen osztályok nem jelennek meg az Épí-
tő felületében.
Mindcgyi]{ KonkrétÉpítő ta.rtalnlaZ7a a7 összes olyan kódot, amely egy adott termé]{-
fajtllétrellozásá}107 és összcállításá1107 sZlil<séges. A lcódot csak egyszer kell mLgírni
a.ztá.n a külc)nlJöző Irányítók újra felllasználjál( azt a Termék különfé e változatainak
ugyanabból az elem lalmazból való felépítésétlez. A korábban említett R1'F-LS példá-
1Jan például meg11atáro711atunk egy olvasóprogramol egy RTF-től eltérő f()rmátlllTI-
tl()Z, mondjuk egy SGMLOlvasó (SGMLReader) alosztályt, majd. ugyana.zokat
a S7ö'vegÁtalakító a.losztályc)kat felhasználva előállít]latjuk az SGML dokumentumok
ASCIISzöveg, TeXSzöveg és SzövegVe7érlő alosLtályok szerint formázott változatát IS.
100 3. fejezet · Létrehozási minták
3 A létrehozáSI folyanlat fillolnabb vezérlését teszi lehetol)é. Azoktól a lét e110zási lnin-
táktól eltérően, amelyek egy lépésben alakítják ki a termékeket, a7 Épít6 minta az
irányító felügyeletével lépésről lépésre alkotja meg azokat, Az i ányító csak a or
ves7i á - a ternéket az építőtőI, amikor az már készen van. Emiatt az Epítő felü et job-
ban tükrözi a termék megalkotásának folyamatá , mint a többi ét.eho7ási minta, és
"gy ino nabban ehet vezérelni az építési folyamatot és ennek következtében a vég-
eredm(nyként l<apott terlnék belső szerkezetét.
V1egv lósít s
...
Jelle nzően van egy elvont Epítő osztály, ame y neghatározza m'nden olyan ÖsszeLevő mű-
ködését, ameJynLk létre l07ására a7 irány'tó megkéri. A múvele ek alapé telmezés szerint
nem tesznek semm't. A KonkrétÉp"tő osztályok azon elemek esetében felülbírálják a műve-
leteket, amelyel{nek a létrehozásában érd.ekeltek.
A megva ósítássa kapcsolatban az alábbiakat kell figyelembe venni:
... ...
1. Osszeállítási és építésifelület. Az Ep'tők a termékeket .épésrő. lépésre alkotják meg,
",
ezért az Ipítő osztály felületének eléggé általánosnak keJllennie ahhoz, hOb min-
e enféle konkrét ép'tő számára lehetővé tegye a termékek létre 10zását.
A teIVezés kulcsproblémája az építési és összeállítási Illodell. Azo ;r a modellek álta.lá-
ban ke égítőe {, ahol a lét ehozási kérelmek eredlnényét egyszeruen hozLJ.csatolják
a termékhez. A RTF-es példában a építő átala dtja a következő elemet, és hOLío;áfűzi
az add."g már átalaki'tott szöveg 1ez.
Néha vis70nt hozzá (elJ férni a korá 1ban felépített te mék eleme 'hez. A Példakód
,;
részben lévő labirintusos példában a Ma7eBuilder (LabirintusEpítő) felü et lehetősé-
get ad arra, hogy egy ajtót vegyünk fel két, már neglévő sLoba közé. Az alulról felfe-
lé építkező faszerkezetek - péld.íul az elemzőfák - egy másik példáját adják a prob-
léma megoldására. Ebben az esetben a7 építő gyermekcsomópontokat ad visSLd az
irányítónak, amely aztán átadja azokat a szü őcsomópontokat kialakító éptőnek.
,;
2. Miért nem elvont osztályokat használunk a termékekhez? Alta ános esetben a konk-
rét építők által előállított termékek oly In értékben eltérnek megje enésükben, hogy
csak 7eveset nyer 1etünk azzal, ha a küIönféle terméke dlez ugyana7t az általános
szülőosztályt rendeljük Az RfF-es példában nem túl valószínű, hogy az ASCIIS öveg
és a SzövegVezérlő objektum felülete <Ü.lÖS .esz, és az sem, hÜh'Y szükségük legyen
rá. Mivel az ügyfél általában a megfelelő konkrét építővel állítja be az irányítót, az
ügyfél tudja, hogy az Ép"tő mely konkrét a osztálya van lasználatban, és ennek neg-
felel(5en tudja kezelni a termékeket..
3, ÜresfügglJények alaPértelmezettként az Építőben. A C++ nyelvben az építő [üggvé
nyeket szándékosan nem tisztán virtuál's tagfüggvényekként vezetjük be. E lelyett
üres függvényekként határozzuk meg őket, lehctővé téve, hogy az ügyfe ek csak
a7a {al a műve]etekel bírálják felül, amelyekben érd,ekeltek.
Épft... 01
P'lda ód
A C rea t eMa z e tagfüggvény egy olyan változatát Dgjuk Iétre11ozni, amely a Ma zeBu i 1 der
osztály eb'Yik építőjét kapja argurnentumként.
A MazeBuilder osztá y a következő fel (iletet Ilatáro7za ru.eg a lab.rintus létrel10zásához:
class MazeBuilder {
publlc:
virtual void BuildMaze() { }
virtual void BuildRoom(int room) { }
virtual void BuildDoor(int roomFrom, int room To) { }
virtual Maze* GetMaze() { return O; }
protected:
MazeBuilder() ;
} i
Ez a felü et llárom dolgot képes létrehozn : (1) d labirintust, (2) szobákat a megfelelő sZo
baszáIl1mal és (3) ajté)kat a számo7ott s7011ák között A GetMaze eSzerezlabirintus) muve-
let a labirintllst a.dja. vissza d.Z ügyfélnek. A MazeBuilder alos tályai feli1lbíráljál{ ezt a mű-
veletet, t10gy a saját Il1agllk által felépített Jabirintust a já ( vissza.
A MazeBuilder összes lab+rintllsép'tő műve ete alapértelmezés szerint nem cinál em-
nlit. Nem tisztán v 6 rtuálisként vezetjük be őket, l10gy a sZJ.rlnaztatott osztályok csak azokat
a uggvénycket bírálllassák felül} amelyeklJen érdekeltek.
Ha adott a MazeBuilder fc ülct, a CreaLeMaze tagfüggvényt úgy módosíthatjuk, 110gy
e:zt £17 építéSt vegye ál paraméterként.
Maze* MazeGame::CreateMaze (MazeBuilder& builder) {
builder.BuildMaze{);
builder.BuildRoom(l);
builder.BuildRoom(2);
buj Jder.BuildDoor(l, 2);
rcturn builder.GetMaze();
}
IIas0111ítsuk össze a CreateMaze ezen változatát az eredetivel. Fih7eJjük meg, ]10gy az épí-
tő llogyan rejti el a labirintus belső ábrázolását - azaz az ajtókat, szobál(at és lakal megl1a-
táro7ó ()sztályo]<at -, és 10gyan 3.1 ítja össze ezekből az elemekből a végleges lallirintust.
Biztos van, aki már rájött r 110gy vannak olyan osztályok, aITlelyek a szolJák és aj ók megjele-
nítésére s701gálnak, de nyoma sincs a -alak megjelenítésére valóknak Ez megl{önny"'t a la-
birintus megjelenítési módjának megváltoztatását, mivel a MazeBuilder egyik ügyfelét
sem kell megváltoztatn"..
2 3. fejezet · Létrehozási m nták
A többi létrehozási mintáho7 hasonlóan az Építő minta is egységbe zárja az objektumok lél-
rehozásának mÓdját, amely ebben az esetben a MazeBullder által meghatározott felü]e-
ten á történ.k Ez annyit tLS7, hogya MazeBuilder fe 11as7náJ 1ató többfe e labir'ntus fel-
építésé e. Nézzük meg e7t most a CreateComplexMaze (Lét.ehozÖss etettLabirinlus)
művelettel:
Maze* MazeGame::CreateComplexMaze (MazeBuilder& builder) {
builder.BuildRoom(l)j
/ / .-
bUllder.BuildRoom(1001);
return bUllder.GetMaze()i
}
Figyeljük meg, hogy a MazeBu .lder nem magá a labirintut hOZZd letre, a fó célja csak
anny' J hogy egy felületet határozzon meg a labirintusok létrehozásáboz. Ü 'es lnegvalósítá-
sokat 11atároz meg, főleg kénye m. szempontok miatt A l{onkrét munl{át a MazeBuilder
alosLlllyaj végzik
A StandardMazeBuilder (SzabványI abirinLUÉptŐ) alosnály egy olyan megvalóstás,
amely egyszeru la.birintusokat készt A saját maga által kés7ített labirintus adatait
a _currentMaze C_al{tuálisLabirintus) változóban tárolja..
class StandardMazeBuilder : public MazeBuilder {
public:
StandardMazeBuilder();
virtual void BuildMaze() ;
virtual void BuildRoom(int) ;
virtual void BuildDoor(int, int)j
virtual Maze* GetMaze{)i
private:
Direction CommonWall(Room*, Room*) i
Ma7e* currentMaze;
} ;
A CommonWall (KözösFal) egy olyan segédművelet, alndy megl atározza a 7obák kÖ7ti
közös falak irányát.
A Slandarill1azeBuilder konslru ootor egyszeruen csak kezdőérléket ad a currenLMaze
vá tozónak.
StandardMazeBullder: :StandardMazeBuilder () {
currentMaze = Oj
}
,
Epftó 103
".
A Bu i 1 cl11a z e (EpítLa.birintus) példá.nyosítj8 az cg'yik Ma z e osztályt) amelyet a többi lnűve-
Jet állít ()ssze, és végül "\risszaadja az ügyfélnek Ca GetMaze míívelettel)
void SlandardMa eBuilder: :BulldMa?e () {
currentMaLe = new Maze;
}
Maze* StandardMae B uilder::GetMaLe () {
return _currentMae;
}
A BuildRoom (EpítS7()ha) művelet egy s7()bátllC)7 1étre, és felépíti. a llatárol() fa]ajt:
vo ld SlandardMa7eBuilder: :BujldRoom (lnt n) {
i[ (! currentMae->RoomNo{n}) {
Room* room = new Room{n);
currentMaze->AddRoom(room};
room->SetSide(Nortn, new Wall);
room->SetSide(South, n8W Wall);
room->SetSlde(East, new Wall);
room->SctSidc(West, new Wall);
}
}
1 a ajl()t szeretnénk két s7()la 1{()7é, a StandardM:azeBuilder megJ<eresi a két szobát
a labirintusban) és a l{özös falukat:
void StandardMazeBuilder: : BuildDoor (int nl£ int n2) {
Room* rl = _currentMaze->RoomNo(nJ);
Room* r2 _currentMaze->RoomNo(n2);
Door* d = new Door(rlr r2};
rl->SetSide(CommonWall(rl£r2), d);
r2->SetSide(CommonWall(r2,rl), d);
}
Az ügyfelek most a CreateMaze művcictet és 3 SlandardM:azeBullder alosztályt eg)'Ütt
llasználva l1.ozh.atják létre a labirintust:
Ma7.e* maze;
MaeGame game;
StandarJMazeBuilder builder;
game.CreateMa7e(builder);
mazc = bujJdcr.GctMa70();
104 3. fejezet · Létreho ási minták
Berd -hattuk volna az öss es StandardMazeBullder műveletet a Maze os tályba, LS
hagyhattuk volna, hogy minden Maze osztály felépítse saját magát (azaz a labo intust) , De
ha kisebb oe vesszük a Maze osztályt, könnyebb lesz megérteni és módos"tani, LS a Stan-
dardMazeBullder alos7tályt könny( elkülöní en a Maze osztálytóI. Ennél is fontosabb,
hogya kettőt L különítve so - ele MazeBuilder építőt használha unk, amelye mindegyi-
{e különböLő oztályokat használ a szobál(, falak és a'tók létrehozására.
Egy egzotikusabb Ma zeBu il der építő a Coun t lngMa zeBu i 1 der (SzámolóLab + intus
Épí ő). Ez az ép"tő nem hoz lé re semm' yen abir'ntust, csak összes ámolja a különféle IÚ-
re110z 1ató összetevől{et
class CountingMazeBuilder : public MazeBuilder {
publlc:
CountingMazeBuilder{);
virtual void BuildMaze(),
virtual void BuildRoom(int);
virtual void BuildDoor(int, int);
vlrtual void AddWall(int, Direction);
void GetCounts(lnt&, int&) constj
private:
int _doors;
int _rooms;
} .
A konstruktor kezdőértéket ad a számlálóknak, amelyek értékét a elülbírá t MazeBuilder
műve etek növe16k
CountingMazeBuilder: .CountingMazeBuilder () {
_roams - _doors = O;
}
void CountingMazeBuilder::BuildRoom (int) {
_rooms++;
}
void CountingMazeBuilder: : BuildDoor (int, int) {
_doors+..J ..
}
void CountingMazeBuilder::GetCounts (
int& rooms, int& doors
) const {
rooms - _rooms"
doors - _doors;
}
pftó 1 05
Egy ügyfél így alkalo13zhatja például a CountingMazeBuilder alosztályt:
int rooms, doors;
Ma 7 eGame gamei
CountingMa7eBuilder builder;
garne.CreateMaze(builder) ;
builder.GetCounts(rooms, doors);
cout « .1l\. lablrintusban u
« rooms « II szoba és U
« doors « n ajtó van.. U « endl;
sme felhasznal sok
Az RTF-átalakító alkalmazás az ET++ [WGM88] része. Szövegkiala.kító blokkja egy építőt
11asznál az RTP formátumban táralt szöveg feldolgozására.
,;
Az Epítő a Smalltalk-80 [Pa.r901 esetében á1talános minta:
· A [ordítói alrendszerhen a I)arse (Elemző) osztály egy olyan Irányító, amely egyr
,;
ProgramNodeBuilder (IJrog r amCsomópontEpít6) nevű objektul11.ot kap a _&gumen-
tumként A Parser objektumc)k értesítik saját I)rogramNodeBuilder objektun1ukat,
amikor felismeI nek egy nyelvtani szerkezetet+ Miután az elemző végzett, elkéri az
ép/tőtól azt az elemzőfát, amelyet felépített, (s visszaadja aL ügyfélnek.
A ClassBuilder (OsztályÉpító) olyan építő, amelyet a7 osztályok (Class) 1asználnak
arra, }logy alc)s7tályc)kat hozzanak létre saját részükre. Ebben az esetben a Class egy-
szerre Irányító és Term.ék.
· A ByteCodeStream (BájtKódFolyam) olyan építő! amely bájttömb ormájában hoz
létre egy lefardított metódust. A ByteCodeSlream az Építé) minta nem szabványos
fel11as7nálási módja, mert a létre 1020tt összetett objektum bájttömb fOflllájában kó-
dolt nem normál Smalltalk objektu llként. A ByteCodeSlream felülete vi&zont olyan,
mint az épít6ké általában, és a ByteCodeSt eam könnyen lecserélhető m.ás olyan
osztá yokra, amelyek ÖSs7etelt objektumként jelenítik meg a programokat.
Az Adaptive Communications Environment szolgáltatásbeállító keretrendszere (SelVice
Configurator) egy építő segítségével alkotja meg a hálózati szoJgáltatási összetevőket, alne-
lyTek futásidő11en kapcsolód.nal< egy kiszolgálóhoz [5594]. Az összetevőket vala.milyen beál-
lítási nye v írja le, am.ely egy LALR(l) elem z ővel elemez11ető. A jelentése emző eljárások
azon d7 építőn hajtanak végre művelete!cet, amely a szolgáltatási összetcvő11öz ad l1üzzá in-
formációl{at. Ebben az esetben az elem7ő Irányító.
106 3. fejezet · Létrehozási minták
Kapcsolódo mint'
Az Elvont gyár annyiban hasonlít al. EpítÓhöz, hogy az is összetett objektumok megalkotá-
sára képes. A legfóób eltérés közöttük, hogy az Építő minta az Összetett objektumok lépés-
rőllépésre történő lét -ehozását helycLi előté -be, a7 Elvont gyár pedig a termékobjektum-
,
családokra helyezi a hangsÚlyt (legyenek azok egyszerűek vagy összetettek) Az EpítÓ utol-
só lépésként adja vissza a terméket, míg a7 Elvont h7ár azonnal.
Az építő gyakran Összetétekket kész':t (lásd az Összetétel terve z ési lnintát).
, .
I
Osztál}rJétre110zási minta
Cél
Felület meghatároLása egy objektum létrehozásához, az alosztályokra bízva, melyik osz-
tályt példányosítJák. A f,yártófüggvények lTIcgengedik az osztályoknak, hOb? a példányosí-
tást 3.2 alosztályokra rullázzák álo
Egyéb nevek
r:lctory Met}1()d, Gyár módszer, Gyártó metódus, Virtl1ális konslru]{tor
lad t
A keretrendsLerek elvont osztályokat használnak az objektumok kÖ7ötti kapcsolatok meg-
határo.lására és fenntartására. A keretrendszer gyal{[an felelős ezeknek az objektl11110knak
a Iétrell07ásáért is.
Kép.leljünk el egy olyan alkalmaLásokhoz valÓ ke etrendszeit\ amely több dokumentumot
is meg tUtl jeleníteni a feJJ1asLnál() szárnára. ElJben a l{e .etrendS7erben a két fő clem az Al-
kalmazás CAppHcation) és a Dokumentum (Document) oS7tály. Mindkét osztály elvont, és
az ügyfeleknek alosztályt kell belőlük készíteni ahhoz, hogy elő tudják állítani eLen osztá-
lyok alkalmazásfüggő megvalósításail. Egy .ajzolóprogram létrehoLásához például a Rajz-
Alkalma7ás CDrawingApplication) és a RajzDokumentum CDrawingDocument) osztályt b:a-
tározzuk meg. Al. Alkal111aLás osztály felel a dokumentumok kezeléséért, és ez h07za őket
létre, .lmjko arra szükség van, az.az amikor a felhasználó egy menüben például a Megnyi-
tás vagy az Új elemet választja.
Gyártófüggvény 07
Mivel az, 110gy melyik Dol<:umc::ntulTI alosLtályból kclll)éldányt16lrellozni, alkalll1azáslüg
gőJ az Alkalmazás ()sztály nen1 tU(ijl el(5re megjéJs()lni, melyik I)ol{l1Jl1entum alosztályt 1<e1I
példá.ny.osítanJ - csak 3.zt tudja, 110gy rnikor kell új dokumentumot létfcllozni, azt nem,
110gy n1iljJcn típu.súl. Ez egy nagy pr()l)lémát vel fel: a kerelrend.s7ernek péJdányoI<al kel]
előállít3.ni. az osztályokllól, dc csal\: az cJvont osztályokat ismeri, a.melyeket viszont nem
lud példányosílani.
Erre a problérnára a Gyártófügg\lény minta ajánlja a megolclásl A gyárlófüggvCny zárja egy-
ségbe al l ludást, }lCJgy mel)Tik ])()ku nlentu m a]()s7táI yt J<elllétrel1c)7Jl1, és l<iemelj ezt a tu-
dást a l{erctrcndsLerből.
Dokumentum
dokumentumok
Ikalmazás
Megnyff()
BfJZár(}
MentO
Visszaállft()
Létr hozDokumentum()
,.
UjDokumentum() 0-
M gnyitDokumanwm()
DokumenbJm dokumentum = létrehoz()oku m en um);
- - - - - - - - - do kumentumok.Hozzáad(dokumentum);
do kumentum->Megnyit{};
SajátDokum.
SajátAlkalmazás
LétrehozDokumentumn O .... - - rerum new SajátDokumentum
Az AJkalma z ás alcJsztály()k_ az Alkalmazás osztályon Jl1Űködő elvont Létre110zDokulnentllIIl
(CreateDocum.ent) m.ű\re]et felü.lírá.s3.val 3.dj3.k vissza a rllcg :clclő Dol{umentum alosztál)tl.
Az Alkalmazás al()sztály péld.ányosílása után nlár képes példányosítanj az aJ]<a1111azásfüggő
doku nlentu mo]<at, anélkü], hogy tudn.á t t11elyik osztálylJ3. tartozn.al{. A LétrcllozDoku-
rllcntllffi műveletet gyártófüggvénynek (gyárl{) melód.llsnak) is neveziJ<, Jllert ez felel az ob-
je ktLl111 () k , 1 e gyá rtásáért n .
A kalmazhatós I
A G)lárt{)fLigg\7ény Inintát az aJáb11i esetek11en l1aS7JláJjll]<:
· Az osztály nem tlldja előre mcgjósolni milyen ()lJjektum()szlályt kelllélre loznja
· A7. oS7tály llt s?:eretné eJérni, 110gy az alosztályai adjá]{ meg, milyen olJjcktllffiOt l(cll
létrcllozni.
· Az osztályok álrutlázzák a felelősséget a száJTIc)s segíte) alosztáJy egYl1(ére, és 11l.i S2e
retnénk tudni, melyik lctt a l(épvisclő
108 3. fejezet · Létrehozási mjnták
S rk
Létrehoz6
T elTT1ék
Gy tt6Függvény()
EgyMúvelet{)
..... 1""""1'..... __
...
term ók = GyártóFügg\lény()
....
Konkré ennék
...-_---... ------
onkr t tre o 6
Gy rt6Függvnv() 0- - - - - rerum new Kon T enné To
R sztvevo
Termék (DokulnLntum)
Meg11atáro a a gyáltófüggvény általlét eJl0zott objektul110k felületét.
KonkrétTermék CSajátDo '""um.entum)
o-r Megvalösít.a a Termék felüle et
· Létrehozó (Alkalmazás)
- Meghatározza azt a gyártófilggvényt ame y egy Termék (Pro du ct} típusu objektu-
mot ad vissza. A Létrehozó (Creator) meg latá'o ha ja a függvény valamilyen alap-
értelmezett megva ósítását is, a nely egy alapérte mezett Kon { ÚTernlé \: objektu
mot ad vissza.
- Megh"'v]latja a Ter 1 ék obje ctumot létre lOZÓ gyártofüggvényt
· Konkrétlétrehozo CSajátAlka ma7ás)
- felülbírálja a gyártó függvényt, hogya KonkrÜTermék aloszLá y egy példányát aL -
. .
Ja v ssza.
Egy ttmu .. dés
· A létrehozó a saját alosztálya'ra bí a a gyartófüggvény meghatározását, hogy az a meg-
fele ő KonkrétTenné \: alos7tály egy példányát a ja vissza.
,"..v t
m'y
A gyá tófüggvénye ( kiküszöbö ik a7 a]l{al. 1azá uggő osztályc)k kódhoz kötésének szül{sé-
gességét. A kód cak a Termék felülettel foglalkozik, ezért képes ef,yütt lűködni Jármely
felhasználó á tal meg 1dtdrozott Kon rétTermék os tállyaI.
yártofüggv ny 109
A hryárLó uggvényel<ben ejlő hátrdny a7, hogy az ügyfelekne].c esetleg a Létre] ozo osztá y-
ból is a osztá yt kell étrell0zn.uk egy a ott Kan '(rétTermék objel(tum elkésztéséllez Az al
os tály-s dr 1 a tatás a bJ a esetben 1 egfeJel, ha az ügy eIne { amúgy 6 salosztályt :re le-
ne létrel10znia a Létrehozó osztályból, de a töblJi esetben az ügyfélnek ilyenkor egy masik
k.bontako asi ponttal i foglal {oznia kell.
AGyártófüggvény mintá.nak többe {l{özöt két előnye van:
1. Horgokat biztosít az alosztályok számára Ha egy osztályon belül gyártó llgg
vénnyel 110zunk létre objektu 1 ol{at, az mindig rugalmasabb, mintlIa (özvetlenü
110znánk étre azol{at. A Gyártófüggvény minta eg)! olyan 10roggal C 100 {) láta el az
alosztályokat, amelynek seg-'tségéve létre 10Z lató a7 objektum lJőv"'lett vá]tozata
A dokumentumos példában a Dokumentum oszt/.lyban megl1atároz11dtó egy Létre-
hozFájll)árbes édablak (CreateFileDia ag) nevű gyárté)függvény, amelyegy aJapér-
teJmezett pá beszédab]ak-objekturnot 1102 ét"e a meglévő dokumentumoJc mcgnyi
tásáhoL. A Dokumentum alosz ály ezt a függvényt felülbírálva határo7hat meg egy
alkalmdzás l1ggé5 pá 1es7éda l]akot Ebben az ese ben a gyártófüggvény nem e vont,
11anem egy ésszerű alapértel1 ezett mcgvalóítást tes le11et6vé.
2. Összekapcsolja a párlluzalnos osztálY/1ierar.chiákat. Az eddig vizsgált példákban
a gyártófüggvényt csak a Létre110zó osztá yalc 11lvták meg, de ennek nem kell okvet-
lenül így lennie. A7 ügyfelel< is hasznosnak taláIJ1.atják a gyártófüggvén.yel{et, főleg
pár]1u7al11os osztályhjera &Clliák ese ében.
l)árlluzamos osztálylliera WCllák akkor jönnek létre, amikor egy osztály átadja fele őssé-
g6 körének egy részét egy mási {, önálló osz á.lynak. KélJZel'ünk el egy olyan rajzot,
a.tlli interaktív módon módosít lató, azaz nyújtllató, áthelyezhető és elforgatható az
egér segít'iégével. Ennek megva]ósítása nem mindig könnyű, gyakran van hozzá szük-
ség a mo osítások egy adott időpontbel állapotát tükröző adatok táro ásárJ. és frisíté-
sére. Ezekre az állapotOnformációl{ a csa (a llÓdosításo {során van szü {ség, ezért nem
l{ell azo {at a rajzobjeJtumban tá olni6 EL:cnkívü a kü önböző fJ.jzok módoításkor kü-
lönbözőképpen viselkednek. EhYf vonal nyújtása 1éldául ol{OZ]1a .a az egyi]{ végpont
áthelyezését, míg egy szöveges ábra nYÚjtásakor a so távolság vá tozllat.
Ezek miat a korlátozáso miat jobb külön Mé)d()sÍtó (Maniptlator) objektumot
11asználni, amely megva ós.tja az inte aktiv.tást, és nyilvánta + ja a módosításllOZ
szükséges állapotinformációkat. A különféle ábrák külc)obö7ő Mód.QsíLÓ aloszrá yo-
kat11asználhatnak a7 egyes műveletek :re elésé e. Az így l<a ot Mó - .Qsító osz álylli-
,;
e archia (legalább "észben) il eszl(edik az Abra CFigUfC) ot>ztály11ierarchiá110z:
110 3. fejezet · Létrehozási minták
...
bra Ugyfél - M6dosító
... - -
LétrehozIfA6dosft6() LeKattint()
..... HúzO
FelKattint(}
/\ A
"11"1""".... __ I . .
I !
Vo na lÁb ra Szöve Ábra VonalMódosító S övegM6dosftó
LétrehozM6 do sftó() létrehozM6dosftó(} LaKatti ntO e Kattint()
.... ... HU2( ) HúzO
. -r T I Fel Katti nt() ..... el Kattint()
I I I I
I I
I
I____---------_L__________
I
I
I
I
J
-------------------_____I
".,
Az Abra osztály egy olyan Létrcho7MódosÍtó gyártófüggvényt biztosít, amely lehető-
,
vé teszi, hogy az ügyfelek létrehozzák a megfelelő Módosító alos7.tályt. Az Abra al-
oszt11yok e függvényt felü I bírálva adják viss7a a Módosító alos7tály egy olyan példá-
,
nyit, amely s7ámukra megfelelő. A másik Jehct6ség, hogy az AlJra osztály valósítja
meg a LétrehozMÓdosító műveletet, Úgy, hogy az egy alapértelmezett MÓdosítÓ pél-
...
dányt adjon vissza, és az Abra alosztályok egyszeníen csak öröklik az alapértelme-
zést. Az ezt végrehajtó Ábra osztályok.1.1k nincs szükségük semJnilyen 111cgfeleló
Módosító alosztályra: emÜltl a hierarchiák csak rés7legcsen "párhuzamosak".
FigyeljÜk meg, hogyagyártófüggvény hogyan határozza meg a két osztályhierarchia
közötti kapcsolatot: meghatározva azt, hogy mely osztályok tudása tartozik egyÜvé.
Megv losítás
A G)rártc)függvé]1Y lninta ]11eg\tj.l{)sításal((Jr legyünk le]<intctte] a l{övetl<ezőkre:
1. Két jobb változat létezik. A Gyártófüggvény mintának két főbb változata létezik: (1)
az az eset, amiko' a LétrehoLó elvont osztály, és nem biztosítja aL általa meghatáro-
zott gyárlófü.ggvén)T semll1ilyen mehrvalósítását, és (2) a7 az eset, al11il«()r a Létrehozó
konkrét osztály, és biztosítja a b'Yártófüggvény egy alapértelmezett megvalÓsításál.
A7 is lehetséges, hogy egy olyan elvont osztályunk lLgyen, amely n1cghatároz vab-
rnilyen alapértelme ett megvalósítást) dc e7 nem túl gyakori.
Az első esetben az alosztályok kötelezőek a mehTVaJósítás mcghatározásához) mert
nincs semmilyen elfogadható alapértehnczés. Ez azt a xoblémát vcti iel, hogy előre
nenl látl131ó lJosztályokat 1\.cl1 Jlé dányosítani. A nlásodik esetben a l{onkrét 1 étrcllO-
zÓ agyártÓfüggvényt eJsősorhan a rugalInassága miatt veszi igénybe. A szabálya kö-
v<....tkező: "AL objektumokat kÜlÖn műveletteJ hozzuk letre, hogy az alosztályok felül
tudják bíráln' a létrehozásuk módját." Ez a szabáJy biztosítja, hogy az alos7tályterve-
zők 7ükség esetén mÓdosíthassák azokat az objektumosztályokat, amelyeket a szü-
léSosztál)lai]{ péIJ.ányosítanak
Gyarto üggvény
2. Pararnéte1ezetl g)JártófuggvénjJek. A minta egy 11l.ás._k váll()zata lelletőséget ad. arra,
110gy 3. gyá.rtófügh)"\lény többjele terrn.éket IlozLon lét +e+ A tllgg\rény ekkol egy ol)!an
paramétert kap, amely azonc)sílja l. létrcllozandó obje]{lumtípust. A függvény által
készített min.den ()11jektum közösen a 1'ermék fclületet llasználja. A d.ol{Ul11cntumos
példáIlan aL all(almazás tölJ11féle clol(umentul11 llasználltát fficgenged]leti; el)lleZ
1 Létre110zDo]{umentulll műveletnek álad.unk még eID! paraméterl, amely megadja,
mil}Ten típusú dO]{l1menlumot l(cllletre110zni
A Unidraw grafikus szerl{es7té5 keretren( szer rVL901 e7l a megköLclítést ]laS7]lálja
a lemezre rnentelt objektu11101{ llJraalkc}lására. Egy Crea.tor nevíí ()sztályt ta]á.lunl<
benn.e, a Create gyártófüggvénnyel arTIcly egy osztá1yaz()nosítót 1(3.]) 3.rgU!11enlUm-
ként. Az osztályaz()nosító adja lneg, melyik oSLtályt kell pél(iányosítani A.rnlkor
a Uniclra-vv r lemezre Illel1! egy ()bjcl{tumot, először az ()sztályazonosítót írja l<i, 111ajd
a példányválto7éJkat. Amikor újraalkolja 37 ()l)jcl{(lln10t a leme7ré51, az osztál)lazon.o-
síté}l ()lvassa be először.
Az osztályazonosít() beolvasása után a keretrend.szcr megJ:lívja a Creale gyártó l.igg-
Vél1yt ét, átadja nel,j paraméterként 3.2 3.Z0 .1osítót A Crea te rncgl{eresi. a megfelelő
osztály110z tarlozó konstruktort, és azt tlasználja az objektumpéldány létre}lozásárl
Véglll a Create megl1ívja az olJjcktum Read (Olvas) művcletét, a1JJ.el)! 11eolvlssa
a letnezről a7 ()bjel{tum többi 3.datát, és cl61(észíti az obJel<tum pél<-lányváltozóit.
A para.méterezett gyárt{)függvény általánc)s f()rnlája a kö\retkező: CA MyProduct és
a YourProduct a l.)roduct osztályal(Jsztályai.)
class Creator {
public:
virtual product* Create(ProductId);
} i
product* Creator: :Create (ProducLld id) {
if (id == MINE) return new Myproduct;
if (id == YOURS) return new Yourproduct;
lia több" Lermék esetóbcn ismét16dik.
return O;
}
A par3.méterezett gyárléJfüggvény felülllírálása a Létrel10Ló (Creator) állal előállított
terméJ<el< egyszerű bővítését és mód.osítás3.t teszi ]eJlelc)vé. Az új tCfrnékfajtál{Jlol új
aLonosítókat lehet be\'czctni illetve más termékcl<11ez társít11atjul( a n1ár lTIcglévő
a7:()nosílókal.
A MyCreator (SajátLétrellozó) alosztály cgítségével felcserél11elc) péld.á.ul a My-
IJr(Jduct (EnyérnTerrnék) és a You Product (TiédIermél() alosztály, és táITI()gatl121ó
egy (lj rrheirproduct (Övél<Termék) alosztály:
Product* MyCreator::Create (ProductId id) {
if (id == YOURS) return new Myproduct;
if (id == MINE) return now YourProducti
//Megjegyzés: a YOURS (tiéd) és a MINE (enyém) megcserélése
1 3 ejezet Letrehozási mjntak
if (id = THEIRS) return new TheirProduct;
}
return Creator::Create(id);
//ezt akkor hlvJa meg a program, ha a többi meghiúsul
Figyeljük meg, hObY ez.i múvelet az uto só lépésben meghívja a Create-et d SZÜ Ő-
osztályra. Ennek o'{a, hogy a MyCreator' 'Create csak a YOURS, MINE és THEIRS
osztályokat kezeli másképpen, mint a szülőosztaly. Más osztá yokban nincs érde-
keltsége, Em',att a My Creator alosztály kibővíti a étrehozott termékfa'tákat, és kevés
kivétellel a összes termék étrehozásána { :elelősségét átruház a saját szülőjére.
3. Nyelvfüggő változatok és problénák. A ülönböző nyelvek további é dekes vál oza-
tok használatát teszi r lehetővé, és további hi alehelőségeket rejlenek.
A Srna ltalk programok gyak an használnak olyan üggvényt (metódust), amely
visszaadja a példányostandó objektum osztályát. A lé reho Ó gy.1rtófüggvény ezt az
értéket egy termék lé rehoz,ísához használhatja, tárolását vagy akár a kis ámítását
pedig egy Konkrétlétrehozó alosztály vállalhat'a. Az eredmény: még késóbb' rö és
a példányosítandó Konkré Termé , losztálytípushoz.
A dokumentumos példa Sma ltalk nyelven írt válto atában meghatározható egy
documentClass (dokumentumOsztá y) metódus az Application osztá yra. A do-
cumentClass a meg elelő Document oszláJyt adja vissza a dokumentumok példá-
nyosí ásához. A documentClass metódusnak a MyApplication alosztályban törté-
nő megvalósítása a MyDocument osztályt adja vissza. Igya Applicatlon osztályban
a k_övetkez6k vannak:
clientMethod
document := self documentClass new.
documentClass
self sUbclassResponsibility
A MyApplication osz ályban pedig ezek:
documentClass
A MyDocurnent
Ez az Applicatlon osztályhoz példányosítandÓ MyDocument osztályt adja viS7a.
Egy meg rug lmasabb, a paramétere eU gyártófüggvényekhe 1 _asonJó megközeJí-
tés, ha a létrehozandÓ osztályt az Application osztály oS7tályváltozó'aként tárol-
juk. Ily módon a terme <: különböző változatainak előál ításához nem ke al os ztályo-
ka létreho nl a Application oszlályhoz.
A C++ nyelvben a gyártófüggvények mindig virtuális függvények, és gyakran tisztán
virtuá isak. Csa{ arra vigyázzunk, hogy ne hívjunk leg gyártófüggvényt a Létrehozó
konstruktoában - a Konkrétlétrehozó alosztá yban ugyanis ekkor ég nincs je en.
Ezt úgy kerülhet'ük el, ha ügyelünk arra, hogya ter" _ékeket ki árólah olyan elérési
műveletekkel próbáljuk meg elérni, amelye { 'gényesetén hozzák létre a terméket.
A konkrét termék konstruktorban való étrehozása helyett a <:onstruklor csak O kez-
dőértéket ad, Az elérési művelet visszaad'a a termé ret, de e6Jb e lenő zi, 10gy cak-
Gyá rtófü ggvény 13
ugyan Iéte7ik-e, és 113 nem t akkor lérrehozza. E7t a módszert néha lusta előkészítésnek
C a7Y initialization) · s nevezik. A kc)vetke7ő ]<ód egy jellegzetes megvalós"tást nutat:
class Creator {
publlc:
Product* Getproduct();
protected. :
virtua Product* Createproduct();
private:
Product* -product;
} i
Product* Creator::GetProduct () {
j f (-product == O) {
-product = CreateProduct();
}
return -product;
}
4. Sablorlok használata az alosztálykészítés elke1'Ülése érdekében. Am.nl már említettük
a gyártófüggvényekben rejlő másil{ lehetséges buktató az, hc)gy időn (ént csak azért
kell alosztályokat e]őálltanunl(, 110gy létrell()7hassuk a lnegfelcló termékc)bjektumo-
kat A C++ nyelvben ez úgy keru heteS meg, ha a Lét "e110zó (Creator) osztályból sab-
ana os tályt hozunk létre, amely a Termék (l)roduct) osztá yt l{apja paraméterként:
class Creator {
pubJic:
virtual Product* CreateProduct() = O;
} ;
ternplate <class TheProduct>
class StandardCreator: public Creator {
pu.bl ic :
virtual Product* Createproduct()i
} ;
template <class TheProduct>
Product* StandardCreator<TheProduct>::CreateProduct () {
return new TheProduct;
}
Ezt a sah .ont llasznj.lva az Ül:,'Yel csak a tern1ékosztályt "száll'tja", ezél1 nincs szük-
ség alfa, llogy alos7tályokat llozzunk létre a Iélrell0zó osztálylloz.
class MyProduct : public Product {
public:
Myproduct();
II.....
} ;
StandardCreator<MyProduct> myCreator;
11 3. fejezet · Lét ehozási minták
5. Névadási szabályok Jó ötlet, ha olyan névadás' s7abályokat hasznalunk, amelyek
e,gyértelművé teszik, hogy gyártófüggvényekrőJ van szó. Példáu a MacApp
Macintosh alkalma7ási keretrendszer lApp891 azt az elvont műveletet, amely megha-
tározza agyártófüggvényt, Class* DoMakeClass () f(Jrmában vezet. bL, allal
a Class a Termék osztály
Peld kód
A l{orábban már látott CreateMaze függvény egy labirintust 110Z létre és ad vissza. E el
a függvénnye az az e!"'Yik gond, hogy mereven kódolja a labi intus, a szobák, az a 'tó { é
a falak osztályait. A gyártófühgvényeket azért vezetjük be, hogya alosztályok választ1as-
sJk k ezeket az elelncket
Elős7ör latá oz7uk meg a Ma zeGame labirintus, s oba, fal és ajtó objektumait létrehozó
függvényel{et:
class MazeGarne {
.public:
Maze* CreateMaze();
1/ gyártófüggvények
virtual Maze* MakeMaze() const
{ return new Maze; }
virtual Room* MakeRoom(int n) const
{ return new Room{n); }
virlual Wall* MakeWall() const
{ return new Wall; }
virtual Door* MakeDoor(Room* rI, Room* r2) const
{ return new Door(rl, r2); }
} ;
MindehTf'k gyártófüggvény egy adott típusú labirintuselemet ad vissza. A MazeGame osztá y
olyan alapértelmezett megvalósításokat biztosít} amelyek a legegyszerubb típusú labirintu
sokat, S ollákat, falakat és ajtókat adják viSS7a.
Most új +aírhaquk a CreateMaze osztályt úgy, hogy ezeket a gyártófÜggvényeket haszná ja:
Maze* MazeGame::CreateMaze () {
Maze* aMaze = MakeMaze();
Room* rl = MakeRoom{l);
Room* r2 = MakeRoom(2);
Door* theDoor MakeDoor(rl J r2);
Gyártófüggvény 115
aM"a ze->Add.Room (ri) ;
aMdzc->AddRoom(r2) ;
rl->SetSide{Norlh/ MakeWall{}};
rl->SetS.de(East/ theDoor);
rl->SctSide(South, MakeWall());
r]->SptSide(West, MakeWall());
r2>SetSide(Northt MakeWall{});
r2->SetSide(Cast t MakeWall());
r2->SetS.de(South/ MakeWall());
r2->SetSide(West, theDoor) j
return aMaei
}
A különféle játéko]{ alos7tályoJ{at }1{)zllatnak létre aMazeGame osztályl1.0Z a labiri]lll1S eJe-
JTIeiJlel< megadása érdekében. Ezel( az alos7tál y T ol{ a7lán felülbír{illlatják a gyá.rtófüggvé-
nyel( egy részét vagy akár az öSSZest úgy, 110gy azo { a termél{ különféle változatait ld.ják
ViSSZl. A BombedM:azeGame alosztály péJd.ául ()Iyan új megl13tároLásol{at a.d11at 3. Room és
a Wall terrnékeknek, Il()gy azol( a bomba.rolJba 1ás utáni változatokat aciják vissza:
class BombedMazeGame : public MdzeGarnc {
public:
BombedMa.zeGame ( ) ;
virtual Wall* MakeWall{) const
{ return new BombedWall; }
virtual Roorn* MakeRoom(int n) const
{ return new RoomWithhBomb(n); }
} I
Az Enchan L ecl1Jla zeGame változat vajallogy így llatárc)zl1ató rncg:
class EnchantcdMazeGame : public MazeGame {
public:
EnchantedMazeGame{};
virtual Room* MakcRoom(.nt n) const
{ return new EnchantedRoom(n, CastSpell()); }
virtual Door* MakeDoor(Room* rit Room* r2) const
{ return new DoorNeedjngSpell{rl/ r2); }
protected:
Spe II * CastSpell () COTlst;
} i
16 3. fejezet Letrehozási minták
Ism rt elh s n'l sok
A gyártófüggvények meglehetősen elterjedte 7 a2 elemkészletekben és a keretrendszerek-
ben. A korábban említet doku en limos példa egy jellegzetes fell asználási .1 ód a MacApp
és az ET++ rWGM88 ren s7erel{ben. A módosítós példa a Un.drawból s7ár 1azik.
A S all aIk-80 Model/View/Controller C nod.eI -nézet-vezérlő) keretrendszerének Class
V'ew (Osztá ynézet) né7etében egy defaul Con roller (alapértelme ettVezér1ő) nevű osZ
tályt találunk, amely egy vezér őt ho étre, és ez gyárlófüggvénynek is túnhe - [Par90], de
a V"ew osztályalosztályai megadják saját alapé11elme7ett vezér1őjük osztályát a által hogy
meghatároz7ák a defau tControllerClass osztályt, amely azt az osztályt ad 'a vissza, amelybő
"
a defau tCo1troller pél .inyo ':at készít. Igy tehát valójában a defaul ControllerClass az .gaz"
gyártó uggvCny, teh/.t az alosztá yoknal{ azt l{e 1 felülbíráIniuk
A 5ma Ita k-80 nyelvben egy sokkallnis tikusabb példa a Be 1avior (Viselkec és) osztály (J-Z
oS7tá yokat jelképező öss eo; ob"ektumot tartalmazó Dosztály) által meghatCrozott parser-
Cass (elemzőOsztály) ,gyártó uggvény (gyártó lnetódus), amely lel etéjvé tes ., hogy az osz-
tályok testres abott elemzőprogramot használjanak a forráskód'10Z. Egy ügyfél meghatároz-
hat példáu egy SQLParser (SQLElemező) osztályt eh1f beágyazott SQL-utasításokat tartdlma
zó as7tá y forrás {ódjának e em7éséhe7. A Behavior osztálya parserClass megva Ól ásáva
r. szabványos Smalltalk Parser osz ályt adja vissza. A beágyazott SQL-u 'asításo at tartalmazó
OS2 ály ezt a metódust h'ráljd felül (mint osztá ymetódust), és az SQLParser osz 'ályt adja
.
VIssZa.
Az IONA Technologies [ION94] cég Orbix ORB rendszere a Gyártófüggvény minta segítsé-
géve! hoz létre megfelelő típusú helyettest C ásd a H elyettes teJVezéi mintát), ami or egy
objektum egy távoli obje num a mutató hivatkozást kér. AGyártófüggvény Illint., neg-
könnyíti az alapértehnezeu 1elyCtles lecseré ését p rldául egy olyanra, alllC y fel1as ná Ó
o da i gyorstárat l1as nálo
pesol' do mint k
A Elvon gyár mintát gYdkran gyártófüggvényekkel v lósít'ák llleg. Az Elvont gyár minta
Feladat részében e 1 Iített példa szintén egy gyártótuggvényt sZemléltet.
Agyártófüggvényeket álta ában sablonfüggvényekben hívják meg. A fentebb emlí ett do-
,.umentumos pé dában az ÚjDokumentum (NewDocumen) is ilyen sablon =tigb-'Vény.
A prototípuok nem igénylik, 10gy alos7tályokat hozzunk lé re a I étreho7ó osztályból, de
gya 'an szükségük van egy, a Termék os tályon végre 1-ajtott Előkés ít (InítiaIi7e) művelet
re. A Létreho ó osztály az Előkészít művelet segítségével készíti elő az objektumot. A gyár-
tófüggvényeknck n' ncs szükségü . ilyen műveletre.
Prototfpu.s 117
I I I I
Objel{tllmlétrehozás. minta
Cél
]Jrototípus péJd.ány has7nálatáva] meg]latározni milyen típusú objektumokat kelllélrelloz-
ni, az új olJjcl\..lumol\:3t })cllig ennek a prototípusnak a lemásolásával e]őállítani.
Feladat
Kottas7:er (eszte5 prograo1.ot szeretnél1k kész"Íteni? átszabva egy képszerkesztő]<llÖ7 való ál-
tllános keretrendszert, és 11angjegyeket, s7ünetjeleket, 6.1]etve }{ott3.vona.la.kat jelképező (lj
olljektumo]{at adva a]lhoz. A szerl{esztő keretrendszer11cz egy olyan eszk()7paletta tog tar-
tozni, amelynek segítségével ezeket a zenei ol1jektL1D1okat felveh.etjü1{ a 1(ottá.b-l6 A palettán
lehetnel{ még a 7ene. obJel(tum.ok kijelölésére, átllelyeLésérc és Inás m()(J.()n tc)rtén() módo-
sítása.fa. szolgaló eszközök is. Ha a rellllsználó negyed 11angjegyeket akar felven.ni a kottá-
ba, a ,negye(J hdng eS7ki)zre" kattint, és azt Jlasználja+ I-Ia a llangjcgyet felfelé vah'Y lefelé
szcretn.é mozgatni a, kotta ötvonalas rcndsLcrében, megváItozlatva a hangnlagasságát, arra
az "átllelyezés eszköz" 11asználllató.
Tétclezzül\. fel t t10hY a keretrendszer 11i7losÍl egyelvont Graf (3 (GrapI1ics) osztályt a grafi
](US összetevőkJIÖZ, al11ilyenek a l1a.ngjegyek és a kottav()nalak, valamint egyelvont Eszl{öz
(Tool) osztályt a pa ettán lévő eS7k()7CJk megJlatározásá110Z. EzenkíVÜl l(észen biLtosítja
a Grafi1{usFs7]<ÖZ CGraplljcTool) alosztályt a grafikus olJjckturTIok péld.ányaiL előállít() és
azo!(at a dol{umcntuml10z adó eszközökllÖZ.
A Grafil{usEszköz osztályazonban gondot jelent a keretrendszer-tervezől1ek A llangjchryck
és k()tlav()nalal< oS7lályaj csak erre lZ alkalmazásra jellemzőek, dc a GrafikusEs7kc)z o.s7táJy
a keretrendszerllez taltDzik. A GrafikusEszköz nem tudja, 11()gydO 1107zon létre példányokat
a zenei oS7tályc)klJc)l, és })()gyan adja azokat a kottá.l10Z+ Persze szármdztatllatnánk alc)s7tályo-
l(at a Grafil<l sEszl{öz osztályból a zenc. objektu nak különféle tíl)u.s-lj}1()7, de e]{ (or nagyon
sok alosztály jönne létre t anlelyek csak az általuk példányosított zenei objel,,-lumok típusában
térnének el egylnástól. Azt már tudjuk 110gy aL oojcktum-összetéte az alos7tály]{észítés ru-
galma.5 altcrnatívája. A kérdés csak lZ, ll()!:''Yan tUL ja e7t a l{eretrendszer a Grafi (usEszköz
()SZláJy 11éldányaLo_ak azon Gra.fika osztál(yal való pa.raméterc ..ésérc llas7nálni, arnelynek
a létre110zására szolgálnak.
A m.egoJdás: új Gra.lka. osztály készíttetése a GrafikusEs kc)z osztá Iyal, e .11ásolva vagy
"klónozva' egy Grlfik-l aI()S7lály egy példállyát. Ezt a példányt llÍVjuk prototípusnak.
A GrafikusEsz]{öz osztályazt a prototÍ!JUst kapja parallléterként, anlelyet :rlónoznia l(el J és
a dokumentuml1()] l{el1 ad.nia. lIa minden Graf+ka a.losztály tárllogatja a <Jőnc)? (Cl(}ne) mű-
veletet, akkc)f a Grat1kusEsz]<öz osztálya Gra.fika. osztály bármely típusát képes :rlónozn'.
118 3. fejezet · Létrehozásj minták
I(J)ttaszerl<.cSZlőnkben lellát nl.indcn zeneio11jel<tuln-készJtő eszkc}] a GrarikusEszl(öz ()Sz-
tály egy példánya, amelyet kü1önbÖ7(5 prototípusokkal készítünk elő. Mind.eyik Grafikus-
ES7köz példány egy zenei objektumot h07létre, mégpedig úgy, hogy klónozza saját proto-
típusát majd. felveszi a klónt a kotlát)l+
proto
- Gralika
Rajzo/(Pozfcí6)
Kl6noz(}
tipus .
J
I
Kottavonar HangJegy
Rajzol (POZ( c ió)
Klónoz( ) J\
""TI"'- _ __
. .
EgészHang FélHan
Ra zol (Pozfció } Rajzol (Pazfc i6)
K16noz() 9 KJ6noz(] 9
t r
fszkijz
M6doslt(}
Fo rgató Eszköz
Módosft()
Gra usEszköz
M6d Dsft{)
9
p = prototlpus-> KJ6noz()
w1i le { elhasll1 álő húz egér {
p-.> Rajzol(új pczfcl6)
}
heszór p- t a rajztm
retum másorat saját
magár61
etum máso lat saját
magár61
A Prototípus mintát az osztályok számának további csökkentésére has z nálhat juk. Külön
oS7táJyok vannak az egés7 és a fél hangjegy ekhez, dc erre valószínűleg nincs s7ükség, ehe-
lyett lehetnek ezek ugyanannak a? osztálynak a különféle bitképekhel és időtaltamokkaI
előkés7ített példányai. Az egész hangjegyek létrehozására szolgáló eS7.köz így egy olyan
GrafikusEs7kÖz osztály lesz, alllclynek prototípllsa egy olyan HangJegy (MusicalNote) osz-
tály, amely úgy van előkészítve, hogy egész hanggá vljon. Ez rendkívÜ li mértékben csök-
kentheti a rendszerben használt osztályok sLánlát, és mc 6 könnyíti új hangjegytípusok fel-
vétclét is a program11a.
Aik Imazh tós g
A Prototípus mintát akkc)[ J13.sználjuk, al1111(or d rendszernek függetlennek l<eJ] lennie a ter-
mékek létrehozásának, összeállításának és megjelenítésének módjátÓl, és
· amikor a példányosítandÓ osztályokat futásidőben adják meg, például dinamikus
betöltés útján, vagy
· ha el szeretnénk keJiilni a termékekcvd párhuzalllos oS7tályhicrarchiájú gyárak épí-
-" ,;
teset, vagy
· amikor egy osztály példányainak csak néhány különbö7ő állapotkombinációja jö-
het létre. Kénychnesebb lehet a megfelelő szá nú protoLÍpust beépíteni, majd
kl{)]10Zni, 111int egyenként péJdányosítaJ1i az osztál)Tokat, min ti eo. all{alc)mmal
a m.egfclelő állapottal.
Protot[pus 11 9
Serke et
p ;;;;; protoUp
. prototlp us
Ugyfél Protot(pus
-
""JIIIII'
Múvelet() o Kl6noz(}
I
I
I
I
I
I J\
h
us->KI6nDzO
Ko n krétPrototíp us KonkrétProtot[p s2
KJ6noz{) '( Kl6noz() o
I
t J
retum másolat sajá
magáró f
retum másolat saját
mag ár6[
Résztvevők
· Prototípus (Grafika)
- Felliletet ve7et be önJTI.aga klónozásálloz.
· KonkrétPrototípus (I(ottavonal, EgészIlang= félT ang)
- MegvaJósit egy műveletet önmaga klónozása ér(i.el-cé11en.
..
Ugyfér CGrafikusEszköz)
- LTj ol)jektum()t hoz ]étre, rnegkénre egy proto típu st, 11C)g)T klónozza ön1113.gát.
Együttműködés
· Az ügyfél megkéri az egyik prolc)típust, hOg)! h:lónoLza önmagát.
Következmények
A. Prototípus minta alkall11aLasa llaonló k()vet]<ezmén.yekkel Jár, mi11t az Elv()Ol gyáré vagy
,;
3.2 Epítőé: elrejti 3 k()nl<réllermél{osztályt az üg)lfél elől, csökkenlve e£7:el azon. ne\'ck szá-
mát, amelyeket az üg;lfél is nLr ELenkívül ezek a mintá]{ ]elletővé teszik azt hOh,!, az ügyrfél
111ÓUosÍtás nélkül11aszl1áJja az alkal1nazásra jel emző osztályokat.
A Prototípus minta további elé5nyei:
1 . Ter"lnékek hozzáadása és eltáL'olítása futásid6be1l. A prototípllSok le11etőséget ad-
nak arra, 11()GY új konkrét tern1ékosztályt építsünk be a rendsze -be, és ehhez nem
kell mást ten.ni_ csal( bcjegyeztetni egy prototípuspéld2.n)rt aL ügyféliel. p.z Ilélnileg
rugalmasabb, nlint a tÖL1bi létre 10zási minta megolclása, nl.vel az ügyfél [utásitlőben
építJleti lle és távolít11atja el a prototípu,s()kal.
..
120 3. fejezet · Létrehozási minták
2. új objektumok megadása az é1"tékek megváltoztatásával. A nagymértékbt-n dinami-
kus re ldszCfCk lelletővé teszik, hogy objcktum-összetételen keresztül például ér
tékeket adva az objektu.11 változóinak - határozzunk n1eg új viselredésmódorat,
nem új osztályokat meg11atározva. Ekl{or tulajci.cJD.képpen a meglevő osztálya { pél-
dányostásávat majd a 1éldányokat ügyfélobjektum-prototípusokként bejcgyezve
hat.ározunk meg új objektumtípusokat. Az ügyfél a prototípusra felelősséget átruház-
va állít lat elő új v.selkedésmé)dot.
Ez J tervezési mód le11etőséget ad arra, hogy a f<:111as7oálók programozás néll{ül hatá-
rozzanak meg új "osztályokat". Valójában a prototípuso ( I{Iónc)7ása hasonló az osztá-
lyok péJdányosításállOZ. A PrototípllS Tninta nagymértékllen csökkentlleti a fcnds7er
által igényelt osztályok számát. A kottaszerkesztős példában.1 GrafikusEszköz osztály
a 7enei objeklLJffiOk korlátlan változatosságát képes Iétrell(}7nl.
3. Új objel2tumok megadása a szerkezet megváltoztatásával. Sok al {almazás e emek-
hól és ckmrés7ekből építi fej az objektumokat. Az áramkörtervező programok pé -
dául rés7áralnl{örc)k11ől állítják ÖSS7e az áramkcJrö]<et 1 . Az ilyen all{almazáso =' {é-
nye]m' szemponto {miatt h'Yakran lehctővé teszik összetett, felhasználó által meg la-
tározott szerkezetek példányosítását, mondjulc azért, hogy egy rés7áramkörl tc)lJIJ-
SZCJf is fellcllessen használni.
A Prototípus olinta ezt a m.egoldást is támogatja. A részáramkört egyszerűeI1 csak
hozzáadjuk prototípusként a külÖnféle áramkÖri eJemek választékához. Ame 1nyi-
ben az Öss7etett áramköri ohjektumok a klónozás megvalósításakor mélymásolást
végeznek (aza.L az o11je]{tum min[len alszerkLzetét ta.rtallnazó másolatot kés71tenek),
a különféle felépítésű áramk.örök prototípusol{l{á válllatnak+
4. Kevesebb a/osztályra van szükség. A Gyártófüggvény minta gyakran a termékos7tály
hierarchiájával párhuzamos Létrehozó osztályhierarchiát hoz létre. A Prototípus min-
ta khet6séget ad a prototípusok kIÓnozására, ahelyett, 10gy egy gyártófügbJYényt
kérne meg arra, hogy új objektumot .10220n létre, emiatt a Létrehozó osztály Üerar-
chiára eáltalán nincs is szükség. Ez elsősorban a C++ nyelvhez hasonló nyelveknél
jelent előnyt, amelyek nem első osztályú objektumokként kezelik az oS7tályokat.
Azon nyelvek esetében, an1el)7c { viszont igen - ilyen például a Sma .ltalk és a7
Objectjve C -, kevesebb haszon S7ármazik ebből, mivel az oS7tályobjcklumok min-
dig .lasználllatók létrellüzóként. Az oSLtályobjektumok e el(ben a nye]vekben már
önmagul<ban lJfOl()típuso.l\:ként viselkednek.
5. Az alkalrrlazá..\ dinal1zikus heállítása osztályokkal. Egyes futás.dejű környezetcl( le-
hetővé teszjk az osztá yok dinamikus betöltését az akalmazásokba. A Prototípus
minta l{u csszerepet töltIlll be ezen képességel< kiakn1zásálJan a C++ é az a11hoz
]1asonló nyelvel{ben.
Azok a7 alkalmazások, atnelycl( ebry dinamikusan lJetöltött osztály példányait szeret-
nék létrehozni, nem képesek statikusan hivat{ozni annak konstnlktorára, ehelyett
a futásidejű környe7et hoz létre automati {usan egy példányt minden osztályból,
amikor az betöltődik, é bejegyzi a példányt egy prolotípus-kezelőben ( ásd a Meg-
Az ilyen alkdJmazások a7 Öss etét.el: illetve a Díszítő mintát l<övcti}{
rototfpus 21
valósítás részt) + Ezután az alkalmazás elkérheti a prototípus-kezelőté5l a7 újonnan be-
töltött osztályok példányait J olyan osztálya két, amelyeket eredetileg nem voltak
a programba sze kesztve Az ET++ al {alrnazás-kerc rendszer [WGM88J fUlásidejű
rendszere ezt a sémát llasználja.
A Prototípus minta legfőbb elelőssége, 110gy minden eb'Yes })rolotfpus alosztály rnegvaló-
sílsa a Klóno7 műveletet, dm. nem mindig egyszerű Nehéz például megírni a muveletet
olyankor, ha a l{é déses osztályol{ már léteznel{, dc megvalósítása akkor is ne 1éz lehet, 11a
oIya.n objel{lUm van bcnnül<:, alTILly nem támogatja a másolást, vagy kör :rörös hivatl{ozáso-
kat tartalmaznak.
M gv lósítas
A j)rototípus minta különösen a statikus nyelvekné] hasznos, am.lyen például a C++, ahol
az osztályok neIn ol)jektumok és fut3.sidoocn evés vagy semmilyen típusinfor lláció nem
áll rendelkezésre. Az olyan nyelvekné], mint a Smalltalk vagy az Objective C, amelyek
a prototípusokka] egyenérté]{ű objektumokat (azaz osztályobjektumokat) bi7losítanak az
osztályok példányainak létrellozásállOZ, kiselJl) a jelentősége. A mintát a prototílJusokra
épülő nyelvek - amilyen a Self fUS87] -t amelyekben minden objek umlétrellozás egy pro-
totípus klónozása útján valósul meg, beépítve tartalmazzák.
A prototípuso. 7' megvalósítása során tartsuk szem előtt a követke7őket:
1+ PrototípllS-kezel6 használata. Amikor egy rendsze 11en nincs rögzítve a prototípu-
so ( szá.nla (azaz dinami (uan ehet ()kellétreJl07n.Í és megselTI nisítcni)t a rcnuelke-
7ésre álló prototípusol{fól n.yilvánt3.rtást kell vezetni. Az ügyfelek maguk nem keze-
l+l{ a prototípusokat csak a nyilvántartóba mentik a7okat, és beolvassdl{ onnan.
Az iigyfél elkéri a nyilvántartóból a prototípust, mielott klónozná Ezt a n.yilvántartót
nevezzüJ prototípus-kezelőnek.
A prototípus-kezeléS egy társ"'tásos tároló (asszociat"'v tál), amely ebYf adotl kulcshoz
tartozó prototípust ad vissza. Vannak benne műveletek a prototípusok l{u csokllOZ
történő bLjcgyzésére [s a bejebrv7és törlésére. Az ügyfelel{ futásid6ben módosít11al-
ják a nyilvántartót illetve tallózllatnak is abban. Ez lehetővé teszi az ügyfelek szálná-
raj hogy kódírát, nélkül felveh7ék a rendszer eltárát.
2 A Klónoz míivelet 1negvalósítása. A Prototípus minta legne11ezebb rés7e a Klónoz
művelet l1elyes fficgvalósítása. Különösen trükkös o]yankor, amikor az objektum
szerke7etek körkö ÖS 11.vatkozásokat tartalmaznal(
A 1egtöbb nyelv támogatja va amennyire az objektumklóno7ást. A Sm.alltalk például
a copy művelet egy megva óstását bi7tos.tja elihez 1 amelyet aztán aL Object (Objek-
tum) osztály ill nden a osztálya örököl. A C++ eb'Y másoló konstruktort tartalmaz
Ezek a lel1etőségek a70nban nem oldjál{ meg a t,sel{ély másolat vagy mélymásolat"
122 3. fejezet · Létrehozási mjnták
prolJlél11át lC;R831 t lza/ 1'10gy az objektulll l{IónozásaJ{or ,ralóban másolat készül-e
a példányváltozókrÓl, vagy csak meg lesLnek osztva a klónozás után az eredeti pél-
d.ány vállozé)i
A "sekély" másolat kés7ítése egyszenÍ és gyakran elegendő is, ezt csinálja alapértel-
l11ezés szerint a S111allttlk. A c..++ ;11apértelmezett más()Jé) l(onstruktc)ra tagszcr(í má-
sol1-sl \'(gez, a.l11i azt jeJenti, llogya ml1tatók meg lesznel( oSLtva a JTI3.solal és az erc-
deti ]<özött. Az (jss7etett fclépílésű prototíl)US()]{ klónoLása során a.zonl1al1 általá.ban
mélYlnásolat készltésére van szükség! mivel a ldónnak és az eredeti példánynak egy-
mástÓl fÜggetlennek kell lennie. E7.ért biztosítani kell, hogy a klón elemei a prototí-
pus clemeinek klónjai legyenek. A klónozás rákényszerít minket, hogyeldÖntsük,
Init akarunk 111cgC)S7Q/a 113.sLnálni: rnár 113. egyálta1ál1. van ilyell.
Ta a rcnc.iszerlJen lé\'ő ()11je]<tuJTIol(11c)z tartozik Ment (Save) és Belc)lt (Load) lnűve-
let, lkJ(or 113.sLnállJatók azok a Klé)noz 3.lapérteln1.ezett megvaJélsításá.nak eJ()állítá.sá
ra, ehhez nem is kell mást Lenni! csak menteni az objektumot, majd a70nnal újra be-
tölteni. A Ment művelet egy memÓriatárba menti az objektumot! a Betölt pedig má-
solatot kézít 11előle, újra előá 11ítva lZ ()IJjeJ<tumot a tárl1óJ.
3. A klónok előkészítése. Mil{özbcn ehY) 7 es ügyfclek tf>kéletescn eJégedettck a klón.nal
úgy, 3.l10gy az van, lnások általuk válaszlc)lt kezdőértékeJ<1<el a.l(arják ellátni annal<
nél1ány vagy 3.Z összes llelső állapotát. Ezel<et az értéke.ket l klón()zási tnŰ\eleltel ál
ulában nem lehet átadni, mert a számuk prototípus-osztályonként változó. Egyes
prototípusoknak tÖbb előkészítő paraméterre is szükségük lehet, másoknak egyre
sincs. A Klónoz n1űvelet sorál1 ti5rtét1.ő pa.raméterátadás eleve kizárná egy egységes
1<J ónozó fellllet 113.sLnála tánal{ lellctőségét.
Az is megesIlet, I-l0gya llasznáJan.dó prototípllS-osztályok már előre meghatároznak
111 zon)'ot, m(íveletel{et az állapot l{ulcsértél<ei nek bc vagy ala l)llcl yzetl1e állítá.sál}()?
Ha ez a Jlelyzet, az ügyfelek e7eJ<et a lllűveletel<et a. klónc)lás 111.cgt()rténte llt.án
aZ()11n.a.l llasználJ1atjá.l{J eg)7éll esetben \riszont esetleg ne]<ün.l{ kell l)evezctni a7
Ini tia 1 ize (EI6készít) műveletet CJásd a PéldakÓd részt) amely az előkészítő para-
métereket kapja argumcntumként, és azok alapján bcállílja a klón belső állapotát. Vi-
g)Tázzunk, 110gy a klónozó InűveleleklJől ne készítsiinl( mélymásolatoklt - eze]<et
llhryanis esetleg törölni l(cll (lkár l{ifejeLetlen, akár a.z ini 1: ] ali z e művejetell. l)clül),
Inie őtt újrl ej ől(észítlletnén 1< őJ.cct.
Peld ,ód
A l(orál1ban már látott Ma zeFactorv osztály MazeP r otoLypeFactory ( ..alljrintusl)roto-
típusGyár) alos7tályát fogjuk létrehozni A MazePrototypeFacLory alosztályt az általa
létrehozandó objektum prototípusaival fogjuk clőkés7íteni, hogy ne kelljen aloszlályokat
készíte 1i belőle a létrelloz()ll Fa]ak és sz()IJák meg\7áltoztatásá110z.
A MazeProlotypelacLory J(icgészíti a MazeFactorv fellilctét egy l(onslruklorral
anlcl)l a prototípuokat ,reszi fel arglln1.en.tlllllként:
Prototí US 123
class MazePrototypePactory : public MazeFactory {
public:
MazePrototypeactory(Maze*, Wall*, Room*[ Door*);
.1
I
virtual Maze* MakeMaze() const;
vlrtual Room* MakeRoom(int) consti
virtual Wall* MakeWall() const;
virtual Door* MakeDoor(Room*, Room*) const;
private:
Maze* -prototypeMaze;
Room* -proto type Room;
Wall* -prototypeWalli
Door* -prototypeDoor;
} ;
A7 új 1<OI1struI{tor egyszerűe11 csak e]{51{észÍti saját IJfototfpllS3.i.t:
MazeProlotypeFactory: :MazeProtoLypeFactory (
MaLe* ID, Wall* W J Room* r, Door* d
) {
JjíoLolypeMaze - m.
- ,
'-'-proLoLypeWaJl - W;
-
J)rototypeRoom - r;
-
....J]rototypeDoor - d. i
-
}
A. fala.ka.t szobá]{3t és a.jtól(at létrellozó t3.gfligg\énycl( llasonlóal<: 111in<.legyik I{Ié)l107, f11ajd.
eI(5lcészíl egy 11fC)1()típuSl. AlátJlJ a MakeWall (Kés7ítFaJ) és a M'akeDoor (I<észítAjtó) [11ŰVe-
Jet J11egllatározása lát]1.ató:
Wall* MazePrototypeFactory: :MakeWall () const {
rcturn -prototypWall->Clone();
}
Door* MazcPrototypeFactory::Makcüoor (Room* ri, Room *r) const {
Uoor* door = _prototypeDoor->Clone();
door>lnitialize(rl, r2);
rcturn door;
}
A MazePrototypeFactory aloszt{llyt ]J[ototlpusos és alalJértellneLetl labirintlls lélrello
zásár3. l1asználllatjuk, mind.i)ssze annyi :1 leendé5nk, 11()gy a lallirintl1s 3.l31JÖSszetevőinclc
JJ ro lc) tí pl1 sa i vaj á II í tsu k Ile:
2 3. fe.ezet · Létrehozási minták
MazeGarne game;
Ma ePrototypeFdctory simpleMa7eFactory(
new Maze, nGW Wa] , new Room, new Door
) i
MaLe* maze - gameCreateMaze(sjmpleMazePactory);
I
.
A labirintus típusának me,gváltoztatásához .násféle prototípushalmazzal állít juk be a Maze-
PrototypeFactoryalos tályt. A kÖvetkeLő hívás egy olyan Jabirintust 1 oz létre, amely-
nek egyik sLobájában bomba robbant (RoornW i lhABornb), és ettől kisLakadt az ajtÓ is
(BombedDoor):
Ma7ePrototypelactory bombedMa?eFactory (
new Maze j new BombedWalJ ,
new RoomWitll.ABomb/ new D()or
) ;
A prolotípusként használhatÓ objektumnak - ez lehet például a Wall osztály egy példánya -
tánogatnia {ell a Clone műveletet, és rendelkezn'e kell egy másoló konstruktor-al, am'
Idóno7za. Emellett szü (sége van még egy külön műve etre, alnely újra előkés7.íti a belső á -
la Jotot. A7. Ini tialize művcletet a Door osztályhoz adjuk hozzá, hogy az ügyfél előké-
sLÍtllesse a klón()7ott szobákat.
Hasonlítsuk össze a Door osztály a]ábbi megl atároLását a fejezet elején találhatÓva :
class Door: public MapSite {
public:
Door() ;
Door(consL DOor&)i
v.rtual void Initial '7e(Room*, Room*);
v'rtual Door* Clone() constj
virtual void Enter();
Room* OtherSideFrom(Room*)i
private:
Room* _room1;
Room* _room2;
} ;
Door: :Door (const Door& othGr) {
rooml - other._rooml;
room2 = other.room;
}
P ototlpU5 12
void Door::lnitialize (Room* rl Room* r2) {
_rooml - rI-
_room2 = r2;
}
Door* Door: :Clone () const {
return new Door(*this);
}
A BombedWall a osztálynak felül ke 1 bí 'álnia a Clone műveletet, és meg kel valósí an"a
egy megfelelő másoló konstruktort:
class BombedWall : public Wall {
public:
BombedWall()i
BombedWall(const BombedWall&).
vlrtual Wall* Clone(} const;
boal I-IasBomb ( ) j
t
prlvate:
boal _bomb"
} ;
BombedWall...BombedWall (const BombedWall& other) : Wall(other) {
bomb = other.bomb;
}
Wall* BombedWall::Clone () const {
return new BornbedWall(*this);
}
Bár d BombedWall: :Clone művelet egy Wall* mutatót acI vissza., me!,valósítása egy
olyan JTIUtdtót, alne y egy új alosztálypéldányra (BombedWall *) mutat. A Clone műveletet
az a aposztályban határoz uk meg így, ezzel bi7tosítva, 10gya rototípust klónozó ügyfe-
leknek ne kelljen tudniuk saját konkrét alosztályaik ó . Az ügyfeleknek sohasem kell lefelé
irányuló átalakítást vége70iük a Clone műve et által visszaadot érté <en.
A Smalltalk nyelvben a Obj ect osztálybÓl örökö t szabványos copy metódust új a fel-
has7nálhatjuk bármely MapSite osztály klónozására A MazeFactory os tá y a szükséges
prototípusok előálIításá a has7nálható: a # room nevel megadva például étrehozhatunk
egy szobát. A MazeFactory alosztályhoz tartozik egy szÓtár is, amely a neveket a prototí-
pusokbo7 rendelt. A alosztály make: metódusa így né7 k;
make: partName
A (partCatalog at: partName) copy
6 3. fejezet · Létrehozási minták
Atnennyiben adattak a MazeFactory ) ototípusakkal való dőkészll(séhez s7ükségLs m.e-
tÓdusok, az alábbi kóJdal Jétrehozhatunk egy egys7erú labirintust:
CreateMaze
on: (MazeFactory new
wi th. Door new named: #door;
wi th: Wall new named: #wall;
wi th: Room new named: #room;
yoursel f)
A CreateMaze alosztály fenti kódban s erepló on: osztáJymetódusá lak meghatározása
a l{ö\TetJ<ezo el1et:
on: aFactory
I room] room2 I
rooml := (aFactory make: #room) J.ocation: 1@1.
room2 : = (aFa.ctory make. #roorn) location: 2@1.
door := (aFactory make: #door) from: roornl to: room2.
rooml
atSide: #north put: (aFactory make. #wall);
atSide: #east put: door;
atSide: ffsouth put: (aFactory make: #wall);
atSide: #west put: (aFactory make: #wall).
room2
atSide: #north put: (aFactory make: #wall);
atSide: #easL put: (aFactory make: #wall):
atSide: #soulh put: (aFactory make: #wall);
atSide: #wes1 put: door.
" Ma 7 e new
addRoom: room1;
addRoom: room2;
yourseJf
Isme f Ihas n I 'sok
A Prototípus minta felhaszn.:ílásának első példája talán Ivan Sutherland Sketc 1pad rends7e-
fC lSut63].lehetet", A7 első .s7é es körben ismert alkalmazás, amely a mintát egy objektum-
központú nyelvben has7nálta, a ThingLab volt, ameJybcn a felhasználók egy összetett ob-
jektumot állíthattak Össze, majd tavábbadhatták azt egy prototípusnak úgy, hogy egy olyan
kÖnyvtárban helye7ték eJ, amelyben újrafehasználható objektumok voltak t .láJhatók
marS ll. Goldberg 6s Robson 's c nlít' a mintaként has7ná ható prototípusokatIGR83], de
CopJ'en [Cop92] sokkal teljesebb leírás ad róluk, ismerlc.tve a C++ nyelvben a Prototípus
mintához kapcsolódó megoldások 1, és bemutat számos példát és válto atat.
rototípus 127
Az etgd11 egy l1iba}.cereső-fclülcti 3J.l{almazás, amely az Elt++-on alapul, és graJlklls (egérln(í-
veletckl{cl kezell1etó) fel11asználói felületet biztosít l(ülönféle programs()rIJól flJltatllató lliba-
keresőkl1öZ Minejegyik llilJal<cresőne]{ l11egvan a n1egfelelő DebuggerAda.ptor (IIi11a-
kcresőlllesztő) alos7t{11ya. A GdbAdaptor például a. GNU gd.h nyelvtanáI1()z illeszti az etgdb
program()l, míg a SUI1DbxA.d3.ptor a Sun dbx llil}akeresőjéllCZ. Az etgdb prograJnba nincs nle-
r'--'lcn bekódo]va a I)elluggerAdaptor oS2tály11alma.z. E}le]yett a prc)gram ebr környezeti vál-
t07(Jból ()lvass3 ki a 113.sz.nálan.dó iJleszlő nevél h:il(eresi egyr globális táblázatllé)1 az acJ.()tl ne
vú prototíp11st majcJ. klónoL:za. Az etgdb prograJn}10z (lj 11ibal{ereső programol\.. is 110zzáadl1a-
tók, cll11cz csak az adott 11il1akeresőllöz tartozó DebuggerAdaptc)r illes7t{St kell csatolnunl{.
A Mode Corn-!Joserllen találllaló cgyüttműködési köny\Ttár' (interacticJn tecllniquc library)
tárc)lj:1 iZ()n objcktllmol( prototípusait, all1elyek támogatják a különféle +.1teral{tí\T eljáráso-
l<at [Slla,90] A Mode Com!)()ser általlétrc110zott összes ilyTen eljárás Jlasználllal{} prototípus-
ként ]la a {-ent említett 1(ön.)T\ l tárl1an 11eI)re7zük el. A 1 rototípus minta lehetővé tes7i, h()gy
£i Mode C0111poser J<orJátlan SZ[lmú interal(tív eljárást llasz .1ál11asson.
A 1(oráh11an eJl11ílelt kottaszerkesztő a Unidraw rajzoJó kerelrencjszcren alapt,Lik [VL901.
Kapcsolódó mintak
A Prototípus és az Elvont gyár bizonyos fokig vetélytársai egyn1ásnak trrlint arról majd 3. e-
jezet végéI1 szó lesz, (ie együtt is llasznál11atól(. Az Elvont gyár tárol]lat egy cJI)Tan prcJtotí-
pusJlaJma7l, amclynl( clerneit aztán l<lónozzllk, és a7 így kézült tcrmél\..o1Jjektlllllo]{at ad-
juk ViSSZ3.+
Az Összetéte1 és a Dls7Ítő mintákat sokat 113.sználó progran10J( gyal<ran s7int£n nagy llasz-
náL \leSLik a }")rototílJllS 111.intának.
8 3. f jezet · Létrehozási minták
.
\
Objektum-létrehozási minta
Egyéb V k
Singleton
I
Egy osztá yból csak egy pé dányt engedélyezni, és ehhez globál's h07záférés' pontot meg-
adni.
Flt
Egyes osztá yok esetében fontos, hogy pontosan egy pél ány legyen belőlük. Bár egy rend-
szerben több nyomtató 's lehet, nyomtatási sorbó csa egyet szabad használni. Csak egy
fájlrendszer és csak egy ablakkezeló futhat. Egy dig'táHs szű őhöz egyetlen analóg-digitá is
áta akító tartozhat. Egy könyvel6rendszer egy cég kiszolgálására van beallítva.
Hogyan biz osíthatjuk, hogy egy os tályból cak egyetlen pé dány legyen, viszont azt
könnyen el lehessen érni? Egy globál's válozóval az ob'ektum elérhetővé tehető, de ez
nem jelent védelmet az ellen, hogy az objektumból több pé dány készüljön.
Jobb lnego dás, ha magit az osz "ályt tess7ü felelőssé annak nyilvántartásáért, hogy ké-
szült-e már pL dány belő e. Az osztály biztosítani tudja, hogy több példányt ne lehessen be-
lőle létrehozni (úgy, hogy e fogja az új objektum készí ésére vonatko7ó kérel eket), és ké
pes biztosítani azt is, hogy a példányt ellehLssen érni. Ez az Egyke minta.
lk I tos
Az Egyke mintát a rövetkező esetekben haszná juk:
Pontosan egy példányra van szükség valamely'k osztályból, és annak elér 1-etőnLk
ke lennie az ügyfelek számá.a a jól ismert e]érési ontokból
Ennek az egyel en példánynak alosztályokk..l bővíthetőnek kelJ Jennie, és az übryfe-
leknek képeseknek kelllenniü { saját kódjuk mó osítása nélkü használni a ővítelt
pé]dányL.
gyke 1 9
Szerkezet
Egyke
static Pél dány(} O.... ..... ....
Egyke Ml1velet()
SzerezEgykeAdat( )
static egyed iPéldány
agykeAdat
...........................................
retum egyediPé1dány
Résztvevők
· Egyke
- Meg latároz eb'Y olyan Pé dány (Instance) műveletet, alneJy le11etővé teszi, 110gy
az ügyfelek l10zzáférjenel{ az osztály egyedi példányához. A Példány osztályrnű-
\lelet (azaz osztálymetódus a SInalItaIk nyelvben, illetve statikus tagfugbrvény
a C++-ban)
Felelős lehet saját egyedi példányának létre110zásá.ért
yüttmúködés
· Az ügyfelek az Egy]{e példányt k.zárólag az Egyl{e Példány művel etén át éril{ el.
Követ ezmények
Az Egyl{e mintának SZál110S előnye van:
1. Szabályozott hozzáféré az egyetlen példányl1oz. Mivel a7 Egy]{e osztály magálJa
zárja saját egyetlen pélclánY31, szigorúan szabályozhatja, hogy az ügyfelek mikor és
ll()gyan férllessenek 1102Zá
2. Csökkefltett névtér. Az Egyke minta jobb a globális változóknál, Inert elke iil11ető ve-
le a névtérnek az et,7etlen példányt tároló g obális váltc)zókkal szennyeése.
3. Megengedi a nzuveletek és a m.egjelenítés/lnonlítását. Az Igyke osztálybó] létre]1oz-
llatók alos-ltályol{t és az alkalmazások futásidőben egyszeruen beállítllatók a szüksé-
ges Ll(Jvítelt osztály egy péJdányával.
4 Megerlgedi változó szánlú példá1l r V h.asztlálatát A n1'nta megkönnyíti, 110gy l1a meg-
g()nLt()ljuk magunkat, a7 Egyke oS7tályból egyn.éllöblJ példány 1as7nálatát js enge-
délyezzük+ Emellett ugyanezt a megköze ítést l1asználllatjuk az all{alnlazás által11asz-
nált példányok számának szabályozására iS J ellhe7 csak a7l a műveletet kell megvál-
toztatnuI11{ amely az Egy (e pé dányhoz való 10zzáférést engedélyezi
30 3 fejezet · Létrehozási mintak
...
5. Rugalmasabb} mtnt az osztályművefetek. Az egykék szolgáltatásait oSLtálynlűvde-
tekkel is mLgvalósíthatjuk, azaz a C++ nyelvben staLikus t3f,függvényeket, a Small-
talkban oS7tálynletÓdusokat használva, de mindkét megoldás megnehezíti a kialakí-
tás oly tnódon történő megvá to tatását, hOhry az lTIcgenged'e e osztály több pél-
dányának haszná atát 's. Ezenkívül a C++ nyelvben a statikus tagfüggvények soha-
se II virllJálisdk, így az alos7tályok nem tudják azoka a többalakúság segÍlségével fe-
lüllJÍr; Ini.
\/1 gvalósít s
AL b:ry]{e minta l11egvalósításánáJ az aldbbja]{at l{el] szelll előtt tartanunk:
1. Egyedi példány biztosítása. Az Egyke minta az egyetlen példányt normál osztálypél-
dánnyá alakítja, de e7t az oSLtályt úgy ken megírni, l0gy mindig csak egy példányt
lehessen belőle létre l0zni. Erre gyakran használt módsze, hogya példányt létreho-
zó m(ívektet elrejtik egy olyan osztályművelet (azaz statikus tagfüggvény vaby osz-
tálymetódus) mögé, a ll" garantálja, hogy csak egy példányt lehet létrehoLni egy osz-
tá yból. Ez a ffi_űvekt hozzáférhet ahhoz. a változóhoz, anldy az egyedi példányt tá-
rolja, és gondos {odik arró J hogy a változó értékének visszaadása előtt a7 egyedi
példányt kapja kezdőértékként. E7 a megkÖzelítés biztosítja azt, hogy az egykét már
első has7nálatba vétele előtt Jétrehoz7a és clőkés7íti a prog am.
Az oSLtályrnűvelet a C++ nyelvbLn a Singlelon osztály Instance statikus fügf,vé-
nyéveJ határozható meg. A Singleton osztály meghatáro7 a az _instance statikus
tagváltozót is, amely aL osztály egyetlen IJ[ldányát címző lllutat )t ta talmazza
A Singleton osztályt a 1{övetke7őképpen vezetjük Ile:
class Sing1eton {
public:
static Singleton* Instance();
prot ee ted:
Slngleton() ;
prjvate:
static Singleton* instance;
} ;
Az ennek Inegfe elő lnebvalósítás:
Singleton* Singleton::_instance = o;
Slngleton* S.ngleton: : Instance () {
if (_instance == O) {
_instance = new Singletonj
}
return _instance;
}
Az ügyfelek 22 et,rykéket kizá ólag az Instance lagfüggvényen át érhetik d.
Az _instance VáItOLÓ ke7dőérléke O, az Instance statikus tagfüggvény pedig en-
nél a7 értéknél az egyedi példányra állítja, és visszaadja az értékét. Az Instance tag-
gyke 131
függvény lustl előkésLítést llGlSLnál, aL álta.la vissza3.dott értéket a progran1 nern 1107-
za létre és nelll tárolja aCldi.g, arníg elős7c)r 11c)z7á nen1 férnek a IJéldány110z.
FigyeJjük meg, llogy a konstruktor védett. Ha egy ügyfél közvetlenül pról1áJ péJ-
dányt készíteni a Sing] et on ()sztál yl)ól, ford.ításkor 11iba iizLnctct kap. Ez biztosítja.
a/l, 110gy mindig csal( egy példán)7t lellesse 1 létrellozni.
Ezel1kívi.l], mIvel az _ins t ane e egy eg)rke objektulnra 11ivatkozó lTIUt2.tÓ az
Ins L ance tagfüggv'él1Y egy Egy]<e a]os7tályt Cl]11Zé5 nl1ltaté)t rendelllet e változóllOZ,
amint azt a }Jéld.ak()d részben is lálllatjuk.
\Tan még valami, amít ércjenles megjcgyezni a C++ nyelven történő lTIcgvalósítá.ssaJ
kapcs()latlJa.n. Ncn1 elég az cg)lkét glol)ális vagy statikus ol]Je]{tumként n1egJlatárc)z-
nj, nlajd az alltomatil<us el(5kés7ÍtéstJcn bíznir Ennek llárom oka \ra.n:
eGi) Nem garantá.111ató, 110gy a statikllS olJje]<tumn.a.k Dl.ioclig csa]( egy pél<.lánya lesz
bevezetve.
Cb) Lellct, hogyastatikus elő]{észítés iclején. n.em. ]esz elég infoff11áci()nJ< minden
egy1<e pé]d.ányc)sításáhc)7. Az eb:ryke kérllet olyan értékeket, amely'eket a prog-
ram a végrel1a.jtás egy l(és61Jbi szakaszá11an szán1ít ki.
Cc) A C++ nem llatározza meg, 110gy a globá.lis olJjel(tumo ( konstruktor2.it mjl)len
sorrendben l<ell megllí\rnj a fo rd.ílás 1 egységekt)en lES90J. Ez azt jelenti 110gy az
ehry.rkék kcjzt nem lehet scmn1ilycn függőségi \'iszony. Ha rnégis val1, a 11baüze-
netek elkerül11etetlenel<.
Em' tc)válJ11i (jéJllellet kicsi) fclelősség a glob31issta.tikus olJjel<.turllos lneg]ZÖ7elítés-
bell., J10gy 1<én.yszerűen lélre keII11()J:ni al' egykél(et, lla szül(ség van rájuk, lIa nincs.
StatiktlS tagfüggvényt ha.szná.lva l11inden il)Ten gond elkerüllIelő.
A SrnalJtaJk o)Telv11eJl a7 egyed.i pé](1án)7t visszaaci-ó függvénYT a Singl<.:ton oSLtály osz
tá.lymctóclusa. Annal{ biztosítására, ]10gy csak egyetlen pé]d.ány készülj()n a new mű-
veletet 11íráljlll< fe]ül. Az íg)' kapolt egykeosztálynal( a kövctl{cző l{ét osztálytnetódu-
sa lellet, allol a Sol cTn.stance (FgyetlenPéldány) egy' olyan osztályváltoZÓt a111clyct
sel1.o1 Jllásll()l nen1 Ilas7nálllnk:
new
scJ f error: Inem llozható létre új obj ekLum I
default
SoleInstance isN.] if True. lSoJelnstance := super new].
A Solelnstance
2. AI()szfál}Jok készítése az hvke OSZlálj/17oz. A fő gond nem is igazán a.z alosztályok
megllatározása, sol{l{a.l inl{álJI) az egye eli péld.án_y c)ly m(Jd.()o. lc)rténé5 telepítése,
ll()t-,ry az üg)Tfelek képesek lcgycnel{ azt 113.szná.lni. Lérlyegében. a.z egyr]{epélclányra
llivatkozó vá]to z ()nak az alOS7lál)1 egy pélti-ányál kell acini ke.ld6értékként. A legcgy-
szerűbl) In()ttszer, l1a megllatározzuk, melyik cgyl{ét szeretnénk 113.szná.lnr az Igyl<e
osztály Példány (T IlS t anl e) műveletével. A IJéldaké)cJ. részben egy IJélda SZC1111élt.cti,
ll()gy ezt a móuSLertllogyan lchet l(örn)lezeti változók segítségével n1.egvalósítani.
Az Egyke osztály alcJs7lályának kiválasztására egy másik n1()dszcr, ha az Instance
művelet meg\'alósítását kivesszü]{ a s7üJőos7tályl1{)1 (például a MazeFactory osz
13 3 t f j ezet · Létre hozási minták
tálybóI), és egy alosztályba helyezzük. Ek or a C++ p ogramozó ÖS7eszer .esztés-
{or dönthet" el (például egy másfajta megvalósítást ta'1:almazó objektumfájlhoz Cba-
tolva), hogy melyi 7 egykeosztályt akarja has nálni, de továbbra 's rejtve tartja az egy
ké az azt használó ügyfelek elől.
E a megközelítés a összes erkesztésre idő ítj az egykeosztály kiválasztásá) ami
meg ne 1ezíti azt, 110gy az egykeoszlá.yt flltásidőben választl1assuk k.. }-13. feltéte es
utasításokat 1asználun { az aloztály meghatározására, az rugalmasabb, de ]nereven
bekódolja a váIdsztható Ehryke osztályokat. Egy'k megoldás sem elég ruga mas ah-
hoz, hogy m'nden esetben 'delégítő eredményt adjon.
Sokka ruga masabb móds er ezeknél az gykenyilvántartó has7ná a a. Ahelyett, hogy
egy Instance műveletle hatálo7nánk meg a választható Egyke osztályokat, azok
név szerint bejegye7tethetik egykepéldányuka egy 'smert nyilván tartóba ,
A nyilvántartó elvégzi a név-karakterláncok és az egykék egy lás 102 rendelését. Ami-
kor az Instance műveletnek egy egykére van szüksége, a nyilvántartó} oz fordul, és
név szerint kéri a kívánt egykét. A nyilvántartó megke esi d. n egfelelőt (ha az létezil{),
és visszaadja az Instance műve etnek. Ezt a megközelítést has nálva az Instance
műveletne 7 nem kel ismern · e az összes választható eh'Ykeosztályt vagy példányt, az
egyetlen követelmény, hogy legyen egy o yan közös felü e - az öss es Egyke
(Sing eton) osztályhoz, amely tartalmazza a nyilvántattóva kapcsolatos lűvckteket:
class Singleton {
public:
static void Register(const char* name J Slnglelon*)i
static Singleton* Instance();
protected:
static Singleton* Lookup(const char* name);
private:
static Singleton* _instance;
static List<NameSingletonPair>* _registrYi
,
l
} ;
A Register (Ny' vántar ó) a megadott néven art ja nyilván a Singleton példányt.
Hogya nyilvántartó egyszerű m.aradjon, tároltatnun \:. ke 1 vele egy Names:i ngle-
tonpair (NévEo-ykePár) objektum .istát) amelyben minden NameSingletonPair
elem egy nevet endel egy egykéhez. A Lookup (Ke -csé) művelet a nevük alapján
keresi meg az egy {é re -, Tételezzük fe , hogy a keresett egyke nevét egy környezeti
változó adja meg
Singleton* Singleton::Instance () {
if (_instance == O) {
const char* singletonName = getenv(USINGLETONTI)j
//ezt a felhasználó vagy a környezet adja meg indításkor
_instance = Lookup(singletonName)i
l/Ha nincs ilyen egyke, a Lookup művelet Q-t ad vissza
}
return _instance-
}
Egyke 133
Ilol jegyeztetik be rnagul\..at a S+ngleton osztályol(? Pé dáu] a l<onstruktorukban (m nl
egyik le letőség). A MySingleton alosztály például a l(övctkezőt tellcti:
MySlngleton::MySinglcton() {
/ / ...
Singleton : : Register ( "MySi ngl eton It I thj s) ;
}
Természetesen a konstru]<tC)r1 nem lel1et megl1ívni, csak ha vallki előbb példányosít-
ja az oS.l.tályt - al11i ugyanazt a probléI1át tül{rözi, mi 1t amit az Egyke minta megpró-
lJáJ megold.aI1H A C++ nyelvben a }Jfobléma úgy l(erü 1 ető l11eg, ha egy statikus pél-
dányt llatározunl< l11eg a MySingleton alosztáJyból. A MySingleton mehrvalósításá
tartalma7ó fájlban fficgllatá ro z11at juk például ezt:
static MySi ngJ elr)D theSingleton;
A Singlet()n osztály ezek után már nem felelős az egyke létre 10zá.sáért, 1elyette el-
sődleges fele _ossége aZ J 11()gy a tetszé szerinti egykeobjektumot elér11etóvé tegye
a rendszerben * Ennek a statikus objel(tulll0S negközelítésnel( lnég mindig van egy
lelletséges l1átulütője - neve elesen a7, 10gy a" öss es lel1etségcs Egyke alosztály
példányait létre kell lozni, (ülönl1en nem lesznek bejegyezve a nyilvántart()11a.
P ld kód
'lételezzük fel, hogy egy MazeFactory osztályt határo7unk meg abirintusok létre11ozásá-
1102, amint azt a fejezet elején láulattuk. A MazeFactory osztá]y egy felületet hatá 07 meg,
amclynek segítségéve} a labirintus különféle elemei 110zl1atók létre. Az alosztályok felülír-
ják a műveleteket, 11(Jgy LgyLdi célú lermél{osztá V-példányokat adjana { vissza, a nlilyen.ek.
pélcJálll a BombedWa II objektumok az ebryszer(í Wall objL {tumok helyén.
Ami itt fontos, a7 a7 J hogy 3 Maze alkalmazásnak a labirintusgyárakból csak egy példányra
van sziiksége J és ]-lOgy ennek a példánynak 1102Záfé ]1etőnek kell ]ennJe a lal1irintus bárme-
lyik részét felé!JÍté5 ké)cic)k számára. Ez az a pont, allal az Egyl<e minta szerepet kap
Ha a Mazeractory osztályt egyke ként ]10lJi:uk létre a lall-irintus()l)jektum mindenllonnan
elér]1.ető 1es7 g]o11ális vált()z()k tlasználata nélkül is
Az egyszerűség ked.véért tételezLük fel, hogy soha nem kel alosztályt l{észítenün]{
a Mazeiactory oS7tályból (kisvártatva a tnásik lehetc)séhet is meg fogjuk vizsgálni)6 tkkor
ct Mazeraclory osztályt Egyl{e osztálJyá változtat juk, a C++ nyelvben egy stat 6 kus
Insta.nce műveletet és a7 ehryetlen példányllároló statikus instance tagot adva llozzá
A konstru (tort védLnünl{ is l(el , 110gy megakadályozzuk a vélet]en példány()sítást, aminek
követke7léllen esetleg több példány jöllctne létre.
class MaeFactory (
publ · c:
static Ma/eFactory* Instance();
34 3. fejezet · Létrehozási minták
//ide jön ci már meglévő felülel
prot ee ted:
MazeFacLory();
private:
static Ma7e:Factory* _irlstancei
} ;
A megfejelő mcg\7alósítás a követke7ő:
MazeFactory* MazeFactory::_instance = O;
MazeFactory* Ma7eFactory::Jnstance () {
if (_instance == O) {
instance = new MaeFactory;
}
rcturn jDstancei
}
Most vegyük a7t az esetet, amikor alosLtályokat is készítÜnk a MazeFactory osztályból, és
aL alkalm_azásnak kell eldöntcnie, hogy melyiket használja. Alabir" 1tUS típusát egy környe-
zeti váltoLó segítségévcl választ juk ki, 6s a kódot kiegés7ÍtjÜk egy olyan kódrésszel, arncl y
a n1cgfelelő MazeFactory alosztályokat példányosítja a környezeti változÓ értéke alapján.
Az Instance n1űvelct kiváló hely ennek a kódnak a h07záadására, mivelrnár önmagában
is példán)losítja a Ma.£eFactory osztályt:
MazeFactory* MazeFactory::lnsLancü () {
if (i.rlstance == O) {
const char* ma zeStyle = getenv ( II MA7ES rYLE n ) ;
if (strcmp(mazeStyJe, ubombed r1 ) === O) {
instal1ce = new BC)TI1bedMazeFactory;
} else lf (strcnp(ma'7eStyle, n enc hanted 1l )
insLarlcc = l1.eW RnchantedMacFactory j
O) {
//..további lehetsegcs alosztályok
} else {
irlstance -
-
}
}
return _instance;
}
II alapértelmeés
new Ma ze.Factory ;
Figyeljük meg, hogy az Ins Lance m.líveletel minden esetben módosítani kell, amikor új al-
osztályt határoZLInk meg a MazeFactory osztályhoz. EL cblJen az alkalmlzásba.n t;;lIán
nC:lTI gc)nd, de a keretre11dszcrrcl meg]1atározott eJvol1t gyárak eseté}Jcn az lejlet.
Egyke 135
A7 egyik le letséges lnegoldás lcllct a Mebrvalósítás rés7ben ismertetett nyilvántartó Jlaszná-
lata. Hasznos lellLt a clinalnikus kötés is allli lnegakadályozza, hogy az aI]{allll.azás a nem
l1asznált alosztályokat .s betöltse.
Ism rt Ihas n lasok
A Smalltalk 80-ban [IJ ar 90] 11 sz lált Egyl{e mintára egy péld.a a Chan.geSet current nev(í
kód.módosftás-11allnaz. Egy l{ifinomultabb péld.a az osztályol{ és metaosztályaik l<özött. kap-
csolat. A lTIctaosztály az osztályok osztálya, és lnindegyíh: metaos7tályna]{ egy lJéldánya van.
A metaosztályol-cna.k nincs neVÜk CJivétel: kÖ7\Tet\'e az egyetlen példányukon keresztü.l), de
nyilvánt3.1tják aL egyetlen I)[lcJ,ányul(at, és 10 mái esetben nem ho£nal< létre más' (a.t
Az InterViews feI11asLnál()i fel.ületj elemkészlet [LCI+92] töblJek kÖ7l Session és WidgetKit
()'shtályaj egyedi példányainal( elérésére használ egyl<él{et. A Session (Munkan1enet) a7 al-
1(31maLas fő cselllényelosztó ciklusát határozza meg, t:.rolja a fe 11as7náJó sr'Jusbeállításait
lar1alma7é) ad.atházist, és l<ezel. a.2 egy vagy öbb fizil{. l{ije zővel vala kapcs()]atokat.
A WidgetKit egy Elvont gyár, anlcl)T a fel11aszJláloi felület vizuális kialakításában szereplő
clcmLketllalároZ7a meg. A Wj_d.getKj t: : Ins tance () műve et azt az adott WidgetlCit al-
osztályt l1atározza tn.eg) alnelyet egy, a Session osztá y által meghatáro olt környezeti válto-
zó alapján péld.ányosíl a rend.szer. A Session osztályon végrellajlolt Jl_3S0nlÓ muvelet meg-
l1atározza., 10gy a rendszer a monokróm \ragy a színes {ijclzől{ct lámogatja-e, és ennel(
rneg elelő<:n beállítja a Set,si()n egykepéldán-yt.
'" p SO ód' mint
Az I:gyl(e m.ntával számos minta megvaJ ÓSít]1.3 tó, lJéldául a/ E vont. gyá az Építő és
a !)rototÍpus.
136 3. fejezet · Létrehozási minták
.&
.
I
.
.
I
.
I t. r
I
A rend.szernek az általa létrehozotl oS7tá]yol( (al történő paral11étcrczéére általában két
módszert használna c Az egyik az alosztályok készítése az objekturTIot létrehozó osztályok-
bál J ennek megfelclője aGyártófüggvény mintalasználata. Ennek a módszernek a legfőbb
11átulütője, 110gy esetenként új alosztályt ke Ilétre110zni csak azért, llobry megváltoztasuk
a termékc)sztálytt és ezek a módosítások halm(Jzódhatnak. Ha például magát a ternlél(létre
llOzé)t .s gyártófügl,rvénnyellloztuk létre, akko felül kelj lJírálnunl< a készítő osztályt is.
A rene szer paralnéterezésének másik módja sokkal irlkább az objektum-összetételen alap-
szk: megllatáro7unk egy objektumot) amely felelős a7ért, 110gy ismerje a termél(objektu-
mokat, és ezt az objektumot h.asználjuk rcnds7erparamétcrkénl. Ez a ]{ulcsa. az Elv()nt gyár,
az Ép'tő és a Prototípus n1intáknak. Mindhárom mintánállétrehozunk egy új "gyárobjeklu-
mot', amelynel{ felelősséhe a termékobjektumok létre110zása. A7 EJvont gyár mintában
a JNárobjektum tÖbb osztály objektumait állítja elő. Az É ító rnintában a gyárobjektum fo-
l{ozatosan összetett tcrméket készít, egy meg elelően összetett protokollt használva. A Pro-
totípus olintában a btyárobjel{tum a prototípusobjektumotlemásolva llozLa létre a ternlékL
ket Ebben az esetben a gyárc)bjektum és a prototípus ugyanaz az o11jektul11. t mivel ci P -oto-
típu fejel a termék visszaadásáélt.
Vegyük m.ost 3.I)rototípus mintánál említell rajzszerl{csztő keretrendszert. A GrafikusEszl{öz
oS7tályt a termékos7táIy töblJfélcképlJen is paralnétcrezheti:
· A Gyártófi.iggvény mintával a GrafikusEszköz osztályegy alosztálya jc)n. létre a palct-
tán lévő minden Grafik.a alosztályhoz. A GratlkusEszköz ()sztálynak lesz egy ÍJj-
Grafil{a (NewG rapl1.ic) művelete t ame yet minden GrafikusEszköz alcJsztá.y felülíl.
· AL Elvc)nt gyár mintával a Gra lkaGyár (Graphics[actory) osztályol{ osztályllierarchj-
ája jön létre, minden Grafil{a alos7tály110z egYr EblJen az esetben mindegyi ( gyár
csak egy tern1.éket állít elő: a KörGyár (CircleFactory) köröket, a VonalGyár (Line-
Factory) vonalakat sth. A GrafikusEszköz osztályok paralllétere az adott Grafika al
osztálytfpust előá lító gyár lesz
· A }Jrototípus m>ntál}an a C;rafika osztály minden alosLtálya a Klónoz (Clone) művele-
tet valósítja meg, és a GrafikusEszköz osztályok az á]taluk létrehoz()tt Grafil(a osztály
prol()típusát l{apják paraoléterként.
A7, hogy melyik mintát a legcélszerűbb alkalmazni, szárnos tényezőtőJ függ. A rajLszer-
kesztő keretrendszerben a Gyártófüggvény minta használata lűnik elsőre a leg cÖnnyebb-
nek. Egyszerű a GrafjkusEszköz osztályhoz új alosztályl meg]1-atározni, és a GrafikusEszköL
példányait csak akkor h07za létre a program, amikor a paletta már elkészült. A fó hátrány itt
az, llogya GrafikusEs7köz alosztályok e]lJl rjánzanak, és egyik sem végez túl so 7 munkát.
3. fejezet · Létrehozási minták 137
Az lvont gyár scm sokkal jobb, mert el1he7 egy ugyallolyan nagy Gra 1 (aGyár osztályl1ie
rarchia szükséges. A_7 Elvont gyár a Gyártófüggvény11ez képest csa.k akltor jelent e űnyt lIa
3 GrafikaGyár 11icrarchia már létcLil( - vab'JT a7érl, n1ert a fordtóprogram autol11atikusa 1
lJiztc)sítja (mint a Smalltalk és a7 011jective C nyelvlJen)t vagy azé t, Inert a rendszer c::gy. má-
sil{ részé])ez szükség van rá
Mindent ÖSS7evetve a raJs7er]<es7tő keretrendszerh.cz v.a.lószínűlcg 3 lJrotolípllS minta a leg-
megfclelőb11, mert ezt 11asználva csak a Klónoz I11líveletet kell ]11egva óS1tani Dlindeo.
Grap11ics osztályon. Ezzel csökken az ()szlályok száma, és a KJónoz n1űvelct 3. puszta pél-
dányosításon kíVÜl l11ás celol<ra is llaslnálllató (például egy Más()latkészftés nevCl Jnenü-
pont műveleteként) .
A G'yártófübgvény mintát llasználva teslresza11haté)hlla]{ lesznek a p..ogr3.mol{t és csal{ alig
valamjvelllonyolulta1111ak. A tö111Ji tervezési minta új osztályokt igényel, míg a Gyárt()függ-
vény csak egy új lnűvclctct+ A Gyárlófüggvény mintát gyakran has7náljáJ( obje]{tumol{ létre-
}()zásának sz()kásos meg()ldásaként, de ha a példányosított osztály sol1a nem változik meg,
vagy }1a a péJdá11yosítás olyan műveleten belül történil<, amelyet az alosztályok J<önnyen fe-
lülbírálllatnak (amilyen péld.ául az előkészítés1 művelet), akkor n'ncs rá. szül(ség.
Az Elvont gyár, a Prototípus és aL Építő mintát 11as7oáló prograrno]( még rugalrna.sabbal(t
mint aGyártófüggvényt ]las7nálók, de bonyolult3}Jbal is A Lervezés gyak an a GyártófLigg-
'Tény lnintát llasználva indul el, és onnan fejlődik tovább a több. létreJ10zási rninta 113.5znála-
tának irányába, ahoh'Ya pr()gramterve7ő ráJön, hogy nagyobb rugallnasságra van szükség
I-Ia több te vezési l11intát iSlnerünl<-, több ILlletőségünk les?, hogy válasszu lk l(özülük
/
.
.
.
.
I
I
I
a
A s7erkezeti lll'ntál( k()zzéI1C)]ltjállall az aJ1, 110gy lZ ()sztál)To]<lJól és ol)jel{ll11110](1)ólllug)1tn
alkatIlatlInk nagyc)l)l) s7erkezetel(ct A sLefl{ezeti ()sztCJI)}111ilJ.tál:J ()fc)l<léssel fclCLlctekel ",lah7
megvalósításo!{3t él)ítnek fel, eh7s7erű léldakénl g(')ncloIJtJll]( csal\: arrl, 11()g)Tan Jellcl
tC1}Jbszörös öröl<:lésse J{ét vag)' töG}) oszldlyt ebrylle ,)(evcrni", amel)! aztán sZli.l(5()SZlá]y]i-
nak tulajd.onságait egyesíti. A lni11ta kil1önösen 113-sznos lellet, 11a. önállóin fejlesztett osz-
tályl{ön)/vtáfÍ;lk eg)Tiittmű]<ödésését szerelnénJ( 11iztosít3.11i. Egy IllásiJ( pé]c]a az IllesztéS Jllin-
ta l)SZlá]yf()rmlja: az il1esztő lltalábdn élrra s701gál, 110gy eg"}' felületet (8..z illcsztenciő felülc-
tét) egy lná.sikllOL igazflS()n, s így l(ülönböző felü]eteJ< eg)lségcs el\l()11t ál1rázolá.sát nyújlsl.
Az ()szlályillesztől( ezt egy illesztendé5 ()sztályból \faló pri\7át (}rökléssc] éri]{ el; az illeszt(j
ei:után feli.iletét 3.Z illeZleJl(i{5 ]1)TO]11ln l1atáruzza llleg.
A szerJ<ezeti objekl1Jlnn1irlták felüJetel( vagy megvÍ;ll{)Sllásol< összetétele 1'1e[yett 3.Zt írjál( Ic
llog}/an rlglsztllalun]< össze objektuITI()kal, ]lOgy új szolgállltáso]{at n.ytljtsunk. Az o11jek-
tum-c)ssi:etétel nlg(]ltna.sságát az ()ss7etétel flltásillejű me h 1\ T áJtoztatllalósága lJi7tc)s1tj3., ltni
a st3tikus osztál)l()SSZeléteJJe1 J1eln érllető el
Az Összetétel szerkezeti objektu mminta , alnelynek segítségéve! osztályhierarchiát építhe-
tlink fel kétféle ol)je]{tllffioszlál ylj() 1 : ala ]J\'ető (prillli tÍ\l) és összetett ()lJjel<lllJll()lz]Jól.
A7 alap- és összetett ()l)je[{lllnl01{]Jól tetszőlegesen l1011yolult szcr}(czeteJ( építl1etőJ. A 1- e-
]yettcs mintál)in a ]1e1yettes egy lnásil( ()lJjeklum ,,11eJ)rŐrLőjc" \llgjr Jlelyettes-'-őj<: P-.... llel)7et-
tes sZ{lmos 111óoon. 113.sználllal{): le11et egy tivoli (jnltér ()11jeJ{tll111ánal{ llelyi I<éI1"\riseJőjc, je
]öl]1et egy igény szerint lJetöltend,5 na.bY olJjeJ{lUmot, ele arra is llas7nálll.ltó 110g)! megal{l-
dálY()ZZLlk eb'Y érzéken.y olJjcl(tllm elérését, A l1C]ycttcseklceJ elér11ető llugy az ()l)jeJ{tll r1lo1(
egyTes tLIl(lj<-lonsága.illoz csaJ{ kÖZ\'ctctlen férllessiir1k lll)zzá; scgítségül<J(el e tuliju.onság()k
1<orlálozl1a té)k, lJŐVJt11ctők vagy .I11{)d{)sítllató]{.
40 4. fejezet Szerkezeti minták
A Pehelysúlyú minta objektumok mcsosztására biL.tosít szerkezetct. Objektumokat leg-
alább két okból oSLthatunk meg: a hatékonyság növelése vagy a következetesség biztosítá
sa céljából. A Pehelysúlyú minta a jobb tárkihasznáMst célo7za rneg. A s7ámos objektumot
használó alkaLnazásoknak különösen Ügyelniük kell; a7 objektumok lemásolása helyett
azok megosztása jelentősen csökkentheti a kÖlLségeket. Minda70náltal az objektulllok csak
akkor oSLthatÓk meg, ha állapotuk nem fÜgg a környe7ettőlj a Pehelysúlyú objekturnok
nem is táro1nak környezetfÜggő állapotot, a feladatuk elvégzéséhe7 igényelt kiegész''tő in-
formációkat akkor kapják meg, an1ikor szÜkségük van rájuk. KörnyczctfÜggő állapot híján
így a Pcllclysúlyii objcl(tun10k szabauon 111egosztl13tók.
Amíg a Pehelysúlyú minta azt mutatja meg, hogyan készfthetünk sok-sok apró objektumot,
a Homlokzat minta arra ad rnegoldást, hogyan ábrá70lhatunk esT}' teljes alrcnds7ert egyet-
len objektummaJ. A homlokzat objektumok halmazát képviseJi, feladatait pedig úgy hajtja
végre, 11()GY üzcnelel<et továbbít e7en objektumc)knak. A Híd minta az elvont átJrázülá.st és
a 111eg\'alósftást választj-l el egYInástól, így lZOJ{ egYlnáslól rrlggetlenül mé)doslthltóh..
A DíS7ítő minta azt írj3. ICt llogyan adlla.tunk objektllffiokllOZ d.inanlikusan feleIé5sségi kör()-
ket. A OíS71t(5 olyan szerke7eti rninta, amely önhívással (rekurzióval) áHít össze objektumo-
kat, így té,\IC lellet{Své korlátlan számú úJ szolgáltatás fel\rérelél. Egy fell13sználói felületi ele-
met tartalma7ó 1íszítő oL)jektlIJll. például s7egéll)rel vagy árnyél{olá.ssal= esetleg olyan 570J-
gáltatás()kkal, mint a görgclllelé5ség 'la.gy a nagyítllatóság cgés7ithetj ki az elemet. Kétféle
díszítés hozzáadásáhoL cf:,'Ys7erűen csak be kell ágyaLnunk egy Díszítő objektumot egy
másil(t)l; tc)vábbi egymáslJa ág)lazá.ssaJ pedig még l()lll) díszítést alkaJm.azllatunk. Min.deI1-
Ile7 3-2 sZiikéges, ]10gya DíS7ftő objcktumc)]{ illeszkedjeneJ( a 1102Zájuk tarto7ó elem felli-
letéhez, és üzeneteket küldjenek annak. A Díszítő f:eLldatát (például egy szegély r.lj7olását
az elem l(öré) a7 lizenet toválll1ítása előtt és után is elvégcz11eli.
A szerkezeti minták közül számos kapcsolódik egyrnáshoL; ezeket a kapcsolatokat a fejezet
végét1 tárgyaJjlll{.
IlIesltö 141
II
S7erke7eti objel,.tun1nl.in ta/osztályrninta
Cel
Az aelott osztály felliletét az ligyfelel{ által igényelt felületté ala.l(íta.n.. E m()(lszerrei az
egyé11ként öss7efér]letet]en fe](iletű osztályol( cgyrilttmííködését biztosítJlatjllJ<.
gye n vak
Aclapter, Burkc)lé) (Wrapper)
Felad t
Nélla előf ardul, llog)l egy újrallasznosílásra lel\le7ett elelTIl(észlet mégsem 113sznáJ 11a té) feJ,
mert felü Jele nem felel meg a7 adott alkaIJTI.azá.s ta tOlnányfüggő felületéneJ<.
Vebyünk pélcJ,ául el=:,7 raj7s7er]<es7tőt, aJJ1elYl1ek segítségével a felllaSználc)k grafI]<us elerne-
l{et (vonalal(at t soJszögel(et, szöveget stb.) rajzoIllatnak és rend.ez}letJlel{ képekbe, illet\'e
(ijagramc)kl1a. A rajzprc}gram klllcsfoga]Jll.a a rajzo11jckturn, amelynek szerl<eszt]lető ala]{ja
van, és l<épes l<irajzolni önll1agát A rajzobjekturnok Í"clülLtét az Alakzat (Slla11e) elvont usz-
tály llatároLLa meg; a prograll1 ebből 5zárn1a7tat a]osztályol(at az egyes rajzol)jel<lUJn-ll1JU-
()k s7ámára, így lesz J1éldául l VonalAlakzat (LineSl13.pC) a vonaJal< ()sztáJya, l So](szög-
Ala.kzat (PolygonSlla.pe) a sol(sLögLl(é, ét, így t()vá11lJ.
Az alapvető nértani alal{z3tol{ osztályai - 3111ilycn a VonalAlal(7at és a SokszögAlakzat is - \!i-
zc)nylag kc)nnyen mehY\ral()sítl13tók, melt rajzo ás. és szell(csLtési lclletőségeik J{orlát()7()tta.k.
Egv S7Ö\Teg tnegjeJen.Jtésére és szel1(esztésére l(épcs SzövegAlak7at (TextSllape) nevű alosz-
tály n1cgvalósítása aLonban már lényegesen ne11ezebb, .ne t rnég aL Gllapvct(5 sz()vegszer-
l<esztésj művelete1< is lJon.yolult képert1Yő riss""tés- és átmenetitár-l<ezelés igé 1yelnel(+ Egy
bolt1)3.n m.egvás3.rol.l13tó :Cllla.sználó+ felületi elelllkés71etllen persze va.lószíl1líleg találunk egy
megfelel(5en lJ()nyT()lull, elé5re e]]<és7ftett TextView (Szövcg:!\Jézet) ()sztályl a nellyel szöveget
jelen.ítlletü.nk meg és szcrl{cszt11cLilnk Ideális esetlJen ennek újra11asznos-'tás3.va.l fficgvalósíl-
113tná.nk a SzövcgAla.kzat osztályt - csak110gv a TextView-t nel1. 3 n> i\lal(zat osztályainkJl07
terveztéJ<, e7ért a TextView és Alal(zat olJjel(tumul( egymássa.l nem cserélhető}, fel.
Hc}gyan 113sználl1alé) fel tehát egy olyan "idegen' osztály, lninl a lexlView, egy oJ)ral1 a]k2.1-
rna.z3.sba.n t a.meI)' ffi3.S, eltérő felületű osztály()kat vár? FserJeg nlódosít.llatnánk az ()sztályt,
llogy megfeleljen a7 Alakzat felü etne]{, de az elernl{észlct forráskódjána}< Ilíján erré51le ){ell
tenniink+ De rnég lla rcndclkcLnénk is a forrással, al<l{or sefll Jen.ne sol{ értelme 3. lext\fiew
múdosításának, lliszen az elemkészletet 11em arra szánták, 110gy pllsLtán egy l(i.ott aJI<alrna-
zás működ.ését 11iztosítand.ó aJkalrnazkodjon a.z 3.dott tartományra jellerl1ző feIületllcz.
1 2 4. fejezet · Szerkezeti minták
Ehelyett a S7övegAlak7.at osztályt kell Úgy meghatároLnunk, hogya' extView feiületét dZ
.A13.l(ZitélloZ illessze. Ezt l(étféleképpcn érl-letjtil< c:l: (1) az Alal(Zíll felü letél1eI< és a TextView
megvalósításának öröklésévcl, vagy (2) egy 'lextView példány összeállftásával e,gy Szöveg-
Alakzaton belÜl, és a SzövegAlakzatnak a rextVícw felület alapján történő mevalósításá-
val. A két megközelítés megfelel az Illesztő minta osztály- és objektumváltozatának. Az ll-
1eszt(j szereI1ét ct SZ()\TegAlal(Zal tölti lJc.
RajzSzerkesztó -- - Alakzat .... TextView
- - -
Befag/aloDoboz{} GetExtent()
Létrehoz1v1ódosftó(}
/\
..
szöveg
Vonar SzövegArakzat
Be oglal6DobozO Befogl ar óDoboz() o : = = = - - - { retum szö > G
LétrehozMódosft6() LétrehozM ódosft6() 0-
.
I
en ;I!
I
I retum new SzövegModosftó
A fenti diagram az objektumiJlcsztéS esetét mutatja. LátJutó, hogy aL Alakzat osztályban ue-
ve7etett BefoglalóDobo7 (BoundíngBox.) kére]mekct a TextView-ban meghatározott GLt-
EXlent (SzerezKiterjedés) kéreltnekké alakítjuk. Mive] a SzÖvegAlakLal a TextVíew-t az
Alakzat felÜlethez illes7ti., a rajzolÓprogram felhasználhatja az egyébként nem Összeegye7-
tetllctCS felliJ etCi lext\Tic\\r osztá l)rt.
Az illcszt{5 gyakran olyan sLolgáltatásokérl felelős; amelyeket aL illes7.tett osztály nem bi7.to-
síl. A diagramon láthatÓ, hogyan képes erre. A felhasználónak például képesnek kell lennie
21Ta, hogy 27 egeret hú7va új helyre hclyez7e az Alakzat objektumokat, dc a TextVíew nem
nyÚjl ilyen képességet. A S7.övegAlakzat úgy pótolhatja eLt a hiányosságot, hogy meg\'aló-
síqa aL Alakzat LétrehozMódosÍtÓ (CreatcManipulatur) m-(íveletét, ami a megfelelő Módosí-
tó (Ml]lij)ula.tor) ll()sztály ebry példányát adja \'iSSZél
A Módosító aLon objektumok elvont osltálya, amelyek tudják, hogyan m07.gassanak egy
Ala]{7.at objektumot a felhasználó levékenységével összhangban, példáu] új helyre búzza-
nak egy alal<7atot. A kü lönböz6 alakzatokho7 kÜlön-kÜlön MódosítÓ alosztályok tartozn2k,
aSzÖvegMódosító CTextManipulator) például a SzÖvegAlakzatnak tllcgfeleJő :JIosztály. [gy
SzÖvegMóJosÍtó példány visszaadásával a S7ÖvegAlakzat biztosíthatja a TextView-bÓl hi-
311Y'Z(), tie az Alal(7lt által jgén.)'elt sz()lgáltatást.
IlIesztó 143
Alkalm zhatóság
Az lllesztő mint-l a kö'vctl(cLŐ <:sctel<.lJcn 311(111113.Ll13tÓ:
· Egy. 111CgllVŐ (Jsztá.lyt szeretnénk llasz11á.l11i, ele 3.nl1ll{ felí.ilele l1el11 a kfv-{lnságlinl{-
nlk I11egfe1e]ő.
Oly ln Cl jraJllSZnc)sítlla tó osztályt szeretnéJ11( l(észJteni al11ely"F 1<éJles egYllllJllŰl«()cJ II i
\1ele lClP(s()Illl)an nem álJó, \!agy Cl()fC ne1TI i111Lrl osztál)lol{l{a.l v(]gjTis oly"a.n osztá-
1)To1{}<a.1, a 111el)Te]{ felll1ete nem feltétleilii] illesz]{eciil{.
· (Csak az ohJoeklttnlll1csztók e",)etéherl) S7árnos l11ár Jétez(S :::11 oS7tá 1)Tt ]<e] 1 11lsznlIJll1 11]{,
ele feliiJetük alosztil)7-s7á rml71a tássa I l()rléJl(5 i lles7:tése nelll Ilrt](tiJ(Us. l\.z ()lJjc ](t II J11-
illesztő sz(ilőoszt3.ly"ánal( fclülcté.- .1{épes 1118.S fe 1i.ilete l<Jlez i lles7t.en i.
Serke e
AL oszt.ál)Iillcsztő t(jl)l)s.iirös öriil(léssel il]eszt egy felíJletct egy Jl1áslkl107:
..
Ugyfél .... Cél Illesztendo
"JIIIII"""""
Kérefem() AdottKére emO
/\ /\
(m egvaló sftá s)
Illesztó
Kérelem () 0- ,-.--------
AdottKé rel em{)
Az o lJj ckl LIlllill <.:sztő O bj <:!\..turll-összetét<:lre éI) ü l:
.. Illesztendo
Ugyfel - Cél .....
- Ill""""
Kérelem() AdottKére emU
/\
i] esztendő
IUesztő
KerelemO 0- - ----------- i lesztendó- > AdattK!
érelem()
144 4. fejezet · Szerkezeti mintak
észtvevók
· Cél (Alal{zat)
- Meghalározz< az Ügyfél állal használt tartományra Jellcm7Ö felületet.
..
· Ugyfél (RajzSzerkesztő)
FgyCittln(íködik a Cé] felülclnek Jnegfelel(j objektllffiokkal.
· IlIesztendö (TextView)
- Meghatáro7 egy már létező felületet, amelyet illeszteni kell.
Ille szlő (S z()ve gAlakza t)
- Az IJlesztcnd(5 felületét a Cé] felületlle7 illeszti.
Együttm "ködés
Az Ü!:,ryfelek egy Tllesztő példányra hívnak meg műveleteket, az illesztő pedig az Il
Ies7tend6 m(íveleteit 11Ívja meg a kérellllck leljesítésélle7.
Követke mények
A7 osztály- és objcktum.illeszt6k előnyei és hátrányai különbÖ7nek. A7 osztályillesztőkre
a l{ővetl<ező ( jellemzők:
· A7 Illesztendőt egy konkrét llles7tendő osztályhoz ragaszkodv;] illesztik a Célhoz.
Ennek kÖvetkezményeképpen az osztályilles.ltők nem működőképesek, amennyi-
ben egy osztályt is annak mjndcn alosztályát szeretnénk illeszteni.
Lehetővé teszik, hogy az Illes7tő felülbírálja az Illesztendő néhány viselkedését, hi-
szen 17 Illesztő az Illesztendő alosztálya.
· Csak egy objektumot kell bevezetni, és az illesztcnd6höz való eJjutásho7 nincs s7ük-
ség tuvá11bi lnulatc)kra.
Az objektumillesztőkkel kapcsolatban a kÖvetke7őket kell megjegyeznünk:
· Fgyetkn IlIesztő több illesLtendővel is működhet, vagy's magával az IIlesztcnd6vel,
és annaJ{ nind.en alosztályával (113 vannal{ ilyenel(). AL Illesztő emellett minden ll
lesztendőL egyszerre bé5vít11ct szoJgálta.tás()kJ<al+
· Az Illesztendő viselkedését nehezebb felülbírálni. Ehhez aJosztályok szárma7tatása
szÜkséges az Illesztendő oS7tályból, az Illesztőnek pedig az alos7tályokra kell hivat-
koznia, nelTI pedig közvetlenül az Illcsztend.őrc
Az Illesztő minta alkalmazásával kapcsolatban az alább" kérdésekkel kel még foglalkoznunk:
1. lilIi '1n.indent illeszt az Jllesztő? Az iUesztők eltérő mennyiségű munkát végezhetnek
az Illesztendőnek ;] Cél felülethez valÓ illesztéséhez, A le letségcs műveletek skáája
aL en7sze 11 felü]etátalakítástól (például a műveletek nevének megválto7.tatásával)
I Ile szto 145
a teljesen különböző múvelethalmazo]{ támogatásáig terjedllet. Az Illesztó átal e -
végzendő munka mennyisége .ltól függ, mennyire hason ít aCél és az lllesztendő
fe.ülete.
2 Csatlakoztatllató illeszt6k. Egy osztály jobba.n újrallasznosít11al(J, Ila a lehetolcgkeve-
se11bre csökkLntjük azon feltételezésel-c s7ámát, amelyek {el má.s osztályo]{na]{ élniük
l{ell, ha az oS7lályt llaszn[.ln+ l{vánják. Azzal, 110gy a elü etillesztést egy osztályba h.e-
lyezzük, megszabadulu 11{ a feltétele éstő, hogy a többi osztály ugyanazt a felületet
látja. Más szavakkal, a felület' esztés lehet6vé tes?!, hogy osztályun {at olyan meg]evő
rendszerelebe épí sül{ be, alnelyel( más felületet várllatnak az oszlálytól. A 1Jcépített
felületiI eS7téssel rendelkező osztályok leírására a7 ObjectWorks\Smalltalk Par90]
a csatlakozhatható iHes zt ő (pluggable adapter) l{ifeJezést J1as7nálja.
Vegyünk egy FaNézet (TreeDls l}ay) graf+kus vezC lőt, amely faszer (ezetek g afiklls
megjelenítésére 1{épes. l-la ezt a vezérlőt l{ifejezetten egy ad.ott alkalmazásban va ó
.l1asználatra szántá (, az általa megjelenített objektuma {tóI egy bizonyos fe ülelel kö-
vetelhet megj mondjuk m+ndegyikneJ( a Fa (Tree) nevű elvont osztályból kell szár-
ma nia. Ha a FaNézetet újrahasznosíthalóbbá szeretnén{ ten.nj (mondjul< egy llasz
nos vezér őke. tartalmazó ele lkészletlJe s7erelnénk épí -eni), ez a l{övetelrnény
ésszerűtlen Az egyes alkallnazások a aszerl(ezetekre saját oS7tályokat JlatároLnak
meg, íbty nelTI szabad, hogy arra lcényszerítsük őket, 110gy a mi Fa elvont oS7tályun-
{at J1.asznáJják, hiszen a különböző faszerkezete], fellllele is l{ülönböLo.
Egy könyv á.r11iera.rch.iában a gyermekeket d SzcrcLAl (önyvtá -ak CGetSubdirec-
tories) mŰvelellel érhetjük el, l11.1g egy öröklési 11ierarclliában a megfelelő művelet
neve SzcrezA1osztáJyok (GetSubclasses) Jellel. Egy ujra11asznosítllató FaNézet vezér-
Jé5nek mindkét t"lJUSÚ 11. erarchiát D1eg ke]] tud.nia jeleníteni, akkor is, la azok felüle-
te {ülönbözl( Tel1át a FaNéZLlnek beépített felületil.esztést kell tarlalmaznia.
A Mebrvalósítis észben a felületilleS7tés oszlályokba építésére több 1egold.ást is
megvizsgálu nk.
3. Kétirá1Yú illeszt6k 11asználata az átlát"7:óság biztosítására+ Az íllesztőkkell{a )CSü-
]atban a7 egyik lehctséhCS gond, 10gy nenl mind.en ügyfél számára ,,:.tlátszók'. Az il-
lesztett objel{tumok többé nem felelnek rneg az Illesztendő felületnel{, így nem Jlasz-
nálhatók 1árhal, ahol az Il esztendő objektllmok ihen A szükséges átlátszóságot
a kétirányú illesltök biztos-'tllatják. Különösen a or 1asz losak, ha két ügyiélncl( l(ü-
lc)nbözőképpen kell átnia egy obje]{turnol.
Vegyün { egy l<étirányú illesztőt, a.mely összekapcsolja a Unjdraw grafiktlS szerkesztó
keretrendszert fVL90] , illetve a QOCA megszorítá_sfelol ó elemkés7 etet [III-lMV92].
Mind.két rendszer rendelkezik o yan osztályaI-ekal, amelyek kifejezetten ábrázollal{
'"
változól{at: a Un+draw-ban · yen a StateVariable (AllapotVáltozó), a QOCA-l)an pedig
a ConstraintVa.ria.1]le (KötésVálto7ó)_ AI1110z J hogyaUnidraw egYÜttnlűköd lEssen
a QOCA-val, a Cont aintVariablet a StateVariable felü]etéhe7 kel illes tcni, a 1hoz
pedig, 110gya QOCA nyújtllasson mebold.ásokat a UI1idraw-nak, a StateVarial11e l{ell,
110gy igazodjon a. Constra.intVariablc felületé]1.ez.
46 4. fejezet · Szerkezeti minták
(a Q CA osztályhierarchiához)
I
I
I
(a Unidraw oszt Iyhierarchiához)
I
I
r
Const aintV riable
State Variable
Constrain StateVari ble
A megoldás kulcsa a ConslraintStateVariable kétirányÚ oS7tályilles7tő, amely lnind
a St3teVariable, mind a ConstraintVariabJe alos7tálya, feladata pedig a két felület egy-
mához íllesnése. A többszÖrös öröklés ebben aL esetben megfcle16 megok ás, mert
az illesztett osztályok felmete jelentősen különbözik. A kétirányú oszt3lyilJesztő
l11indkét osztáJynak Tl1egfclel, igy mincl a kél ren dSL er ben lTIűl<ödil(_
M valósI ás
Bár az IIlesztő minta m.egvalósítás2 általában elég egyértelmú, néhány dologra fih7elnünk kell:
1. Az osztályille'Ztők megvalósítása a C++-ban. A7 osztályiUeszt6k C++ nye vű megva-
lósításában a7 IllesztéS nyilvánosan örököl a Céltól, és )fivát módon az Ilks7tendőt6I ,
íh'Y 3. Célnal{ altípusa, d.e az Illcszlendőnel< nem.
2 CsaLlakoztatható illesztők, Tekintsünk át lárom lnóds7ert a korábban bemutatott t hi-
erarchikus szerke7eteket automalikus n D1egjcleníteni képes faNézct CTreeDisplay)
vezérl(5 csatlal<oztat11até) illLszlőinek megvalósJtás3.ra.
AL első lépés, ami közös az itt bemutatott mindhárOln megvalósításban, a7 Illeszten-
dő "keskeny" felületének megtalálása, vagyis az 'lIesztéshe7 szükséges legkisebb
művejethalmaz megbatáro7ása. Egy csak néhány művdetből állÓ keskeny felület
könnyebben illeszthető, mint egy műveletek tucatjaiL tartalma7ó. A faNéLet eseté-
ben a7 illes7:tendő bár 11'lyen hierarchikus SZetke7et lehet. Az elképLdbető legki-
sebb felület két m(iveletet tatt.llmaz: aL egyik meglr táro7za, hogyan jeJeníthetü lk
meg grafikuan egy csomópontot a hier;]r<..hiában, a másik pedig megkeresi a C(}-
mÓIJont gyern1Lkeit.
A keskeny felülette a megvalósításnak három megközelítése Jehet:
Ca) Plvont műveletek használata. A FaNézet osztdlyban megfelelő eJvont műveleteket
határozunk meg a keskeny lllesztcndé5 felület számáid. Az alosztályo {nak meg kelj
va]ósítaniuk ezeket az elvont 111ű\Telcteket, és illeszteniük l{cll a Jlierarc]likllS szer-
kezetű objektulllOL. Egy KönyvtárFaNézet CDircclolyTrccDisplay) neY(í alosztály
például a könyvtárszerkezet elérésével valÓsíthatja meg a műveleteket.
III es ztó 47
FaNézet (Ugyfél, Cél)
SzerezGyennekek(Csom6pont)
LétrehozGrafikusCsom6pont(Csom6pont}
Meg-elenft()
ÉpftFa(Csomópont n) 0-- - - - - - - -
SzerezGyerrneke k( n
tor each gyermek {
HcmadGrafíkusCsomópont(LétrehozGrafikusCsomópont(gyennek)}
ÉprtF a( gyerme k)
}
Könyvtár aNézet (Ulesztö)
Sze ezGverrnekek(Csom6pont)
LétrehozGrafikusCsom6pont(Csom6pont)
·
FájIR
nds
rE
;d (IIesztendői ]
A 1«()n)T"\ltár:r
a.N'ézct (Directc)ryTreeLJis})lay) arra
s
1J{osftja"
l lceskeI1Y felületet,
110 gy FáJIRenciszerEgjre(i. (r ilcSytemEntity) objcktUl11.ok1Jól álló 1(Öl1yvtárszer]<e-
zClcket jclenítsen l11eg.
Cb) KéfJ1Jisel() of?jektIll110k 11asználala. Ennél a m.egközelítésn.él a f
lNézet a 11ier.élr-
Cllil(llS szerkezet elérésére irányuléJ J(érelmel<el eg)' képviselő (cjclcgatl:) obje]{
tumnal< l()vál)oílja. A képviselő cscréjé\rel a faNé7et 1<ülc)nféle iJlesztési m()cl.sze-
fekct II
lszn3.l113.t.
'11együk fel például, ll()gy va.ll egy KönyvtárTallé)7ó (I)irectc)ryBr()wser) nc'vű clc-
mll111{
3.mely a F
lNé7etet 1.1
lsználja. A KÖI1YP\ltár r
11lóLó 1<.iv"á.lö3.n rnegfelell(épvj-
SelŐJlek, J1a a f
tNézctnck 3. lliera.rcllikus könyv"1árS7erke7:etllez v
llé) illes7lésérűl
van S7Ó
A dinanlil<us lípusokra épi.ilő nycl\leklJen., :a.milyen a Sma]lta1]{ \'agy a7
OlJjective C, ez 3. IIlcgl(özelítés csak eh7, a 1<épvisel(5l az illesztő szárrlára bcjcgy-
ZŐ felilJetel igén"y"el. ELután 3. Fa.Nézet egyszeruen tC}\IálJl11t]latJa a kére Ime le et
a kép\lisclőnel(. A NEXTSTf]) rAd.d94J gyakran él ezzel
l illLgoltlással 3.Z a.lC)SL-
tályoJ{ sZ
lm[lnak csökkentése céljából.
A C++-I10Z 113.sonlóan. stati]<us l1J1US()kkal UCJIgozó nyclvcl{ l(ifcjezett felület-tl1eg-
]latárc)zást l{()vetelnek 111Cg a l(él)viselő SZá111.á.r3.. EgJl ilyeJl felületet úgy ]-l
ltár()z-
11atunJ< 111.eg, ll()!,'Y
l FaNé7el igényelle keskeny' felületet egy elv r o11t F
lFléré)-
Kép\risel(j (1-"reeAccLssorDclcgate) osztál")l11a l1elye7zül<. Ezt a felü Jelet eZllt{ln
ör()kJésse1 a kí\t
á]ll képv
iselőbc (esetünkben a l{ön
á +Ta.llózól)a) ,
](eVerJlet-
jlil('
. At11c11n)d.ben a Köo)rvtár 'aIJé)7éJnal< Jlincs szülőoszlálya, cg)ISZeres öröl\.-
lést, 11a van, tc)lJt)sz()[ÖS örül<.lést llasználllnl{. Az osztáljTo]< ily Jllé)d'()]l lc)rténő
üsszcl(cvcrésc kön.n)lel111, I11int egy új Fa
Lzel :tl()SZlály bevezetést: és n1űvpelete
inel< egyenkénli .nl<.:gvalósítása.
148 4. fejezet Szerkezeti minták
-.
FaE/ér6K pvise/6 (Cél)
.. k
pvise r ei SzsrezGyermokek( aNézet Csom6pont)
FaNézet (Ugyfél) ....
-- LétrshozG afikusCsom6pont(FaN6zet Csom pont)
Be árrrtKépvise ő( Képvisel ő) A
Megjalenft(J J
9 --
p(tFa(CsDm6pont n) Könyvt rT ali O (HI eszt o)
-
I -
I
SzerezGyermakak(FaNézet, Csomópont)
t Lé
ehQzGrafikusCsom6pont(FaNézet Csom6pont)
J LétrehozFá j I{)
r
Tömi Fáj[ ()
";.
képvisel
>S1BrezGyenneke (this
n
for oach gyermek {
HozzáadGrafikus Csom6pont(
képvise f6->LétrehozGrafikus Csom 6pottt(this.. gyennek)
)
í:prtF a( gyennek)
} """'-- - Fájl RendszerEgyed ( Ile sztendő)
- -
(c) aral'néteres illesztők. A csatl.1koztatható illes7tők támogatásának általános mód
ja a Smalltal rban, hogy az illes7tőt egy vagy több blokkal paramÜe ezzük.
A blokkszerkezet alosztá yok létrehozása nélkü támogatja az i eszt(st. Az egyes
bok Tok kéreimeket illeszlletnek, az illesztő pedig minden kerelemhez egy-c bY
blokkot táro hat.
éldánkban ez azt jelent', hOhT}' a FaNéze - egy bIo T {ot táro]
a csomópontok (Node) GrafikusCsomóponttá (GraphicNode) alakításához, egy
másikat })edig a csa .11Ópont gyermekeinek elérCséhez
Egy könyvtárszerkezLl fanézetének CTreeDisplay) elkészítéséhez példát 1 a {ö-
vetkező }{ód{)t írl at juk:
directoryDisplay :=
(Tr ee Display on: tr ee Root)
get Children Black:
( : node J node get Su bd. ir ee tor ie sJ
creat eGr ap hic Node BIo ck:
[:node r node createGraphicNode]_
Ha egy osztályba felületi 'es tést építünk be, ezzel a mehközelítéssel kényelme-
sen helyeltesíthetjük aL alosztályol{ létrehozását.
él kod
Az alábbiakban rövid v
zlatát nyújtju a Felada részben bemuta ott osztály- é
objektumi1 csz-
tÖk l1egvalós
tásának. Kezdjük a Shape (Alakzat) és TextView (S7övegNézet) oS7tályokkal:
class Shape {
public:
Shape() ;
virtual void BoundingBox(
IlIesztő 149
Point& bottomLeft l Pojnl& topRight
) const;
vlrtual Manipuldtor* CreateManipuJator() constj
} i
class TextView {
public:
TextView() ;
void GetOrigin(Coord& x, Coord& y) const;
void GetRxtent(Coord& wldLh , Coord& height) const;
virtual boal JsRmpty() constj
} ;
A Shape egy olyan be[()glalé) dobozt Cbounding box) feltételez, amelyet ellentétes sarka"
lIatároznak meg. A TextView-t ezzel S7em11en a }{e7dé5pont (origin)t a szélesség (width) és
a magasság Cheig11l) írja le. A Shape ezenkívül megJ1.3.tároz egy CreateManipulator
(LétrcllozMódosító) nevű lnűveletet is a Manipulator (Mé)dosílÓ) ()tJjektumc)k létre110zá-
sára J alnelyek tlld.ják, tlo b ryan l(clI mozgatni az ala.l{zatol{a.t a fell13.sználó tevé]{enységén.e]{
l11egfele.lően. 1 A TextView nem ren(1eJkezik 113sonló művLlettcl A TextShape (Szöveg-
A]akzat) ()sLtály ezen különböző felületek lllesztője.
Az OSLlályillcsztől( töl)bszörös öröklésse] il1es£tik a felületek et. Műkö(i.ésük kulcsát az jelen-
ti, 110gy kij]ön öröklési ágon ör()klik a felületet, illetve a megvalósítást E l(ülönbségtétel
a C++-ban általában úgy jeleni]{ meg, hogya felületet nyilvánc)san, míg a megvalósítást pri-
vát mód()n ör()kc)ljük. A TextShape illesztőt ennek a ha.gyornáI1yna.k 11l.egfelelően ]latároz-
zuk l11eg.
class TGxtShape : pubJic Shape, private TextView {
public:
JrcxtShape ( ) ;
virtual void BoundingBox(
Point& bottomLeft, POlnt& lopRight
) const;
virtual boal IsEmpty() consti
virtual Manipulator* CreateManjpulator() consti
} ;
A BoundingBox művelet a 'l'extView felü etének átalakítását vég7i, ]1.0gy az megfeleljen
a Shape-ének
void TextShape: : BoundingBox (
PoJnL& bottomLeft, point& topRiqht
) const {
Coord botLom , left l width, height;
1 A Crea_ t eMan i pu 1 a to r a G)rártófüggvé.ny példája.
50 4. fejezet Szerkezetj minták
GetOrigi.n(botlom, left);
CetExtent{width, height);
bottomLeft Point (bottOffi l left);
topRight = Point {bottom + height, left + width);
}
Az IsEmpty (Üres) mÚvelet az iJlesztők megvalósításában h7akOli megoldást, a kérelmek
közvet]en t()vábbítdsát JTIutdtja be:
baal TextShape. : IsEmpty{) const {
return TextV"ew: :Ismpty();
}
Vége .etÜI meghatároz7lJk a CreateManipulaLor-t (amelyet a TextView nem támogat);
ezt teljes egészében nekünk kell meqtennünk. Tegyük fel, hogy 111ár megvalósítottunk egy
TextManipulator nevű oSLtályt, alni a TextShape obJektulllok kezelésére szolgál.
ManipuJa.tor* TextShapo: :CreateIanipulator () const {
return new 1extManipulator(this);
}
Az objektumilJcszt6 objektum-összetétellel illeszti egYJnásho7 a különböző felÜletű osztá-
lyokat. [nnél a megkÖzelítésnél a TextShape illesztő egy n1utatóval rendelkez'h.. a Text-
.
V l ew-ra.
class TextShape : public Shape {
public:
TextShape(TcxtView*);
virtual vod Bound'ngBox(
Poinl& bottomLeft, Point& topRlght
) const,
vlrtudl bool IsEmpty () const.;
virtual Manipulator* CreateManipuldtor{) const;
private:
TextView* _lexti
} ;
A TextShape-n.el{ d TextV lew példdnyra l(cIl ál]ít3.nia a Jl1lltdlót; ezt a ]<:o1struktorban
meg is teszi. .. nellett mmden esetbLn, amikor rnűvdeteit hívják, Text vi ew objektumár . is
meg kell h"vnia a műveleteket. A példában feltételcL "Ük, hogy az ügyféllétrehozza
3. TextView objektumot, és áladjl azt a TextShape l(onstrlll(lorának:
TetShape: : TextShape (TextView* t) {
text = t
}
11 I esztó 51
void JrextSha.pe:: BOllndingBox (
Point& bottomLeft, PoinL& topRight
) cor1st {
Coord bottom, lett, width[ height;
_tcxt->GetOriqin{bottom t leLl)i
_tcxt->CctExtent{width t height)j
bottomLeft = Point (bottom l left) i
topl-{igllt = Point (bottom 1- lleig'ht, lefL i. wLdLrl);
}
baal tJ1extShape:: IsEmpty () cons1. {
return _text->IsEmpty();
}
A Crea L eManipula lor f11e h rvaléJsítása tleJl1 l<ülilo1Jözik az OS ztá.l'l változa l11á.l Iát()ttól, lli-
szelll11. !{észítettlll{ el a selnl11iből, a rI'extView szolg'álratásaib()1 semmit SeJll 11I.S7:11áJ.
MdI]ipuldtor* 'fcxtSll.ape:: CroateMarlipu.lator () cons L {
rcturn new rrcxtManipulator (tll.is) i
}
1 Iasc)n lítsuI,- össze ct l\.óllot az oszlályilleszt.é5ével, és 111eglá t ju 1<, a7 o11jel<tll rl1ilJesztf) lllegírá
sa l1isla II '/alaJlli\re] 1()111) m l111 kát igénve] , d.e J1Jgal J11lSal)lJ. A rlext Shape ubjel(lurrlilleszlű
\T.ltozlta példálll 8. rlext View a.1osztálY;lival is j()l 111(íkc)llik: l/: ügyfél eI-,7S7erŰen átadjl
a TexLShape k()nstnJ]<tc)ráJla1< l Illegfe1eléí al()sztá.1}l eg')T lJéldá.n)lát.
Ismert felhas ná ' so
A Fe13.cla.l részben látotl!Jél(ia az Etl++ })raV\T rlj7()lé)llrogran111ól szárrn.d.zik, aJTI.cly lL ET++-
rt éJJlillW(-; MRRI. A pr()grlJl1 a7 E1'++ osztáJyol< szövegszerl(csztésrc \/alé) újralI.Jszn()sításá
l:l.()Z egy TextSllal1c nev(i illcszté)()sztál)'lllasznál.
/\z Ttlter'lievlS 2.6 egyr n.tera.ct<)[ ne'lŰ elvont osztá.l)ll ta.rtal111az £lZ (}IY1n fell-las7ná]()i felüle-
ti ClCll1ckl1ez, Inint a gC)f(i.ít(5sá v()l<, a gc)nll}()]<, \llgy a rncDíj 1< fVl881. Em(llctt egy G ra pllic
r1e\r(í e 1\rOIlt ()sl:tál-yt is Inegl13.t[lro--__ 3.Z ()])la.n. strlLl<lllrált. grafiklls ()lJjC]<l II n1()l{11()Z, J11 i n l a vo-
1.1:a18.l( l,--örö.1{ sol(szögck és görbék. Mintl. iZ Intcrtct()r, milld. a C;r1p]lic rellcleJke7o.e1< gra.f.l-
l{us megjeletlésseJ (Je feli..i]etük és JJlegva 1ósításllk ]{ülön]Jöz(5 (nelll (Jszl()znal< k()z()s szül{)-
osztályo11), íg)T nem összeegy'eztctlleté51< Vig)lis egy stru ktl1 rá It grlfi kllS oI1je]{tllJl1 o.eJl1
ág)!azllaló 1JC J.c()zvetleniil 111()n(ijlll< eb")T 'lár11es7:éd.al)1a.kl11.+
EI1Cl }rel t az 111lerVie\\'s 2.6 egy G ra 11} 1 icI--3] ()ck ((; rafd(u sj lo.1{k) n.c\!(í ()bjclctllmillcsztőt 11itá-
roz llleg, 1Jl1el)r az J nteractor a.J.()sztál r3. és lgy G rapllic lJéldá nyt tarta) l11lZ A (; ra II II ic.1] oek
illeszti a GraJ111i( ()sztál")l feliiletét a 1 nteractorél1oz, és a Grapllic l)éldány'ok cnl1k scgítsé-
gé\'eJ jeleníl]1et(5k meg, gc)rgetlleté5]<. és n.a.gyítl13.tÓ}.C egy l11teractor szerkczeten l)clül.
152 4. fejezet · Szerkezeti minták
A csaLlako7tatható illesztők általánosak az ObjectWorks\SmallLaIk-han [Par901. A szabványos
SmalltaJk egy VdlueModd (ÉrtékModell) nevű osztályL határoz meg az egyetlen érLéket meg-
Jelenítő né7etel( szán1ára Az érték elérésére a Va]ueModcl a valu.e I vallle: elvont metó-
dusokból álló felületet biztosítja. Az alkalmazáskésLÍtők erre a célra olyan, az adott tarto-
m{lnyra jcllemzőlJb neveket l1asználhatnak, l11inl a width és a wid th:, d.e nem szabaLi.,
hogy ezeket úgy iHesszék a VaIueModel felülelhez) hogy a ValueModel-ből alosztályokat
szárrn azta tnak.
A2 ObjectWo "ks\SI11alltalk cllelyett a ValueModel Pluggll1IeA.da,ptor (Csatla (oztalllató-
Illesztő) alos7tályát aJkalm.azza. A PluggableAuaptor objektumok más objektumokat illeS7-
tenck a VaJueMod.el felületéllez (va 1 u e, va 1 ue : ), a kivánt értél(el( beáll ÍtásállOZ és lekér-
de7éséheL pedig blokkokka] paramétere7hetők; 3 PluggableAdaptor belsőleg ezekkel
a blokkokkal valósítja meg a value, value: felületet. AL alos7tály emeJlett azt is lehetővé
tes il hogya kényelmesebb nyelvi megfogalmazás érd.ekében közvetlenül adjuk át a szc-
lektorneve]{et (pl W ldth., widlh:). A szclcklOrol{ J11egfclelő l11o]{I{oh:ká átalal{ítása auto-
111 a likllsan történ i 1<
ValueModel
vaJue.
va/ue
/\
illesztendo PluggableAdaptor
Object ..........
........
value:
value O- - - - - - - ....
getBlock
setBiock
- - - A etBloc value: iflesztendó
Eh'Y másik péJda az ObjectWof{S\Smal1talkból a TableAdaptor (TáblázatIlkszt6) osztály)
amely objektumsorozatokat illeszt egy táblázatos megjeJenítéshez. A táblázat soronként egy
objektumot jclenít TIleg. Az Ühryfél a TableAdaptornal<: paraméterként azt az üzenetI-la]mazt 3.d-
ja át j amelynek segítséf,éveI a táblázatok lekérdeLhetik az oszlopértékeket az objektumoktól.
A NeXT AppKit-jénck [Add94] néhány osztálya képviselő objektumokkal hajt végre fcJüIet-
illesztést. I1nck egyik példája a7 ]\1XBrowser (NXTallózó) osztály, amely adatok hierarchi-
kus lstájának megjelenítésére képes. Az NXl3rowser egy képvisel6 objektumma éri el és il-
leszt. az adatol{at.
Hfd 153
Mcycr "kényellni l1ázassága" (Marriage of Convenience) [Mcy88] szintén egyfajta osztá]yil-
les7té5. Meyer leírja, }logyan jlleszti egy FixedStack (JtögzílettVereJn) ne"\TŰ osztály egy Array
(Tölnb) oSLtály lllchTValósítását egy Stac]( (Verem) osztály felülLté11eL. AL ereLJmény egy ve-
rem, aInely rc)gzített számú eJem.et tartalmaz
Kapcsolodo mi tak
A llidak (lásd: Híd minta) szerkezete 11asonI{) az objel(tulnillcsztőkéllCZ} de ([ljuk nlás: arra
val{)k, 110gy egy [eltiletet elváIass7unk a JTI.egvalósításátúl r 110gy aZ(Jk kc)nnyen és egyl113_stól
fi.iggetlenül módosítl13túk legyenek. Az illeszté5J< ezzel szemben egy lneglevo {)lJjektllm fe-
lületét vált()ztatják meg.
A Díszítő mintá11an anélkül 11ővJtünJ< ](i egy l11ásik objcktum(}l, 11()b'Y Il1egváJtoztatnánk an-
na]{ felületét. A díszítől{ így ,átlátszóbbak" az alkalmazás számára., mint az illcsLtők, amil)éSI
az is következik, hc)gya ])fszltő minta tát110gatja az Önllí\ró összetételt, ami a tislta ilIesztől(-
l<el neJJlleJJetséges.
A 1 el')letles minta ]<épviselőt vagy llclycttcsítőt biztosít eg)' tnásik ohje -<tU1D számá.ra., d.e
neln váltoLtatja meg annak felületél.
HI
Szerl<:ezeti objektumminta
Cé
Az elvont ábráLolást elválasztani a megvalósltástól, 110gy a keLtő egymásté)] független.iillnó-
(!()sÍtható Jegyen.
E yeb nev k
Britlge, Han(lle/Bo(ly (Leíró/Törzs)
Fel'-dat
Amikor egy elvont fogaluml1oz több lelletséges megvalósítás kÖZLil választl1atunk eglet,
a lnegvalósításokat általál1an öröklésse} készítjük cl Egy elvont ()s7tály llatározza meg a fe-
]iiIetet, a.mit a konkrét dlosztályok külc)nbö7ő]<éppen valóst::ln3.l( meg. Ez a 111egközelités
aLonoan nem mind.ig kellé5képpen J1Jgalnlas. Az öröklés mara(ilnd() l<ötést 1102 létre aL el-
vont fogalom és a mcgvalósítás 1{() (Jtl, ami megne11ez/ti a.zol{ egylnástól itiggellen mód.osí-
tását, bővíLését és lljrallaS7nC)sítását.
15 4. fejezet · Szerkezeti minták
\TCg)TÜk IJélciául egy rcndszerel< J<özött llord.üzllaléJ AIJlal( (Winti.()w) l11egvalósítását egy fel-
llls7nálói felll1eti cleIl1készlet1)eo. Az cl\T()nl flhrázolásnak lel1ető\Té kelltLnnie, 110gy olyan al-
l(almizás()klt írhassllnk, all1elyek D110.d az X \Xlind.clvv System, 01]0(i az IBM Presentation Ma-
nager (PM) felülctén műkÖdnek. Örökléssei meghatáro:lhatunk egy Ablak neVŰ elvont osz-
tályt, amelynek Xt\blak (XWindow) és PrvIAbhk (PMWindow) alosztályai valósítják meg az
Ablal{ feliiletet 3.1<.ülönt)()zé5 reo.dszcICl< sLámárl. [l1.ne!< a I11egc)ldás.nak két I-1átulütője va.n:
I
,
1. Az el\T011t Al)l{k t)ővítése lnás ablal<lÍJ]uS()J< vag)l új rend.szerek t3,ffi()gatásá110z 1(é-
o)Tellnetlcn. KéJ1zeljül( el az Ablak TkoJ1Ablal<.. (lc()n \X T iJ1CloV\T) ncv Ű aloszt3.ljTá t, ct mely
aZ Al1]d k fogt.lmál ikc)n()krd terjeszti ki. A]1110Z 110gy az Ik()nAlJlal( tim()g1tása mind-
1<ét rcn<-JsLerre megoldott legyen, két ú j osztáJyt - XTko .1Ablak (X con.Win(J()\v) és
lJM[kc)nAll1al( (I)MlconWinciow) -l{cll megva]ósÍtan.llnl( Anll még ennél is rosszal)]),
1nitldc1"l al)lll{típusra két usztál}rt k:el1rnegllatároZlll111k, egy lllrmadj]{ renclszer tá1110-
galása peclig újalJD Al)llk a]osztály"Fo1<. készítését igén}li a kli]()nféle 8.bléll{lÍI1l1sokl10z.
Ablak
AbI k
I
.......
:::;:::::::{:::::\.
.:1 1 .:..
....
l'
XAblak
PMAblak
XAblak
MAblak
IkonAblak
XlkonAblak
PM konAblak
2. Az ügyfél kÓdját rendszcrfÜgg6vé teszi. Amikor az ühryféllétrchoz egyablakot: egy
adolt meg\r{lé)sítással rend.eJI<ező ]{()nkrét ()sztályt l)élc1fín)I()sft Eg)! XAl)ltk ()lljek-
tll111 ltrcll()zása1{or például lZ X \Vin{10W lneg\lalé}sít{lShoz l{ötjük az A11I2.k fosalmát,
alninek erednlénycl(él)l) a üg)Tfél kóc]ja etléSI a l11egvTalósításté)! fog függni és nel1.éz
lesz 3Zt 111ás ren(Jszere]<re j.tültctni.
Az ügy[eleknek képesnek kell lenniÜk arra, hogyanélkül h07.7.anak létre ehry abJa-
k()l, 11C)gy egy }Jiz(Jny()s Jllegva.lósításllCJZ rag3sz.1{o(jnán11{. Kizárólag az a11Ia]{ rneg
v3lósításánal{ s7a1)ad fLiggnie a re11dsz<:rlűl, lJ11elye11 a.L alkllnldzás tllt+ MindellllőJ.
aZ ]«()vetkezik 110g)l 17 ügyféll\..ó(l.nélk -l7 all1a.l{ok l1é1tJ.áJ1)Tosítását rcnd.szerfüggct-
]en.ül Jell végeznie.
A I-Ií(i ler\Tezési 111inta (1"T)i oldja 111Cg ezt a 11rolJlé111át, llC)g;l az AL11al( f()galn1át és annak
Il1egvTalósítását külc)11 osztál)111ierarcJ-liá](11a J1clyezi. Egyr osztályhicrarcJlia ábrá.zolja az alJ-
lakl'elületeket (Ablak: IkonAblak: Átmeneti Ahlak) , egy másik, önálló hierarchia pedig az
eg}les rcn(lszerekllei: nyújt.ott at}lak-meg\ralósíLás()kat lJ11elynek bYJ7ökere a.2 AblakMeg-
valosítás (Winclowlmp). Az XAblakMeg\'alÓsítás (XWindowImp) aloztály például az
X \XTindo\\/ S)lstelll lla lJÚ Irlcgvil()sítást 11iztosítja.
I
,
Híd
155
,
.....- ..",.:.. . -LI,".r ."-",,1. ................ ...........................................................................I.......=.......................L................ ...........,............ ...1......... .......... ...........- i........:...... . .... i".":'I" . "1 .::".11-:.1."".:".. .........................." ............:.,
; - ' . : .
"II .:" II';:
IL, V
1.-:. ....1.....................................,......
.......-...-............:.................
.'
"
Ab/ak
megva16sftás
ro
-- AblakMegvalos(tás
-
:.
-'.
fszkRajzoJSzöveg(}
EszkRajzoNona/() .'
:
Ra .zoISzöveg()
RajzolTéglalap() o - I
.
I
.
.". ..:...;.......;.1.:........ ".-:.. ..o...... .....:. ...... ..:.... ........ ...:........... - ....... .....:. ...:.... ....... ........ ........................... ....... ....]... ....... ....... ............................ ....... ....... ....... ........ .................. ...... ............ ..- . t..,I.. ,11.11
.. ....1......... ......:... ......:...:..........:...:.1 .....
.1... ...............................
me !lvuI65rtós > E5zk.RujmlVonalO
me gva1 6sftás- > Eszk.Rajzo IV onal()
megva16sftás > EszkRajmlVonalO
megval6.sftás- > Eszk.RajzolV o nain
/\
/\
IkonAblak ÁtmenetiAblak XAblakMegvalósftás PMAblakMegvalósftás
RajzolSzegé vO O R ajzolB ezár6Do boz() 9 EszkRajzol Szöveg() 0- 1- - - t Eszk.RajzolVonalO
I
I j EszkRajzolVonal () O t EszkRajzoISzöveg()
. I t
. 3 L .
r
I
RajzolT é g lal a p ()
RajzolSzöveg{)
RajzolT églalap(}
XAajzclVonaln
XR ajzc [Karakter1án c()
Az Al)lal( alc)sztáJyc)koJl ,.régzett v3.l3.JTI.en11yi lnű\/eletel az AI-J]al{Megvalé)sítás feliilet cl\lonl
rnű\reletei ala.pján \ralósílj llh. meg, 19y elvá] asztju 1< 3_2 cl\Tont álJra.Lolást akii l()n 11c)z(j rend.-
szer függő nleTalé)sításo](tó] Az Ab13.k és a.z Ablal{Meby\TaléJsÍt{ls ]<öz()tti 1<3 lJCsola t 3. híd,
ln1eIyel1 ]<ereszti..il az elvont [Oba lom és Illeg\Tll()sítása eg)Tl113_s110Z !<.apcsolód.ik J és amely
az ol\: cg)'lnálé)] fliggetlen. mé)dosítá.sát le11ető\Té teszi.
Alkalma hatos I 9
A IIíd rninta 11asználat3- 8 kÖvTelkez() esete]<llen. célszerű:
· El szeretnénk kerülni az elv()nt fc)ga]()f11 és Jl1egv3.lósltás3 1«)Lti marl(lan(ié) kc)tést.
Erre £il<k()r le}let példá.ul szükség, lld [lltásic1őlJen ]<e]1 vflla.szt8.!1.i a 111eg\ralósitás()k
l(öziil, vagy átl\.apcsolni l()z()ttük.
· Mintl az el'vont [lt)rál()lásJla]<, Jll.incl1. 111cgvalósításna}.c lJéS\TÍtl1elé5tle]< l<el.l lennie 31-
()s2tál)T()]{ szárl11aztatásá.\Tal. A Hí(llninl£l le II eté5v é teszi 3. 1(lilönböző cl\r()nt r()galnlll(
és mcg\raló.sítások J)ár()sitását és eg}rmástól független bűvítését.
· Az elvont á11rázolás Jl1egvalósítás3.ban eszközcJll \lált()Z{lS()k11al< l1em 523.bad llalással
lenniük aL üg)rfelekre, vahryis nel11 igé11yellletil{ :lzok k()(1jána]{ (lj raf(}rclításá.t+
· (C++) Egy fogalonl ITlegva.lé)sítás[it teljesen el 1(ÍváJ1jU]{ rejte 1i az üg)l[clck eléjI.
A C-l--I-1)3.n lZ (Jsztál)?()lc á11rázolása JátJ1.3tÓ 3.2 osztál)' felliletében.
156
4 fejezet · Szerkezeti minták
. I
· Túl sok oS7tály jött létre, mint a Feladat észben található első diagramon láttu L
A ilyen osztályhierarchia annak s7Ükségességére vílágít rá y hogy egy adott objektu-
mot két réS7re kell \lágo_unl(. Rurnbaugll a "beágyazott általánosításokJ' (nested
genera] lzations) kir eje7ést 11asználja a ilyen 11. erarcll iál<ra rRBIJ+91].
Meg szeretnénk oszta.n egy rnegvalósítdst töblJ objektum között Cmondjul< hiv"ltko-
zi' s szá nláJással), é e7t el szeretnénk rejte 1i aL ügyfél elől. Ennek egyszerű példája
Coplien String oS7tálya [COl)92], ahol tölJb objektum osztozIlat ugy .nazon a ka "alc-
te "lánc ábrdzoJáson CStringRep).
S rkezet
In .. "u. .... ... on .1-_ 0 . -..."..
ifyy'6
. .1.-.... -..............r..,. -. ". ..- ....... ......
: ,.-"..... ..'.. ElvontÁbrázolás
megval6srtás
Megva/6sft6
- -.. -..... ..... .......
mcgval6srtás- >
M OvcletMegvalósftás{);
MweIBtMegva/6sftás(}
,
Múvele ()
o
J
FinomftottEtvo ntÁbrázolás
KonkrétMegval6sft6A
Konkr tMegval6sft6B
MtIveretMegvaI6srtás()
MúveletMegvalósftás()
Rés vők
,
ElvontAbrázolás (AIJla .7)
- Megl13tározza az elvont fogalolll felületét.
- Egy Megva.1osl() lípusú objektumra 11ivatkozil(.
FinomítottElvontAbrázolás (lkonAb ak)
- Ki JővÍtl az ElvontÁbrázolás által meghatározott felületet.
Megvalósító (Al) kMegvalósítás)
- Megl atároZZ3. a mebrvalósító osztály()l< felületét. E felületnek nenl kell pontosan
,.,
megfelelnie az FJvont1\.bráLolás fe ületéncl<:, sől a l(ettő -eljesen különbö7é5 is lehet.
,
A MLb'Valósító felülel áltdlál1an csak alapműveletel{et nyújl, míg az ElvontAbrázolás
magasabb szintű műve]eteket 11atároz lleg, amelyek ezeken az alapművclete]<en
alapulnak
· KonkrétMegvalósító (XA..111a](Megval()sítás, PIvL\blakMegvalósí -át,)
- Megval()sítja a Megvalóít{) felü etet, [s meghatá "OLza anna (l{onkré megvalós"'tásál.
"Lo
Hfd 157
gyüttm" ödés
Az ElvontAl-)rá7olás CAbstraction) továb11ítja a7l1gyfé] l(ére]Jl1ejt a 110Z7á tartozó Meg-
valósító (Im Jlcmentol) objel(tulnlloz.
Következményei
A Híd. minta e]őnyei a kövelke7ők
1. A.feltilet és a 117egvalósítás 7:étválatása. A mea ósításol< nem {ötődJlek maradan-
dóa.n a [elületllcL., és futásidóben bCdlI-'tllalók. Még a7 +s lellelséges 110b'Y egy ()ujek-
lum futás l{()z en váll()7tassa meg a n1egva]ósítását
Az ElvontAb ázolás és a Megva ósító szétválasztása a 10rdítási idcjCí mcgvalósítás-
fUbgőséget is me gs ünteti. A megvaJósftó osztály megválloztatása neIn igényli az
ElvontÁbrázolás osztály és ügyfelei (jrafo dítását, ami létfontosságú, ha egy osz -á y-
könyvtár különbözo változatdi közölt bi tosítanul k ]<ell a bináris megfeleJőséget.
E111e lett ez a szétválasztás rétegezésre buzdít, alninek e "eclménye egy joblJan SLLf-
,Tezett rendszer lL11et A rcndsz:er magas szintű rés ének csa . a Elv(JoLÁ1Jrá olá és
a Megvalósító osztályo]<at kell ismernie.
2+ Jobb b6vítllet6ség+ Az ElvontÁlJrázolás és MegvalósíLó llicrarclliák egymát,tól fübget-
lenül b6vÍtletők.
3 A 1negvalósítás rész/eteinek elrejlése az 1121felek elOI. Az i.igyfele <et el árhatjuk
a mLhvalósítás olyan részletei elől, mint ami yen a m.egv'alósító o11jektll11lok Dlegosz-
tása és az a11110z (alJCSO ádá 1ivatl{ozás-számlálás (ha van ilyen).
M gv losltas
A Híd minta megval()sílásával l<apcs()latl1an a ]<övetkező dolgoJz lén.yegesel(:
1. Csak eJUl i\{egvalósító. A7 olyan 11eJY7etek11en, aml},o csa], egyet en Jl1.egvalósítás lé-
te7i]{, az elvont Megvalósító osztály ctrellozást nem szül(séhLs. Ez a Híd min a "so-
vány" \lá lc) dIa; a El\lontAl)ráz()]ás és a Megvalósító ]<özött e]{]{or egy az egyllez
kapcsolat áll fenn. A szétválasztás azon.ban al<l{or is }lasznos, 1a egy osztá y mcgva-
lósításának l11Ódosítása nem sLabacl, ll()gy 11atássallehyen az oS7td]Y megjevő ügyfe-
leire, vagyis ]10gy a701<at újrafordftan.i ne kelljen, cS2.k újla beszcrkesztcn'.
Carolan rCar89] erre a faj -a szetválasztásra a "Clles11ire Cdt" elnevezést 11as7náJja.
A C++-ban a Megvalósító oS7tályfelülete egy olyan lJrivát fejléc-állol11.ányban llatá
rOZ]1ató lneg, amelyet az ügyfelek nem l(apnak meg, íby aL oszlályok Ineh v dlé)sítása
teljesen elrcjtllctő aL ügyfclel( elől.
2 A 1n,egfelel6 Megl){llóftó ohjekttll1'l létroeh,ozása. Ha egy.nél több van bela ük, llogyan,
1101 és mikol döntjük el, melyik Megvalósít(J ()s7tályl kell péltláJl)rosítani?
Ha az Elvon1Áb ázoJás valame lnyi KonkrétM:egvalós'-tó (Concretdmplementor) osz-
tá yt 9S neri, konstruktorában l)éldányosítllalja ebyküket, és a konstrul<torna]( át-
a.daLl para.Inéterek alapján választ11at közülül{ lIa egy gyújte 11ényosztály pé dául
158 4. fejezet · Szerkezeti minták
tÖbb mq:>TValósítást is támogat, a dÖntés lueghozhatÓ a gyűjtemény mérete alapjan.
A kisebb gy(íjteményekhez lusználhatunk egy láncolt lista alapú megvalósítást, míg
a nagyoblJa]<1:10L. eg)? 113.sít{)- vagy ki-YTonattáblát (113sJl).
Pgy másik ll1egközelíLés, ha kezdetbcn megadunk egy alapértelmezett megvalósí-
tásL, és késé5bb igény szerint mÓdoíLjuk. Például ha a gyűjtemény növekedése kÖz-
ben túllép egy bi7onyos küszöbÖt, megvalÓ.sít3sát a nagyobb SZálllÚ elemnek mcg[e-
lelé5re cseré llletj.
A döntés teljes egészében át is ruhá7ható egy n1ásik objektumra. Az Abhk-Ablak-
MegvaIÓsítás példában mondjuk bevezethetÜnk egy gyár objektumot (lásd a7 Elvont
gyár mintát a 3. fejezetben), amelynek egyetlen feladata a rendszcrfÜggő jelletnzők
egységbe zárása. A gyár tlJdja, milyen típusú AblakegvalÓsítás objektumot kelllét-
reho7.ni az éppen használt rendszeren, így amikor egy Ablak ilyet kér té5le, a megfe-
r"
lelőt adja vissLa. E lIlLgkÜzelítés elé5nye, hogy aL ElvontAbrázolás egyik MegvalósítÓ
osztál}7110Z sel11 Jcölő(i.i!( !{özvelJenül.
3. A meglJalósÍlók megosztá<;;ll. Coplien [Cop921 bemutatja, hogy a C++ leíró-törzs
(Handlc/Body) idiómája hogyan használható a lnegvalÓs:ítások több objektum kö-
zÖtti megosztá.sára. A törzs ( 30dy) egy hi\'atkozásszámlálót tartalma7., amelynek ér-
tékét a leíró (a Handie osztály) nÖveli vagy csÖkkenti. A mcgos7tott tÖr7s(í lcírÓk
11()7Zárcncielési l(()cijának á i talá.n()s -l] -l](jct a kC)\Tetl{<:zé5:
Handle& HandJe: :operator= (const Handle& other) {
other._body->Ref{) ;
_body>Unref ( ) ;
if (_body->RefCounL() O) {
delet:e _bod.y;
}
_body = other._body;
returrl *th is;
}
4. rÖbbszörÖs öröklés használata. A C++-ban egy ielÜletet tÖbbszörös örökléssel is
összekapcsolhatunk a megvalósításával IMar91l Egy oztály például örökÖJhct nyil-
vánosan az ElvonLÁbrázolás (AbsLraction) osztálytóI és privát módon egy Konkrét-
Megvalósítótól. Ez a megold.ás azonban tatlkus ÖrÖklésen alapul, ezélt a megvalós:í-
Lást maradandóan a feJÜlcthe7 köti. El az oka annak, hogy egy valódi 1- íd nlintát nem
valósíthatunk meg többszÖrös öröklés scgítségével-legalábbi.s a C++-ban nem.
Híd 159
eldakód
Az alá.bl) l1emutalott C++ kód a Fell(-lal részl)en bemutatott Al11lk-AlllakMeg'lalósítás
(\Xli Tl(i.c)w- Windowimp ) l 1é ] d.át valé)sítja 111Cg A \tJ j nd.ow (A11Ia]<) ()sztál y az abla.k fogal11l.át
llatáro77a meg az ügyfélI) "ograrnok SZáJ11árl:
class Window {
public:
Window(View* contents) ;
//az ablak által kezelt kórelmek
virtual void DrawContcnts();
virtuol void Open();
virtua] void Close();
virtuaJ vajd Iconify();
virtual void Delconify();
II a Inegvalósit6.sh.oz továbbított kérelmek
virtudl void SetOrigin(const Pojnt& JL);
virtual voi d SetExterlt (const Poirlt& extenL);
virLual void Raise();
virtual void Lower();
virtual void DruwLine(const point&, const poinl&);
virtual void DrawRct(const Point&, const PoinL&);
virtual void DrawPolygon(const point[], .nL n);
virtual void DrawText(const char, const PonL&);
protected:
WlndowIlnp* GctWirldowJmf) () ;
V iew"* GetView () ;
private:
W i nd.üwImp * _imp;
View* _contell.ts;
II a7 ablak tartalma
} ;
A Window egy Windowlmp-re (A111al<MegvGilósítá.s) lli\Ta.tkozi]{, lI11ely l ll[lltérl)cn meg1Jlivó
al113.kkezelé5 renc.!szerlleL feltiletet lle,rezető elv()nt ()ztály.
class Wjndowlmp {
pu.blic:
vir-tuill
virtual
virtu.dl
virtual
void
v.Qid
void
void
Imprll op {) = O;
ImpBottom () = O;
JmpSetExtent(const
TmpSetOrigin(const
polnl&} - ü;
Poirlt&) - O;
160 4"1 fejezet · Szerkezeti mintak
vlrtual void DeviceRect(Coord, Coord, Coord, Coord) = Oj
virtual void DeviceText(const char*, Coord J Coord) = O;
virtual void DeviceBitmap{const char*t Coord J Coord) = O;
II számos további függvény az ablakra rajzoláshoz_..
protected:
Windowlmp();
\1
\
I
} ;
A7 al 'l..dlmazás által használlató ablakfajtákat- ablakok, ikonok, pár1eszédablakok (átme-
neti ablakok, Trans'entWíndow), lebegő eS7közpa ettá {: stb, - a Window alos tá yai hatá-
rozzák meg.
Az ApplicationWindow (AlkalmazásAb ak) pédául a DrawContents (RajzolTartalom)
műveletet vdlósttja meg, am' a táro t View (Nézet) példányt rajzolp .1 eg:
class ApplicationWindow : public Wjndow {
public:
I / . . .
virtual void DrawContents();
} ;
void ApplicationWindow: : DrawContents () {
GetView()->DrawOn{this)i
}
Az IconWindow (IkonAblak) az általa megjelenítendő ikon bitképének nevét tárolja...
class IconWindow : public Wlndow {
public:
/ / . . .
virtual void DrawContents{};
private:
const char* bitmapNarne;
} ;
...és a DrawContents-t úgy valósítja meg, l0gy az kirajzolja a bitképet a ablakban:
void JeanWindow: :DrawContents{) {
WindowImp* imp = GetWindowlmp()i
i f (imp = O) {
lmp->DeviceBitmap(_bitmapName, 0.0, 0.0);
}
}
Hr 161
A Window-nal{ SZál110S további vált()zata lel1elséges. Egy TransientWindow-nak (átmeneti
a.blak, párbeszéclal-Jlak) Dllf]<öciés közben szi..iksége lehet alTa, 110m' kapcs()latba lépJen. azzal
az ablakkal, arTIclyik létre110zta, ezérlllivaU<ozást tárol rá. A paJ etták (Pal et l eW indow) min-
dig más ablakok felelllebegnek a7 il<ontárolóJ( (IconDockWindow) pedig IconWindow-l(at
tárolnal{, és szépel1 elrendezil{ azokat.
A Window művelete. a WindowImp felületen alapulnak A DrawRect (RajzolTéglalap) pél=
dálll négy koordinátát szálnít ki két poinl (IJ()nt) paraméteréből, 11C őrt megllívná a tégla-
lapol az ablakban kirajzoló Windowlmp-tllŰveletet:
void window: : DrawRect (const point& pl, const point& p?) {
Windowlmp* imp = GetWjndowlmp();
imp>DeviceRect (pl.. X ( ) I pl.. Y ( ) I p2. X ( ), p2. Y ( ) ) j
}
A WindowImp konkrét alos7tályai ]{ülönböző a}Jla}{kczclő renclszereket támogatnak; az
XWindowlmp alosztály péJd3.ul az X Window rend.szert:
class XWindowTmp : pubJic Windowlmp {
public:
XWindowIrnp() ;
vjrtual void DcviceRect(Coord, Coord, Coord J Cood);
/1 a nyi1vános felület többi része...
pr " va te:
II X Window rendszerre jellemző állapotok, például:
Display* _dpy;
Drawablc _winid;
GC _gc;
II ablakazonosító
II ablakkörnyezet
} ;
A PreseI1tation Manager (PM) esetében a PMW"indowlmp osztályt 11atá.ro.lzuk meg:
class PMWindowlmp : public WindowImp {
public:
PMVJindowlmp() ;
vjrtual void DeviceRect(Coord, Co ard, Coord£ Coord);
II a nyilvános felület többl része...
private-
II PM rendszerre jellemző allapotok, pé dául:
HPS _hps;
} i
162 4. fejezet · Szerkezeti minták
E7ek az alos7.tályok a WindowImp mLíveleteít az adott ablakkezelő rcnds7er alapmLívelctci-
re építve valósítják meg. A Dev ic eRe ct (Es7.közTéglalap) X alapú megvalósítása például
d kc)vetl(<:ző:
void XWindowTp: :DeviceRcct (
Coord xO, Coord yOt Coord xl, Coord yl
) {
j rlt x == round (min (xO, xl));
int y = round(min(yOI yl));
int w = round(abs(xO - xl));
jYlt ll. == round(abs(yO yl));
XDrawRectangle (_dpy I _winid, _9'C, x, Y I w, h);
}
A 1)J\i1 meg\'llósítás fOfl11ája l7 alá.1J}Ji le]-let:
void PMWirldowTrnp:: Dev j ccRect (
Coora AG, Coord yOT Coord xl, Coord yl
) {
c ( 1 ord 1 e [ t :::: Ini ll. ( X O, xl) i
C lj o rd ri 9 r1 t ::: lnax ( x O! xl);
Coord bot tom = mn{yO, yl);
Coord top = max(yO, yl),
,
,
PP01NrL point [4] ;
point[O].x lefL; pointlO].y top;
point[l].x - right; point [ ].y top;
point[2].x - right; point[l.y = bot tom;
pointl3J.x - lpft; poinl[3].y = bott(lIn;
j f {
(GpiBeg.inPath(hpsJ IL) == false) II
(CpiSetCurrcntPos.tion(_hpsl &pointl3]) == faJsc) II
(CpiPolyJinG(_hps, 4L, point) == GPI_ERROR) II
(CpiEndPath(_hps) == false)
) {
/ I ll.ibaü zenet
} e]se {
CpiStrokePath(hps, lLl OT);
}
}
Híd 163
lfc)gyan szcrzi}( l11Cg az abla.l{ok a tncgfelclő Windowlrnp a.losztá.l)T pélclányát? A })éldában
fe]tess7ük, 11()h7 ez a Window felelé5ssége. Az ()sztály GetWindowImp (SzerezAt)lak-
Iv egvalósÍlás) lnű\lclctc cb')" az a.1Jla.kkezelő relldszer jelJcrTI.zőit egységbe .l8.ró elvont gyár-
tC)] (lásd. az F]v(Jnt b'1Tár mintát Gl 3. fejezctben) kéri el a rncgfclclő pé]cl.án)Tl.
Windowlmp* Window::GetWindowImp () {
if (_imp == O) {
_imp = WindowSystemFactory: :Instance()->MakeWindowlmp() i
}
reLurr1 _impi
}
A WindowSy st emJ-1 l a ctory: : In sta nce () eg)! el,Ton.t gyárat acl viss7a, a111e]y az al1}akl<e-
7el(5 rends7erre jellemzéS ()lJje]<llJffi()kat l<észÍti cI Az egyszerűség l(ed\léérl eg}'lcévé tettük
(az Eg)rkc l11int3.t lásd 3.2 előző fejezetlJen), a Window osztá11l11a]<. pedig mege.ngedlÜl(, 11()GY
]{()7vetlenül érje el l gyárat.
Ismert felhas nal so
(
Az ablakos IJélda az ET++-ból [\\lGM88] szárlnazil(. Az ET++-baI1 az Ablal(Megvalósítást
\'XTjn(i()wI)()rt'-]la]< llívják, amelynel( (Jlyan al()s7tál")Tai vannal<, 111int l7; X\\7il1dC}v\lIJ()rl és
a SLI n\Xfind O\\TI) orl. AL Ablal( (Windo\v) objcl{lUm a ncl,,-i lncgfclclő Megvalósít.ó (ltlll)lc-
Jl1entC)r) olljel{tumot úgy hozzéllélre, I-IOgy egy =\'0rind()V\lS)TSlelll" ne\l(í el\ront gyártóI l{éri
el .L \\!inclo\vS)lstcIIl biztosítja az Ol)Ja11 renclsze függő objektlllllok létrellozásánal{ felüle-
tét, 11l1Jl.t a l1etűt1'puS()]<, egérmutat{)l<, l)ltké!'Jek és íg)T t()vát)lJ.
A7 Er++ WincJc)\v-\X?indc)\\llJ()lt l11eg()lcJ.ása anI1yilJln IJővÍti t Hílllninlát llog)l a \VincJ.O\\l!)ort
v"isszafelé, a Window-ra is l1ivat]{ozi]<. A_ Wind.()wP()rt-l11ealé)sít() osztály ezt l ]lJ\lat1(ozást
arra llas7nálja, 11()GY érlesítse a \\linc.i()W-l l \Xlind()wlJ()It-ri jellemLé5 eseményekré51 (a felllasz-
11.ál()1 l11űve] ete]<rő1 t a7 al11al{ol{ átJllérete7éséről Stl1.).
Copllen rCOIJ9?1 és Strc)ustnlIl rStr91] is Dlegem1íli a leíré) (IIlnd.1e) ()s7tály-r()1{lt, és !Jé]ciá1{rtl is
.d.nlk. Ez<:k 3. lJéldá.k a l11cmórial(ezelésl e, lJéld3.ul a l(a.rlkterláncos 3.brázolások Jnegosztá.-
sira illetve t váltc)z{) 111éretű ()llje]{tlltno]( tánl()gdtásár1 fel<tetik a ]langsúlyt. Mi inj{ál11J a7 el-
vonl fogaloln és mcg\/alósít3.sa egymástól független lJővít11ctőségérc összpontosítottllnl{
A li11g++ ki)l1.yvtár [Lea.88] olyat1. osztályokat 11atároz 111eg, 2.tl:leI)7el( ál.talál1os 3.datszerJ(ezete-
ket (11élcJ.álll Set, linkedSelJ I-IasllSet: Linkcll.Lisl, Htslllal)le) vilósÍllnlk lnegr A Set a llal-
D13 z foga]mát t11egll.atáro7{) elv()n t ()sztál)T, nlíg a 1..1 n l{edljst és aTT ls11rra11le a lán.c()]t listák t
iJletv 7 c a lla.ít()- \ligy kiv(Jnatl:tL)lál( kc)nkrét mcgvllósít()i. A Linkctl.Sct. és a HasllSct olYAn
Set-tI1egva]()sítók, d!11e]j r e1( hid.at ]<épe7ne]< a7 elv{)nt Set és a k()]lkrét in1<edT ist, iJlelve
I-iis11 1 él l)le kC)Z()ll. Ez a "kesken}" llíd. példája, 111i\'el nincs be.nnc el \7onl Megval(}sító osztály.
64 4. fejezet Sz rkezeti minták
\
A NeXT AppKi je IAdd94] a grafikus képek megvalósításához és megj el eníté séh ez használ-
ja a H'd mintát. [gy kép többféleképpen is megJelen"'llető; opt'má1is meg'elení-ése a kép-
ernyő tulajdonságaitói függ, különösképpen a színrnegjek.n'lő képességektől, iletve a fel-
bontástóI. Az AppKit segí sége nélkü a ejlesztőknek ke lene megállapítaniuk, nelyik m.eg-
valósítás has7nálandó az egyes programokban, külÖnböző körühnények közöt .
A AppK't 37 NXImage-NXImageRep híddal mentesíti ez alól a fejlesztőket, Az NXlmage
(NXKép) a <épek kezelésének 'elületét írja le, míg a képek mehJValósítását az önálló
....
NXlmageRep (NXKépAbr) asztályhiera c lia határozza meg, a nelyben olyan a os tályaka-
találunk, mint az NXEPSlmageRe J, az NXCachedln1agcRep vagy a NXBitMa JImageRep.
Az NX mage hivatkozát tart fenn eh:ry vagy több l\1JCImageRep objektumra. 1 a egynél több
kép negvalósítás létezik. aZ NXImage kiválasztja az aktuális képernyőnek legjobban negfe-
előt. Az l\lXImage meg arra is képes, hogy egy m.egvalósítást szükség esetén átalakítson egy
másikká. E hídváltozat érdekes jellemzője, ] ogy .lL NXImage egyldőben több NXImagcRep
megvalósítást is tá. o11a .
I
1
Kap so ód T int Tk
Ii 6 dat létrellozhatunl< és beá lítha.tunl{ elvont gyárral js.
Az Illes téS minta 'ényege a egymással kapcsolatba.1 nem álló osztálya ( együtt . űködésé-
nek bi7tosítása. Általában olyan rendszerekben hasLnálják, amelyek már készen vannak.
tzze szemben a Híd minta lkalmazása a tervezés elején történik, hObY Iehetővé tegyük az
elvont foga m.lk és a mef:,valosítások egymás ó független változtatását.
..
Osszetétel 165
.
O - -t-
Szerkezcti objektllmminta
Egyéb nevek
. .
Com.posite, Kompozit, Kompozíció, Osszctcll
Cel
Ol)jektuI110kal faserke7etlle rendezni 110gy ál1rázol113ssuk a rész--egész visz()nyo]{at. A mód
szer ré\rén az önálló objcktu.mol{at és az objektuIll-ősszetétele](et eg)7ségesen kCl.clhctjük.
Felad t
Az oJyan. grafil(us all(almazások, mint a rajzülópr()gramc)]{ és sémarögzítő reI1dszcrek lelle-
tővé tcszi}{ a [clllas.lnálóknak, ll()gy egys7erCí alapelemekből bonyolult cl.iagraITI()kat építse-
nek. A7 elemek n,agyol1b elelllckbe csoportosítllatók, amelyekbő] rnég n.agyol)b elemek
llozllatól{ létrL Egy egyszerű mehy\TaléJsításlJan e]111ez l11egllatá.rol.llatjllk a grafikai alapele-
mek CpIimitívek) olyan osztályait, lnint a Szöveg (Text) és a V()nal ( ine), illetve azon osztá-
lyokat, amelycl( ezen aldlJelemek tárc)l()ikén.t szoJgálnak.
Ezze alllegközelítéssel aLonban van egy g()nd.: a7 említett osztályokra él)ülő kódnak a7
a.lapcJemeket LS a tárc}l{) übjektumolcat k(ilönbözőképpCI1 l{ell kezelnie, még akkor is, ]la
a fe]llaS7J1áló töbl1nyire azonos módon bánik ve ük, a7 o11jektuJll.ok ezen megl(Lilönböztc-
tésének szükségessége ped.ig l1onyolultabbá teszi az all(alrnazást. Az Összetétel minta azt
írja le, l10gyan l1asznál11atu 1k önllívó össLctételt (rekurzív kompozíciót), 110gy az ügyfél-
programol{nak ne kelljen e7ze] a ])1egkii]önböztetéssel élniük.
Grafika L.. __
r- -
Rajzo/O
Hozzáad(Grafika)
Eltávofft(Grafika)
Sz rezGyonnek(int}
J\
- - i
I grafikák
Vonal Téglalap Szöveg Kép k>
Rajzol{ ) Ra -leln Rajzo[O Rajzol() O..&&.. ....... ..... --- ..&.... ..&... ....... ...&..-..........r"'W..-
Hozzáad( G rafika, g) o- 1------.
I
Eltávolft( Grafika)
J
SzerezGyermek(int) - -
furaU g in grafikák
g.Rajzo1n
- 1 hozzáad gt grafikák listi'a
166 4. ejezet. Sze kezeti minták
Az ÖssLetétel rninta kuJcsa egy elvont osztály, alTIely egyszerre ábrá7.o ja az alapeJemcket és
tárolóik t. Az ábrán látható grafika' rcnds7erben ez 37 osztály d Grafka (Graphic). A Gratl-
ka a Rajzol-hoz (Draw) hasonló mLíveletckLl vezet be, amelyek az egyes grafikus objektu-
_11okra je lemzőek, j]]etve olyan műveleteket, alnelyeket az összetett objektumok közÖsen
l1aszná.lnak, péJdául gyermekeil\: elérésére és kezelésérc.
A Vonal, Téglalap és SLoveg (Lmc, Rectangle, Text) alosztályok (lásd az előző osztálydiagr-
mot) a grafikus alapobjektull1okat határozzák meg, és a Rajzolrl1egvalósításáva] vonalakat,
tégl.llapokat és s öveget rajzolnak ki. Mive] a grafikus alapelemeknek nincsenek gyermeke-
ik, az cmlftett alosztályok egyike sem valósít meg gyermekekkel kapcsolatos m(fve]etekel.
A Kép (Picture) osztálya G 'afika objektumok összetételét (aggregátumát) határozza meg,
EL az osztály Úgy valós"'tja meg a RajLo műveletet, hogy mebhívja azt gyennekcire, és biz-
tosítja hozzd a megfelelő gyermekfüggő műveleteket. A Kép "EJület illeszkedik a Grafika fe-
lülethez, így a Kép objektumokból önhívással újabb Kép objcktu1110k állít1atók elő.
Az alábbi diagra 11 a Grafika objektumokból Önhív'Íssal felép"tctt objektu 11-öss7etétclek jel-
legzetes szerke7etét mlltatja:
egySzöveg
egy Kép
egy Kép
egyVonal
egyTéglalap
egyVonal
egyT égi lap
Alkalm hatós
A7 Összelétel J11'nta I-lasználata a kc)vetl{ező esetel{bcn céJsze:
ObjcktumoJ{ rész-egész viszonyait szeretnénk ábrázolni.
· Azt S7e etnénk hogy az ügyfelek figyelrnen kívül hagyhassák az önáIIÓ obje (turnak
és az ob.el{tulnösszetéte]ek kÖZ()lti }<ülönbséget, és lZ összetett s7er]{eZcl min.den
objektum:'.t egyformán ke7ell1essék.
...
Osszetetel 167
S rk zet
.
Ugyfél -- Elem 1- __
Ill""" f"'III'" -
MlJvefot(j
Hozzáad( lern}
EJtávolft(Efem)
SzerezGyorfflek(int}
/\
"" gyermekek
levél Osszetét I k>
MúveletU MGvelet() ........--................. ....................................
Hozzáad( lern}
Eltávo Ift( Elem)
SzerezGyennek(i nt)
fo ral I g in gyennekek
- --
g..Muvelet();
Egy jelleg7etes Összetéte] obje {tum szerl{ezete így festIle :
egyÖsszetétel
egylevél
egy Levél
egy Levél
egylevél
egylevél
egylevél
R ' sztvevő
Elem (G r dfj ]<a)
- Bevezeti az összetétel objeklumainaJ< feIületét.
- Megfelelő alapérlelme7ell viseI]{edést valósít lncg az osztály()k kc)z()s felülete
;'
S7alllara.
Felü etet veLct be gyermel(elemei elérésére és kezelésére.
(Nem l{()telező) Felületet ]latároz meg egy clcm szülőjének elérésére, és lla szül-r-
ségcs, meg is valósítjél.
· levél (I"léglala J, Vanalt Szöveg stb.)
- Az összctétcllevélobjektumait ]{épviseli. A levelek olyan objektumok, ameJye]{-
nek nincsene]{ gyermel{eil{
- Meg11atározza az összetétel alo'lpobjcktulnainak vise]kedését.
16 4 fejezet · Szerkezeti minták
..
· Osszetetel (Kép)
Megllatározza a gyrermekekkel rendelkezé clLmek visell{edését
- Gyermeke]emel<:ct tárol.
- Megvalósítja az Elem (ComponLnt) felület gyermckekkell(apcsolat()s m(ívelctcit.
o.
Ugyfél
Műveleteket végez 17 összetétel ol)jektuma.\'al aL Elem felületen keres7ti1]+
gyüttmúköd s
Az ügyfelek az E eITI osztály fe]ülete segítségévellétesítenek kaI1csolatot az ()sszeté-
tel objektunlaival Ha a címzett egy Levél CI eat) a kérelem l{ezelése kÖ7vetlen.ül tör-
ténil{t 11a pedig Összetétel (ComlJosite), akkor a l<érele 11 általában továbbítódil< az
összetétel gyermekelemeil1ez. A toválJbítás előtt, illetve után további műveletel{re is
SOf l(e iilhet.
Követk zménye
Az ÖssLetétel ll1inta előnyei és hátrányai a kÖvetkezők:
Alap- és tjs""Szetett ojektu1nokból álló osztáIJ}hier>arc!liákat lzatároz m.c___f!.. Az alapobjek-
tumo!{ból bonyolultabb olJjektum.ol{ alkot}-13tó)<, aJ11el}rck InlbYL1]{ is össLcélJítJ1etők, és
így továl111 Az alapobjektumot várá ü b ryfélkódl1a.l{ összetett objel{tum is átadI1a.tó.
2. Fg)Jszeríisítí az iigyféljJrogra1110t. Az ügyfclel< a7 ()nálló objcl(tumokat és 3.L ÖSs7etett
szcrkezete1{et egységesen kezellletik. '.JcJrmál esetben neo] tudják (é5 nem is szüksé-
ges tudniul(), 11()hT)T levél- va.gy összetett olJjcktumma] van-e dolguk. E7 egyszeníbbé
teszi az ümrféll(ódjátt mert így ner11 kell esetágal{at tartalma7ó függvényeket írnunk
az (}ss7etétclt felépítő minden osztályhoz.
3. A1egkönnJ}íti az új elelnek.felvételét. Az új Összetétel és l.evél alosztályc)k auto l1ati-
kusan működnek egyiitt a már meglevő szerkcLetekkel és ügyfClkóddal; az ügyfele-
ket o.ern kcll módosítani, amikor új Elem osztályokat l10zunk létre
4. A progra'nl túlságosan általános lehet. Az új elemek h07záadásának megkönnyítése
azzal a 11átránnyaI jár, 110gy nellezebbcn szabályozl1atjuk az ()sszetétclck elen1eit
ebyes esetekben uh7anis a.fra le11et szü]{ség, llogy egy össz<:tétel csa]{ bizonyos
eIemel{ct tartalmazzon Az Öss7etétel mintát haS7Jlá]va nerl1 tán1aszl{odllalunk a tí-
pusrendszerre, így aL ilyen ]l1.egkötéscket annal{ segítségéve1 nem kénys7erítlletjül(
l(i J 11el)!ette futá::,j(Jejtí típusellenőrzést kell all<almaznun.k.
Összetétel 169
Megvalósítás
A7 Összetétel minta megvalósításánál a következ6kre kell figyellünk:
1. Kifejezett szülOhil)atkozások. Ha egy gyermckelembé51 ann_ak szülőjére hivatkozunk,
megkönnyítjük az összetett s7erkezet hejárását és kezelését. A sLülőhiv dtkc)zások
egyszerűbbé teszik a feljebb lépést a sze kezetben, illetve az elemek_ törlését, emel-
lett segítenek a Felelősséglánc minta tám()ga ásában is
A szülőllivatkozás meghatáro7ásának helye általában az tIem osztály. A 1 evél és
Összetétel oS7tályok örököllletik a 11vatkozást, illetve £lZ azt ke7elő műve eteket.
Szülőllivatkozások llasználata esetén mindenképpen fenn kcll tartanunk a7t a7 inva-
riánst (nem válto7ó ált"tást), hogy az adott összetétel minden gyermekének szülője
az az összetett objektum, amely gyermekként tartalmazza őket. Ennek biztosítására
a legegys7erűbb nlód ha az elemek szülőjét kizárólag akk{)[ vá oztatjuk meg, 3,mi-
kor egy összetételhez lloLzáadjuk vagy ()nOdO eltávolítjuk őket. Ha ennek mehT\ral()-
sítását az ÖsszetéteJ oS7tály Hozzáad (Add) és tltávolít (Remove) műveleteil1e 11e
lyezzük, az alosztályok valamennyien ör()k()lhetik, az invariáns fenntartásd pc(iig 3Ll-
tomatikus lesL.
2 Az elemek megosztása. Az elemeket gyakran célszeru megosztan!, például a tárigény
csökkentése végett, de amikc)[ egy elemnek nem lehet egynél több szülé5je, az ilyen
megosztás nem könnyű.
Egy lelletséges megc)ldás, ha a gyermekek több szülőt tárolnak, de e7 zavart okoz-
hat, ahoh7 a kérelmek feljebb haladnak a sLcrkezLtben. A IJehelysúlYÚ mintánál
majd látn ogjuk, l10gyan tervezlletjük át a programot úgy, hogy egyáltalán ne le-
gyen szüks£g a s ülők táro ására A Inegoldás abban aL esetben műkc)dik, ha a gyer-
mekek elkeriilhetik, 110gy állapotuk egy részének vagy egészének fel cdése nélkül
kéreimeket küldjenek a szülőknek
3. Az Elem. felület lehetolegnagyobbra b6vítése. AL Összetétel minta egy+k célja, hogy aL
ügyfelek ne tudjanak ré)la, melyik Levél vagy Összetétel osztályokat is használják
F céJ eléréséhe7 az Elem osztálynak a lehető legtöbb műveletet kell megllatároznia az
Összetétel és Levélosztályokhoz. Az osztá y általában alapértelmezett mebalósítást
· s nyíijt ezekhez a műveletekhez, amit a levél és Összetétel alosztályok felülbírálnak.
Mindazonáltal a fenti célkitűzés néha üss etitközésbe kerii az osztályhierarcllia-ter-
ve' és a70n alal)elvével, miszerint egy osztálynak csak a7()kat a műveleteket szabad
meghatároznia, amelyek értelemmel bírnak. alosztályai számára. Az Elem által támo-
gatott műveletek közül az()nban s7ámosnak láthatólag nincs értelme a Levél osztá-
lyok esetében I-Iogyan adhat hát az Elem alapértelme z ett megvalósítást l10zzájuk?
émi kreativitás szükségeltetik: eb!)' művelet, amelynek csak Öss etétel osztályok
esetében lenne értelme, minden Elemre megva ósítható, ha az Elem osztál)rba lle-
lyezzük. A gyermekek elérésére sz()lgálé) feli.ilet például alapvetó rés. e a-- Összetétel
osztály()knak, míg a I..evél osztályoknak nem feltétlenül, (1e ha a Levél osztály1 olyan
Elemnek tekintjük, amelynek soha nincsenek gyermekei, aL Elem os tálylJan llláris
megllatározhatunk egy alapértelmezett gyermekelérő műveletet, amely solla nell1
'70 4. fejezet · Szerkezeti minták
ad vissza gyermekekct. A Levél osz\tályok ezL az alapértelmezett mLgvalósítást haS7-
nálhatják t míg az Öss7etétel osztályok - - mííveletn<:k új megvalósítást adv;:. viss7aad-
h3.tjáh. gyermckej]{et.
A gyermekkezelő 1l1ŰVe etek több gondot jelentenek, így ezeket kÜlön pontba_l
tárgyal juk.
4. A ő-verrnekkezelő mil.veletek bevezeté 'Oe. Bár az Összetétel osztály rnegvalósítja a hryer-
mekek kezelésére s70lgáló 1 ozzáad (Add) és Eltávort (Remove) műveleteket, az
Összetétel nlinta egyik fontos kérdéset hogya hierarcl ia mely osztályai veLetik be
(deklarálják) ezen nlííveletekct. Ve7essük be ő <et az Ele 11 osztályban és érte]mez-
zük a 1 evé oS7tályokra, vagy bcve7etésük és meghatáro7ásuk csak az ÖsszetéteJ
oS7táJyban és alosztályaiban történjen?
A döntést az befo yásolja, hogya biztonság vagy a7 átlátszóság fontusabb:
Ha a gyermekke elő elületet az osztályhierarchia gyökerében határoz' uk meg,
az átlátszóság nIellett döntünk; ekkor minden eleinet egységesen kezelhdünk.
Fzzel azonban feláldozzuk a biztonságot, mert az. ügyfeleknck lehetősébelterem-
tünk arra, hogy értelmetlen dolgokkal próbálkozzanak, például objektumokat
:pfó11áljanak ]evelck11e7 ad11i vagy eltávulítani onnan.
Ha d gyemckke7elést az Összetétel osztályba helyezzük, a prog aIn bi7tonságo-
sabb lesz, mert a C++-hoz hasonló statikus típusokra épÜ]ő nyelvekben [ordítás-
kor dfoghatjuk .17 előző pontban említett értelmetlen műveletekre 'rányulÓ kíséI
lele1<et. A átlátszóságot 3zonban elvcs:LÍljük, ]liszcn a levelek Cs a7 összLléteiel(
felülete kll]önböző lesz.
A tárgyalt tervezési mintábal eddig a7 átlátszóságot részcsítettük előnyben a bizton-
sággal szemben. Hd mégis a bi7tonságra voksolnánk, előfordulhat, hogy tÍpusin :o +-
máeiót vesztünk, és egy clelnet összetétellé kdl alakítanunk. Hogyan tehetjü { ezt
meg anélkül, hogy nem biztonságos típuskényszerítéshe7 (east) folyanlodnánk?
Az egyile Jllegold.ás egy Összetétel * SzerezÖss2etétel () (Composl te* GeL-
Compo sit e ( )) lTIűvelet bevczetése az Elem oS7tályban. Az Elem biztosít egy ala pé -
teln1czell műveletet, amely egy nullmutatót a vissza. Az Összcté el osztály e művelet
feli.ilírásával saját Inaga.l adja vissz' . a thi s mulatÓJ1 kercsztü :
class Composite;
-"
class Componcnt {
public:
/ / - - -
virtual Composite* GetComposite() { return O; }
} i
class Composito : public Component {
public:
vo d Add (Component*) ;
I / - - .
virtual Composite* GetCompositc() { return thlS }
} ;
..
Osszetétel 171
class Leaf : publíc Component {
/ / . . .
} ;
A Ge l C ampa s II G (S7ere7Ös.szetéte]) le}letővé tcszi, 110g)T meg](érdezzlll( 3 Z clC111el t
11()g)T ()sszetett objektu111e. A visszaadoll (JsszetételeJl lJ1.ztol1ságosan ,/égrellajtl1at()1{
az Add és Remove mű'veletel<.
Conposito* aComp asi te = new Compos'te;
Leaf* aTedf = new Leaf;
COInpOTlerl t * aComponGn t ;
Cc)mpositc* test;
dCcnnponcnt = aCompasi te;
if (test = aComponent=-->(;eLComposj tc {)) {
test->Add(new Leaf) ;
}
aComponent aLeari
if (test = aComponenL->GetCornposite ()) {
tesL->Add(new Ileaf) ;// nem ad hozzá levelet
}
Eg}! összetételre llis()nlé) elJeIl()rzést 3. C++ dynamic_casL szerke7etével \régezllellLnk.
A gc)nd. ilt lernlészeteser1 lZ, ll.ogy 3.£ cgYt:S cleIllel{et ner11 egységesc:n kezeljük, így
ellenőriznünl\.. kell Gl típllSl, Inie](5tt végrel13jtllt.nánl( 3. 111cgfcl(lé5 m(íveJetet.
Az átlátsz()ság l1izt(jsítás3.ra <1.2 egyetlen útr Ila lZ E]e11111en 3.la.pértelrrlezctt Add és
Remove ]11Ű\Teletel(ct llíltározunk meg amí "\riS7on.t llja.1J1J goncicl.al jár:
a ComponenL : : Add netll 'IalósítJ1ató meg anél](Lil, }'l()g)T fe11n ne ;illjon annal< él le-
]leté5sége = 11.ogy 3 11lűvclct nClTI jár si }<erre 1. MegteJletjük, llOgy -l 111 LÍv:o e lett1ek azt
mOllujul< ne csináljan sem 111.it de ckkrJr figyelI11en ]\:í\Tü] llagyjl11< 3.zt a tén}ll, ll()bry
a levé]]le7 va1ó l10zzá3dás l(ís6rlctc \lalószínűleg 11ibát jelcz l11ely esetl)en az l\dd
llllÍ\rclct szemetet "állít el(5'. Esetleg lrra utaSJtllatjul\., ll()gy lC)fc)lje lrgllJl1eJltllln3.t tic
lZ llg1lfelek valószín(ílcg nem SZ[1111Ítanak erre.
lIa az adott clcffil1ek nem lellet gyerl11e]<e vagy lll a R e move argLlmentuIl13 nC111 az
elenl gyermeJ<e, á]t3.lflbarl jolJb, lIa az Add és l Remove 3.lalJértclll1Czés szerint nerll
járn.a.k sil{crrcl (pélcl.ául kivételt váltlnak 1,j).
Eg)T 111ásil( lel-le té5ség t 110m! iléJll.iJeg l11óclosítjlIk az "eltávolítás" (reIIJOv'e) jelentését.
I Ja az elenl l1ivatl(ozik a szülőjére, a COrnl)Onen t = : Rernove műveletel felü1 frll.ltju1{
(Igy, llogy az elem eltáv()Jítsa 111.::lgát d. sZlilőjéből, dc i nlegfelelő Add 111lJ\relctct cl(
kCJr sem telletjll]< értell11essé.
5. Taltall'J'lazza-e az JTI(?l]l az eletnek listáját? Csábítllat a lel1eté5ség, J10gy a2 Elerll ()SZ-
lál)ll)an, aJ10J a g)lcrmekclérő és -kezel(5 műveIetel(ct bC\TczctjlJ](, IJéldány\Tálto7ó-
l{ént mcglla.tározzulc a gyef]llel{eJ< 11allJ13.Z3.t+ A gYLrll1Lklllutatónlk a.2 alll)Osztály'l)a
1 2 4 fejezet · Szerkezeti minták
llelye ése lzonban küJön tárigén)rt jelent 111in(len ]evél cseté11en, még akl{or is, 113
a levele (nek solla nincsenek gyermekeik. A rn.egald.ás csak akkor kifi7etődő, 11a
a szerkezetben visz()nylag l{cvés gyerJl1e.< találJlató.
6. A f!.Ycrmekck sorrendje. AL öss7etételek gyermekeinek sorrendjét É-yakran meghatá-
.oZLál<:. A l{o aábbi Grafil<3 példában a s()rrencl az el()tér-Iláttér s()rrendet tükr()z]leti.
lia lZ összelélele]{ ele llzőfikat kép\Tisclnel{, az össLcáilít() lltasítások egyolyan
Összetétel példányai lehetnek, amelynek gyennekeh sorrendbe kell állítani, hOh'Y
t(ikr()lék a program feJ építését.
l-la a g)rerrnekek sorrendje fontos, a g)'cl1nekelérő és -kezelő felületeket go 1dosan
(cll megtervczniink, ]lOgy n1cg[e elé5en. 1{ezelllessü]{ a gyermekek sorozatát. Fbben
l Bejáró tervezési llllnta scgít]-1et.
7. Átmeneti tár (caehe) hw,ználata a teljesítmény javítására. Ha gyakran kell bejárást
vagy keresést végeznÜnk az Öss7etételekbcn, a gyer nekekkel kapcsolalos bejárási
és kcrLsési informáciÓkal az Összetétel osztály átmenetileg tárolhatja. A tárban elhe-
lyezl1.etjül( aL al<luális eredrnényeket, dc szorÍtko7]latunk az()kra az információkra is,
aJl1.el}'ck a 11ejárás Vélb'Y keresés ILfö\rid.ftését szolgáljál<. A Feladat részben bCInula-
tolt Kép CPicture) osnály példáultárolhatja gyermekei befoglalÓ dobozát, így rajzo-
lás vagy kijelÖlés közben elkerülheti, ho!:,? műveleteket végezzen azokon a gyerme-
keken, lInelyel( éppen nem lát "latól< az ablal(ban.
1 la egy elem Jllegváltozik, S7Ü lé5inek á.tmeneti tárát ér vényteJe.ofteni ke 1] Ez al{l{or
a legk()nn.yel)G amikor az elemek iSD1erik szülői kel. Te]1át lla átmeneti tárolást al]{3.l-
111azuok j lneg keIl határoznunk egy felÜletet, ame]ynek scgíLségével tájéko7tathatjuk
az összetéte]e]<et, hOb))l táru]{ éf\Ténytelen.
8. Ki tör"öl;e az elenl.e/?et? A sLemétgyCíjtés néll(üli nyelvekben álta]ába.n az a legjobb, l1a
az Összetélelek felelnek gyermekeik tÖrléséért, amikor a7 összetétel megsemmisül.
E szah{lly a.lól kivéte]t jelent, amj](or 3. levélulJjektul1101( ne01 DJ.ódosulé)k (inlffiu-
tlble), és így nlegoszt11atók.
9. Me}'ik tJ legjobb aCl{ltsze1kezet az ele111ek tárolására? Az öss7etétclel{ külöl1félc
atiatszerl(czeteket ]laszná.lllatna]{ gyermcl{ei]{ tárolásá.ra: lánco]t listákat, fá]{at, töm-
böl(ct és kivODaltáblákat (ll.asltólá.bla, ]las]1). A vállsztott adatszerkezet (mint n1in-
tiig) attóll<.cll, ]1ogy függjün, melyik a 11aték()nyabb. Valójában. még az sem szül(sé-
ges, 110gy á]talános célú adatszerl\:czctet ]laszn.5.ljunk. Az összetételek időnként ]<ü-
Wn változókat tartanak fenn az egyes gyermekek számára, pedig ez azt igényh, hogy
az Öszetétel minden alosztálya saját kezelőfelÜlctet valÓsítson meg. Pé]dát az Értel-
ffiLLŐ mj]1tá 1állátllallln]<, a }{övctkezé5 fejezetben.
Peld kód
A7 olyan részegységekből állÓ eszközöket, mint a számílÓgép vagy egy hi-fi berendezés,
gyakran rés7-egész vagy "tatalmaLza" Vis7o'lyok alapján ábrázoljuic A szátTIítógépház pél-
dául a meghajtÓkat és az alaplapot tartalmaz7a, a busz a kártyákat, és így tovább. Az iJyen
felépítés természetes módon modclkzhető az Összetétel minta segítségéve!.
..
Ossze.téte 173
Az EquipmenL (Eszközök) osztály l1atárc}zza meg a rész-egész ]1ierarcllia ÖSSLCS részegy-
ségére érvényes fellilelel:
class Equjpment {
public:
vjrtual Equipment();
const-o char* Name () { returrl _ildlnc; }
vIrtual Watt Power{);
virtual Currency NctPrico();
virtua.l Currency DiscountPrice () ;
virtual void Add(Equipment*);
virtual void Hemove(Equipment*);
virtual lterator<Equipment*>* CreateTterato();
protected:
Equipment(const char*);
private:
const char* _name;
} ;
Az Equipment olyan 111űvclctcl(ct vezet t)e, amelyreJ< l rés7egységek tulajtlonságait adják
vissza, pélc.lául fogyasztásukal és áruklt. A7 a]osztá]yok eze (et a lnű\rclctcket a(J.c)ll rés7-
egység-tfpusol{ra valós"'tjál{ n1.eg. Az Equipment elllcllett beve7eli a Crea.teJ terator
(LétrellozBejáró) m(ívelctct is, amely egy, az eleo1ek: elérésére szolgáló lJcjárót CIL:erator
lás(J. a C függeléket) aci. vissza, E művelet alapél1elmezctt mcgvalósílása ehry Nl1]lJtera.tl)rt
ad VlSSZl amcl)r aL i.ircs llalmaz bejárására s7()lgál.
Az Equipment alosztályai olyan lcvéloszlályol<al tartalmazllatlla!(, alnely'rel( a lel11e7lneg-
llajtól(at, integrált áraml{()r()l<el és l{lpcsolól(at jell(é!Jez'l(:
class :b---loppyDisk : publlc Equ. I plnenl {
public:
FloppyDisk(cons1 char*);
virtua] FloppyD'sk();
virlual WalL Power();
virtual Currency NelPr.ce{);
virtual Currency Discountrice();
} i
A l11ás részcgységel(ct lartalmazéJ részegységek ala ]Josztál ya. a Camp o s II e Equ i pmen t
(ÖSS7:elettEszközö]<), amelyegylJen az EquipmenL al()S7láIY1:
7 4. fejezet · Szerkezeti m[nták
c'lass CompositeEquipment : public Equipment {
public..
virtua] -CompositeEquiprnent();
virtual Watt power{)j
virtual Currency Netprlce();
virtual Currency DiscountPrice();
virlual void Add(Equipment*)i
virtual void Remove(Equ;pment*) :
virtual Iterator<Equiprnent*>* CreateIterator();
p_otected:
CompositeEquipment(const char*).
private:
LisL<Equipment*> _equipmenti
} ;
A ComposiLeEquipment az alq)'Ységek dérésé-e és ke7eJésére sLolgáló műveleteket halá-
rozza meg. Az Add (Hozzáad) művelel alegységekel szÚr be az alegységek _equipment t.g-
ban lárolt listájálla, 11Íg a Remove (Fltávolít) törli azokat onnan.. A Createlterator művelet
egybcjárÓl ad v'ssza (mégpedig egy LisLlterator-példányÜ, amely majd bejá ja a listát.
A Netprice (NcLLóÁr) :.llapérlelmezctl megvalósítá<;a a CrealelteraLor segítségével
összeg7i az JJegységel( nettó á.rát 2 :
Currency CompositeEqu.pment: :NetPrice () {
Iterator<Equipment*>* i = CreateIterator() i
Currency total = O;
for (i->Pirst () i ! i->IsDone (); i->Next ()) {
total += i->CurrentTtem()->NetPrice();
}
delete ';
return totalj
}
Moslrnár ábrázolhalunk egy sLámítógép-há at a CompositeEquipment oS7tály Chassis
(Ház) nevű alos .lályakénl. A Chassis a gyermekekkel kapcsolatos műveleleket örökli
a ComposiLeEquipment-től.
class Chassjs : publjc Compos.teEquipment {
public:
Chassis(const char*)
2 A bejárÓ törlésérői IÖnnyű megfeledkezni, amikor már végeL:tÜnk a has nálatával. A Bejáró mintánál megmuu.l-
juk llog7an \o ((lekezhctÜ11k az ilyen lÜbik ellen.
..
Osszetétel 175
virtual Chassis();
virtual Watt Power();
virtual Currency Netprice{};
virtual Currency Discountricc{);
} i
A l1asonló tároló1<at 1.1gyanÍgy ]latároz11atju1< Jl1eg, és 11láris felépítJletjül< (elég eg}Tszer(í)
személyi számítógé}JlLnkct:
Cabinet * cabinet - new Cabinet ( .. PC Cabinet r1 ) ;
Chassis * chassis - new Cl1.assis ( II PC Cllassis I ) ;
cabinet->Add{chassis) ;
BUS* bus = new Bus(MCA Bus n );
bus->Add (new Card (n 16Mbs Token Ring' Ir ) } i
chassls->hdd(bus) i
cn.assis->hdd (new FloppyDisk ( u 3 _ 5irl Floppy r1 ) ) ;
cout « irA nettó ár: 11 « chassjs->NetPrice() « erJ,(11;
Ismert felh szn 'lásD
Az Összetétel minta all(allIlazá.sá a szinte l11inden objcl<tull1köZlJOntll renuszerben lllállla-
tunJ( pé1clát. A St111])tllk Mc)(iel/\liew/Cc)nlrc)ller [KJ J 881 erecieti View osztál)Ta is összetétel
volt, és szinte valame 1n)7i felllasználói :"elljleti elel111{észlet és lcerctrenclsLcr köv'ette ct 1)é1-
d.áját, ]{()Zlük az Er++ a VObjecls-szel l\VGMRRJ, lZ IJlterVie\\Fs -l Styles-sztl II CJ+921,
a Gra.pllics rVL881 és a (ilyp11s rCL901. Az érd.el(esség 1(ec1véért 111egcIIllítel1dő 110gy az cr<.:-
deti \liew-llC)Z alnézetek llaln1aza lartC)Zotl, \Tlgyis a View e!-:,Y)Tszerre töJtötte ile az Elen1 és
az Összetétel osztály szerepét A SJ11alltall(-8() 4.0-ás 1{iadásálla11 a ModelNiew/Control1cr
rcnclt,zcrt áldolgoLták; itt 111{lr egy VisllalColl1ponent (VjzlJáliElem) ne\lŰ ()szlályt taláJuJlk:,
VieV\r és (:OllllJositeView (ÖsszetettNézet) alosztály"Fokkal.
Az RTL SJ11aJ1ta11{-ford.ítói keretrends7er [JML9?1 l{jterjedten llasználj3. a.2 Összetétcltnint.át..
Az RTLExl)ression (I{TLl(ifcjC:Lés) ClC111zőfál( COffi1)oncnl (Elcrn) osztálya, amelynek ll()sz-
tályai, példál.l1 l Binrr)TExJ)ressi()n CBinárisKifejezés), gyerInel< RI- 1I..FxJ1ression ol)Je]<tuI110-
l{at talta.lm3.zn3.k. Ezek 3.2 osztá.lyol{ élJítllz fel az elerllzőfá.k összetett szcrl(czctét. A l)r()grl-
m{lk kc)ztes Single Static AssignmLnt (SSA) fC)fJnáj{lnak t:lem ()szt{llya a RegisterTransfer,
t11e1)To.ek le\ré l-a] c)sztálya i kl] J ()nll()z{5 stati k11S IlOZ7áreJ1Cie 1 éseket }latározn.a]{ meg:
· a1ap\ret() 11077áreJ1cteJése](el, ]11e]yel( során. 1{ét regisztercn. 113jtana].c végre egy művc-
lelet, majd az crcd.ményl Cg')l llarmadiklloZ ren.d.eliJ<;
· a for.rásregiszteren. kf\rü.l célregiszterrel n.el11 ren.dell{ező 110zzá.rcndelést JJ11i a.zl jelzi,
110g} a. regisztert egy függvény visszatérése után l1asználjllk;
176 4. ejezet Szerke eti mintak
· forrással nem, csak célregiszterrel rendelke7Ő lozzárenddést, ami azt jelzI, hogy
a regis7ter 1aszná a ára a fiiggvény elindulása előttl{eriil SOf.
A RegisterTransferScl alosztály az Lgys7e .re több regis leli mód.Qs"'tó 1107zárendelések
Összetét el osztál ya.
A minta pénzügyi területen való alka mazására példa, amikor e1:,Yf porúolió pénzügyi esz-
közöket összesíl. J la a porttoliót olyan öss7eté -elként valosítjuk meg, amely megfelel a7
egyes eszkÖLök felületének) bonyolul összesítéseket vége7hetünk [BE931
A Parancs lninta leírja, hogyan épít 1etők össze és ál íthatók sorba a Parancs objektumok
e,gy MakrÓParancs (MacroCommand) Összetétel osz ály segítségéve!.
Ka s 10 ó int'k
Az e em-szülő hivatkozásokat gyakran alkalmazzák felelősség áncok é )ítésére.
A Díszítő minta gyakran has7nálatos együtt az Összetétel mintával. Ilyenkor a dís Ítő \: és
Össze éteJek szülőosztalya általában közös, ezért a dísztőknek olyan műveletekkel ke 1 á-
.nogatniuk az Ele 1 felületet, mint a H07záad (Add), az llávolít (Rernove) vagy a Szerez-
Gye mek (GetCllild).
A l)elle ysú YÚ minta révén megosztI-latjuk az elelnel{ct, de e]{ko" azo]{ nem llivatko 1att1a {
többé 7i: lőjül(re.
Az öss etételek bejárásdra a Bejáró minta alkalmazható.
A Látogatók olyan viselkedést és műveleteket gyújthetnek egy helyre, amelyek máskép
IDegoS? Ianának az Összetétel és [evél o7lályok között.
Dfszító 177
I
"
I
Szerkezeti objektumminta
Cél
A7 olJjektumo]{]10z dina.mikusa.n további felelősségi kC)fC)ket rende]lli A kiegészítő sLolgál-
tatások biLtosÍtása terén e móu.szer rugalnlas altern.atívája az a.losztályok lélreI1()zásánal<.
Egyéb nevek
Decorato Wrappcr (Burkoló)
elad t
Időnként egyes objektumol(lloz, nem pedig eh'Y teljes osztály110Z szeretnénl{ :'clc16sségckel
rendelni. Egy braf+ku felllasználéJi feJüIeti elernlcészlet példaullellctővé kell tegye ()lyan tu-
lajd.onságoJ{, illetve visell{edésel{ felvételét bármely felüJetelemJlez, Jnint amilycnel( a szc-
gélycl{ vagy a görgelés.
A -clclősségck llozzáadására az ebryik mód az örö}<lés. Ha egy szcgélyl például ehIJ' aci.ott
osztály tóI örc)klünk, annak valamenny' alosztálypéldánya l{()rül megjelenik a szegély.
Ez a megoldás azonban rugalmatlan rTIe'rl azt, 110gy van-e szegély t statikusan döntjük el, az
üID r elek nem szólllltnak bele, mikc)f és 1()gyan. díszítjük az elemet szegéllyel.
Ennél rugalmasabb megcJI(J,ás, ha a7 elelnet egy másil{ objcl\.lul11oa ágyazzuk, anlely go 1-
closkCJdik a szegély 10zzáadásáról+ A 1)C3.gya..lÓ olJjeklumot nevezzü]{ díszítőnek A díszítő
a díszíteltclem felületéhez iga7()d.il<, íb jelenléte ész evétlcn marad az elen1 ügyfelei s7á-
mára. A díS7ít{S l()vállbítja a l{érelll1el{et a.2 elem11ez, és a lc)vál)bítás e]{5tt vag)7 után egyéb
műveleteket is végrehajt11at CIJéld.ául szcg'élyt rajzoillat). Az átlátszóság révén töb1:J clíszítő is
egymáslJa ágyazI1at{), így korlátlan számú tulajclonsággal vagy levékenységgel egészítl1et
jü], ]{j a rendszcl1.
egySzegelyOfs to
tI1}(, .appki,l ima:--. w""LlIu. b..::ndi.C
fI;"l .11 \ 1-:> i I1J ..}!:J.1C....t:-. lo nlflot.1d ":-\lt;t}'
II"';p......:1 Lf thÓr flIK.l(II].idil}. hm
:'1 Ilili ....... do..:: i n i.ll1l1road ,.... ouk1 I
i,mh 1 h.i 1 i \Od}' .X pGr);!.I......: .
o
..... .
egySzövegNézet
. ......
""."':.
";:'f" 1-' .4-- ..# .....
.,g..-.-:f'-o"'--..!i .H-
.J ,..,.$,t"''?..'':' _
¥" _'*" ."'.... :-o;- ..,..:<.'
...-';- .- ---" ....<I. ......,:::< '.
-c"-"" :1-"-' ......... -c..,.- ..s-- -';O"....
'.,;f;-......,...--':....'"! :c;p.... :#.... ' ....... _Lot:-
ot.-"' "". ';;....."'" "'.- ............ ,(:'<"
...,f........I: ....-J,...". _ .:!":.$-":"""'-, --"- '" t.... 1 .i" "6-
.,..- .J .0:.-.... .... "'""' .
<o-.'!t :1i"' .4!i r ,,,'=---o!.""-- .:-.: ....... ,.",.. :-<;i""
,r.. .j."" :to .-rr ..)- -.:.. =' .o:::.: ......:.. ..;;e.::.,
""-"<.<. 4-"r ..." ,ot- ,yt.Ji"..--:..;:' ".
-ci>.::' :'.4'..#'::r->;-.. .-.P ...p""y_ ..;*
"" .:i> d i?'-.:!r.Jo 'i'""...... ....:i r
. ":-0-' ,,;:"\. ...-$>.: ....
.:,; :t". p'
-...; - --i-
.t: ...:-00-
...
.:...:......I....\:..
I.I. .:i.. :I
\ ..
li)r t. X:,111 ph.. I1lnt ..10(' II inC 111 .....d-
i11 U'!, I r)l.ud.1 ri "lt.. thc i r 1..:-....1 fnrrn.i.lt-
· i rL:... n I1d (....ti Lill L f:...' i L i 1 .:.:-." 14) U In..:-
L':\ IL ll'. I-[(1W(: ...t.r. lh..;... i tH":..ri i'....l...
...L(l]1 =-J)r[ nr 1I<;111! HI j 1..:0..: 1:. 1 J
1"1. -pre:-.....ILr .:1.... h (:II:u .I(:t....r inlJ . "..'
rT.:J ph i L:.ill d1=nu.111 ill II\c d(1(:lllnL" 111 '::'.::-
nm II r: ;L;L \Ii I mM 11H1 II 101 L n... n I..i hir '.\\'
:
.al rhe if):L. I"'LI .n h . j
appl i.....ilr iU11. T L-:-."( 1 .!lui p.1 ph i...... ..:g;:
oDuLd hL:: I LI:=.LI d ml tUI'ru]}' ....... i1 h .' ,.'S"
egyGörgetésDfszftó
!}
A.:.
........ o:.
::::..}:(, .:.,
1
I
8 41 fejezet · Szerkezeti minták
Példaként teh'Yiik fel, hogy van egy SzÖvegNéLet CI extView) objektumunk, amely sLÖveget
jeknít meg egy ablakban. ASzÖvegNézet aLlpálJapotban nen1 rendelke7i.k gördílé5s3vval,
his7en arra nem mindig van szÜkség. Amikor kell, hozzáadásáról egy GÖrgetésDíszítő
(ScrollDecorator) objektutumal gondoskodunk. együk fel, hogy emellett vastag fekete
szegélyt is szeretnénk rajzolni a SzövegNézet köré - en egy SzegélyDíszítő ( ()rdcrDeco-
rator) vége 7. heti. A díszítőket cgyszerLÍen összeépítjük a SzÖvegJ\ézct objektum.mal, és már-
is elérjiil( 3. l{ívánt ereCllnén)lt.
Az alábbi objektumdiagrarll azt mutatja, hogyan építhető ÖSS7e aSzÜvegNézd objekturll
a S7egélyDíS7ítő, illctve GÖrgetétIDíszítő objektumokkal, hogy egy szegéllyel ellátott, gÖr-
getl1ető S7()\TegnézéSkét 110zI1aSlJn]( 1étrc:
egySzegé ly Dfszító
elem
egyGörgetésDfszftő
elem
egySzövegNé et
A G-örgetésDíszítő és a Szcgély])fszftő 3. DíszítéS (l)ccorator) a1osztályai, anlely a más lát11ató
elerTIckct clíS7ítő látllatéJ elemek lJ\r()nt osztá.lY;l
Láthat6Elem
--
-
Rajzo/O
/\
elem
Szöve 9 Néze
Dfszító
c>
RajzolO
Rajzol()
0- - I - - - - - - - - - - - -
t
el eJ11-.> RajzolO
/\
GorgetésDfszftó
Szegé lyD rszitó
Rajzol!)
Görgettde( )
Rajzol(} 0- - - - - - -
RajzorSzegélvO
Of szító:: Rajzo I{);
R ajzol Sze gé lyn.
gö rgetésPozfció
szegé ySzé esség
D' szító 179
A. LátllatóElel11 (Vlsua}C:oD1I)Onel1.t) a látllató elen1ek elvont osztál)la; a.zol\. rajzoló és cse-
111énykezelő felületét llatároLza llleg. Mcgfig)'elllctjük llogy a Díszítő (11ec()rat()r) ()sztá]y
egyszer(íel1 ttJ\ráb111tja a rajzo]{lsi }<ére]Jne]<et a llozzá tartozó elel1111ez, alosztályai lJedig l(i-
bővítik ezt a 111Ű\Telctet+
A Díszítő \.losztá.lyoJ sza.t)3.don biztosítllalna.k további 111Ű\lcJelel(el. A GörgetésDíszílő
(S(rollDec()ratür) C"örgetéslde (Scfolfl"ü) mtívelete J1éldául lellelc)vé tes7i Jllás olJje]{tulnok
SZá111lra, 110gy g()rgesséJ< a felületet, !lU tlldjá]{ 110gy d felület GörgctésDíszító objLl\llIffiOl
rartal111az+ A tervezési lnintllén)reges \TOn3.sa 110gy clísZÍtők bárllol all<alll1aLl1atók, all()l egy
Látl1at{1Ele]11 megjelenllet+ Emiatt az ügyfelek álta13.113.n n.e!11 ttlclna.k llilönl)séget t.enni egy
díSZltctt és egy cl"- szÍtedel1 elem között, így teljesen fliggellcnel( mara(I.ll-ttnlk t cl.íszítl.stéJI.
Ikalmazh tóság
A Díszítő lninta. a.2 '-l.lá.1Jbi csetcklJcn alkall11azl13Ió:
· Egyes ollje1<tull1o]<at clin.d.Iniklls2.n és á.tlátszÓlll, \llg)7is ln3.s objel(tLlffiokall1ClTI érint-
\re lJizonyos felelősségi körökkel szeretnénl< 1<iegés7ÍleJli.
· E1távo1ft11.at{) jeIletTIz(5ket szeretnén..1< felven.ni.
· Az a.losLt3.l)!ol(1(ll \'a.ló }Jő\/ítés nem célszcr(í. Előfor(J.ulllll, 11()gy nagy slálllÚ (}nállé)
!Jőv1tés lell.etséges, ele az egyes .k01111Ji.n.3ció]( t3.m.ogatása. a.z aloszt.ályok szál11ának
rolJbanásszer(í 11övel(cdésél1cz vezetnc. Az is lcllelséges, ll()gy a kívánt ()sztá]YJneg-
llatár()zás rejlett vag)I más J11{)d.()n 11()77áfér11etetleJl a]osztál)T-létrelloz3.s célj3.ra.
Szer ,ezet
KonkretE
Elem -
--
Műve/et()
-- ==I -
e[em
lern Ofszító o
Müvelet( ) 0- ----
A
,
KonkrétDfszftóA KonkrétDfsZttóB
Muvelet() Mavelet () 0--= =-- --- - --- -- -
houáadottÁ I ap ot HozzáadottViselke dés(}
-- - u - 1 e[e>MúeletO--
Múvelet( }
_ _ _ Dfszftő::Múve utO;
HozzáadottVise Iked és();
180 4. ejezet. Szerkezeti minták
Résztvevok
Elem (LátllatóElc111)
Meghatáro7.7a azon objektumok felülctét, amelyek kÜlönféle felelősségekkel d'-
nalnikusan bővítlleLők+
· KonkrétElem (Sz()vegNézcl)
- Egy objektumot határoz meg, amelyhez kiegészítő felelősségek csatolhatók.
Díszftö
- E!:,ry Elem (Component) objektum ra hivatkozik, és olyan felületet határoz meg,
aJTIcl)T megfelel lZ Elen1 fclületénel\..
· KonkrétDíszrtő (SzegélyDíszítÓ r GörgetésDíszít(5)
- Felelősségeket rend.el az clem}lez.
E yüttmúköd s
· A Díszítő (Decorator) kérelmeket továbbít EleiTI (Componcnt) objektumához, ezen
kívül a kérelem továbbítása előtt V3.hTy után egyéb művcIeteket is végrehajthat.
Követke nye
A DíS71tő 11lintána]{ leg'llábll l{ét lény.eges előnye és ]{ét llátránya V'ln:
1. A statikus ö,-öklésné/ n-fgalmasahb, A Díszítő lTIinta rugalmasahb módot nyújt az ub-
jektumok elelősségi körÖkkel való bővítésére, mint a statikus (többs7Ö ös) örÖklés;
a7. új képességek hOL7áaclása és eltávolítása futásidőben egyszeruen, pusLtán a díszí-
tők csatolásával és leválasztásávallehetséges. zzel szemben a7. öröklés új osztályok
(pl. zegélyesGörgethet6SzövcgNé7.et, SzegélyesSzövegNézct) létrehozását igényli
minden új képességhez, ami rengetq, osztályhoz, s így bonyolultabb rendszcrhe7
vezet, Ezen kívül, ha eb'Y adott Elem osztályho7 kÜlönbÖ7ő Díszítő osztályokat b"zto-
sítunk, a f-eleJősségi kÖröket egymáshoz illeszthetjük és keverhetjÜk is.
A díszítők azt is egyszLrú1bé teszik, hogy egy tulajdonságot kétszer vegyünk fel.
I la egy S7ÖvegNéLethez például kettős sLegélyt sLeretnénk adni, csak két Szegély-
DíSZÍtőt (BorderDecorator) ke1I10zzácsatolnunk. A Szegély (1ordcr) os7tályból való
kétszeres örÖklés ezzel s7emben legalábbis könnyebben hibát eredményezhet.
2. ElkerÜJhető a képességeket tartalmazó mztályok iÚI magasra helyezése a hie1"archzá-
ban. A DísZ"lŐ minta használatakor a felelősségek hozzáadásának kÖltségeit foko7ato-
san fizetjúk meg, Nem kell azzal próbálkoznu {, hO b 1JT egy bonyolult, testreszabhatÓ
osztályban támogassunk minden elkép7elhető képességet; helyette elég egy ch.rys7erCí
usztályt TIcghatároLnunk, és díszítéS olJjcl{[umo]<l(al fokc)7atosan 1107Záa(1ni a ]{1vánt
szolgáltatásokat. A szolgáltatások gy ehTyszerű cIemekből építhetők fel, a7 alkahnazás-
nak pedig nem kell 11zetnje olyan ]<épességekért, a.mel,yeket nem ]lasznál. FJ11elletL
egyszerű a bővítendő objektumok osztályaitóI függetlenül új fajta díszít6ket meghatá-
rozni, még előre nem látható bővítések esetében is. Ezzel s7emben egy bonyolult osz-
tály l1ővítése a .1ozLáad.ott ](épességel(l(cl kapcsolatban JlelTI álló részletel(et fedn.c fcl.
Dis 'tó 181
3. A díszítő és a flozzá ta:rtozó elelJl ne1n aZ01l0S. A d.ís7"'tők átlá szó e&rységként vise {Ld-
nek, de az obJel{lUlllOk a7Q 10ssága szempontjából egy díszített o11jektum nelll azonos
az e +edeti olljelffilffilnal, íbry nenl is é Jítl etünk erre, amj Tor díszÍlŐl{el a kalmazunl(.
4. Szálnos kisl'lléretiI objekti/ln jön létre. A Dísz/tó minta llas70álata gyakran olyan
renels rt eredményez, amely szám os l1asonló k+né7etű apró objcktuml)ó] á 1 Ezen
objektumok csal{ ka.pcsolóc ásuJ{ rnódjában kü ()olJöznek t oSLtálytll<at és a változó
J (ban tá.rolt érlékel{et tel{intve nem. Bá eg)' ilyen rend.s7er a sZ2.kértő számára
J;'ÖI1nyen testreszab lató, ne 1éz átlát 1i, és a h.bakeresést js 11cgnel1ezíti.
Megv Iósltas
A Díszítő minta megvalé)sítása során a.L dlábbia :Tra l{ell tek.nlelte] len.nünk:
1. Afelu/el nleg{eleI6sége. A díszítő objektu 1 felületének illeszkednie kell lZ álta a dí-
sz'tett eleJl1 elületé 1e . A KonkrétDísz....lő (Cc)DcreteDecorator) ()sztályoknak ezért
egy l{özös osztályból kell ö öl{ ődn.tik (lega ább.s a C++-ban).
2. Az elvont Dí..()zít6 osztály killa6Yása lIa csal{ LbY kepességet szerelnén]{ felvenni,
nin.cs szükség elvont D"'sZJtő osztály neghatározására. Ha nem új osztályl1ierarclliál
ép"tünk, l1anem egy meglevővel d.olgozun {, gyakran e a llelyze . Ebben az esetben
a Díszítő azon szolgáltatását, ]1ogy {ércimeket lová.blJít a.2 eleml1e7, a Konl{rétDísz-'tő
osztályba llelye7hetjül{.
3. Az Ele1n osztályok pehelysúlyúvá tétele. A felület ill_eg e előségének biztosítása érde-
kében az elemeket és dfszÍtői {et egy kc)z(JS E em osztálybó {el szármaLlatni Fontos t
10gy ez a közös osztály pe llJysúlYÚ legyen, vagyis a elil et neg 1atározásá 3, nem
pedjg adltok tárolására öSS7pontosltson. A7 adatábrázolás lnegllatározását az alosz-
tálya (fa kell 1agyni, másképp 3.7 Elem osztály bOl1yc)lultsága túl "nellé zé" tesz. a d"-
szít(5ket aJ1hoz, hogy sokat Ie]1essen llasználni belőli]{ Elnellett az Elelll osztály szá-
nos szolgáltatással való terllelése ann.a]{ valósLínűségét is növeli, 11067 a l{onl{rét al-
oS7tályok o]yan szolgáltatásokért fizetnel(, dmelye]{re nincs is s ül{ségü {
4. Az objektul1"lOk ))b61'"éTlek JJ nz.e15változtatása a J,belsoségek)) 11e(vett. A dís "'lőkre úgy
gondolilatunk, mint egy vise]l<edését válto7tató objektum b{Srére. Ezzel sLemben
a Stratégia mintában például az olJjcklum 11e]ső részeit mód.osJtju {.
A stratégiál{ alkalmazása az olyan ]1e .yzetckben jol)l) választás, amikor az Elem osztály
ered.endően. ne11ézsúlYÚJ így a Díszítő minta 11aSZD.álata túl kölL')éges lenne. A Stratég.a
mintában az elemek vlselJcedésük egy részét kü ön stratégia objektumokba l1elyezil(;
ezek cseréjével vá.ltO.ltGlU1atók vagy bővtlletők az adott elcln S olgáltatásai.
Különböző s eg:;lyst lu sokat példáu úgy támogatl1atunk, 11a 3.Z e crn szegé yrajzoló
l{épességét egy ön[lló Szegély (Border) objek .umra ru lázzu (ál. A S7egé y egy o ya.n
Stratégia objektum, a l1ely egy szegélyraj701ó stratégiát Ldf egységbe. A stratégiá { szá-
l11ának bc)v"'tésével ugyanaz a I-latás érl1eto el, mint a dísztők cgymásl)a ágyazásáva .
A MacApp 3.0ban lApp891 és a Bedrock-ban rSYln93a] péld.ául gra.fjJcus objel<ttJmol<
(ugynevezett tné7etek") "disz" (ad.orner) objektuillC)k listáját tartják fenn., amelycl{
a szegélyekJ1ez l1ason Ó dísz"'téseket csatolllatnak egy nézet objektumhoz. Ha egy né-
182 4. fejezet · Szerkezeti minták
zellle7 c Íszcl\.. cStllakc)711a]{, a nézet megengedi nekik 110gJT fcldíszítsé]{ A M3CApp és
a l3edrock a7:ért .szonIl t:lTC a megokIásra, merL a View (Nézet) oS7:t:íly nehézsÚlyú, így
túl kc)Itséges lenne em T teljes értél(ű View l1aszná.1a.ta IJusztán eg)' szegély ]10ZZ3.3clására.
Mivel 3 Díszít(5 J11j.l.1t. csal( kfvlilrcil változtat meg egy elemet, a7 eleJnnl:l( emmtt
SCI11 kell tuclni8. díszÍté5iről, vag)ris az()k átlátszóa!( SzáIl1ára:
egyDfszíto.
elem
egyDfszító
elem
egyElem
bővítés díszítővel
]
Strat.égiák I-1as7ná]2.tl csctén az eleln .sIncri a le]letségcs Gő\'ítéseJet, így llivil]{07n.ia
ke II 1 Jl1egfelclő stra légiá 1<ra:
egyElem
st atégiák
egyStratégia
következő
egySt atégia
következő
bővítés stratégiával
A st Aatégia alat)ú 111egközelítés al eleIl1 01ÓU()Sltását igényellleti, l)()g)7 az új 1)(5víté-
sckre lel1eté5ségct bizt()sítsun]{. M3.sfclől, egy stratégiá.nak egyec1i fell11cle lellet, JTIfg
eg)7 d-"'szÍtőnek iJleszkednie kell az elem. fclülelé11ez. Egy sLLgélyrlj7oló stratégiának
l)élclául csak 3 szcgélyt TllegJelcnítő felületet (lajl.()ISzegély, SzerezS7élesség
I)raw13ofcler, GetWi(it.11 5t1).) l{cll megha.tá.roznia, ami azt jelel1ti, ] l()g)l l stratégia ik-
kor is Jlellellsúlyú lellet, l1a 11l3.ga az Elem ()szt5ly llCllézsú])TÚ +
A MacAIJp és a Bedrc)ck 11.er11 csak nézetek diszítésére llaszoá.lj5.k e7t él l11egoldást,
113.ncm a7 cJbjektu11101( eseI11én.yl<c2clő \'ise] kedésénck 11é5\rítésérc is. A Jlézetek
minclkét renclsLerlJen egy listát tartanak fent1. 3. ,t\liselkeciésol)jel,tllillc}lcról", alllCl)lek
k:éllesel( LSenlé]lye]{et elfogni és ]11Ód.osítani. A nézet a l)e nt:111 jeb7zett "'/Ísell<Lllése]{
előtt nliJlden lJLjcgyzelt vi.se]]{edésubjcktuI11ánal( lelletőséget ad 3.2 esemény ]{ezelé-
sére, ezzel gYi]{or]atllag fcliilírjl azo1<at+ Pélclául egy nézet. úgy cgés7ít]lető ki lJillen-
tyűl{cLclésse], ll0IDI bejcb'Yzllnk egy viselked.ésolJjel(tlllnot, 1111e]y eJfogja és J<.e7eli
a l-JiJ1entyűzct fel(51 érl(ező cSemén}TeJ<.et+
.
D' szító 183
él akód
A ]<ö\Tet]{cző l(ód azt mlltatja, 11ogYln valósítl1at{}k Jl1eg a fclllasználól fellilcli díszftők
a C++-tJan. FeJtesszlll\.., ll()gy egy Vi sualCornpon en t (Látllaté)Llelll) ncvű F]etTI osztáll)lil
rend.e] ]{ezünJc.
class VisualComponent {
public:
VisualComponenl(};
virtual vajd Drdw()j
virtual vajd Rosize()j
/ / . . .
} ;
MLgI1atár()zzl11{ 3. Vi sualConlpon en l Decc)J a tor (DísZltéS) neveI alosztál)Tát, amelyből
a ki.i lön]JöLő ci.íszÍléseJ< 3.J.osztáljrait f()gju]{ s23.rmaztatJl i.
clss Decoralor : public VlsualComponent {
pubJic:
Decorator (V j su a.l Componen1 *) ;
virtual vajd Draw();
virtual void esize() i
I / · · ·
private:
VisualComponont * _cornpc)nent;
} ;
A Decorator 1 l{OI1.strukt()rl)ln előkészített componenl péld.ányvá.ltoLó álll] ]l]\T::ltkozott
Vis ua 1 Componen t -et clíszíti. A De c o r at o r a Vis ua. J Componen t fel ületélJcn szereplő
l11inclcn m(Íve]etl1ez 3.J.aJ)érlelnle7ett 111eg'va.lósítást ad 3.111clyeJ,( a kérelrllct l _componenL-
llez tc)vál11)ítják:
vajd Dccorator::Draw () {
_(ornponent->Draw ( ) ;
}
vajd Ducorator::Resize () {
_component->Resizc() ;
}
A kii!i)tl.böző díszltésekel a Decoralor alosztálY2.i l}atáro7zál( meg; a Bc)rderDGcorat()r
(SzegélyDíszít6) osztály például s7egéJyt ad befÓglaJó elclnéhez, a Draw (Rajzol) művelet
felülírásával. A l3orderDecorator emellett egy DrawBorde r CRajLolSzegély) ncvű privát
segédlnűveletet is l11cgl1at.ár()z, am.eJ}r 8. tén)rleges rajzolást \rég7i. Az alosztály l11in.den más
lnű\'elet JllegvaJósítását a Decora tor-túl örc)]<li.
84 4. fejezet · Szerkezeti minták
class BorderDecorator : public Decorator {
public:
BorderDecorator(VisualComponent*J int borderWidth);
virtual void Draw{);
private:
void DrawBorder(int);
private:
int _wldth;
} ;
void BorderDecorator: : Draw () {
Decorator::Daw() ;
DrawBorder(_width) ;
}
A látllató elemhe7 görgetési képességet és árnyékolást ado ScrollDecorator (Görgetés-
,;
DísZ1tő), illetve DropShadowDecora tor (ArnyékVetőDís z tő) megvalósít( sa 11asonló
Az említett osztályokból példányokat készítünk, amelyek 11i7tosítják a különféle dís Ílése-
ket. Az alábbi kód l1emutatja, 110gy a díszítők has7nálatával110gyan 110Lllatunk létre egy
szegéllyel elJátott, görget leto szövegné7etet (TextView)
ElősLör mÓt ot l{elI adnunl( a látllató elemek al)Ia]{ objektu lokba helyezét,ére. Feltesszü {,
10gy Window CAblal{) osztályunk er.e a cé ra egy SetContents (BeállítTartalom) neVŰ
nűveletet biztosít:
void Window::SetContents (VisualComponent* contents) {
/ / . . -
}
Most már létrehozllJ.tJuk a szövegnéZGl, és egy ablakot, amelyben ellelyez7ük:
window* window = new Window;
Te/tVOew* textView = new TextView;
A TextView olyan VisualComponenl, amely az ablakba helyez 1eto:
window->SetContents(textView) ;
Csakhogy mi segéllyel ellátott és görgetl1ető TextView-l sze etnénk, ezért az ablakba ]1e-
lyezés előtt megfe]e]őe 1 díszítjü (:
wlndow->SetContents(
new BorderDecorator(
new ScrollDecorator(textView), 1
)
) j
DrsZÍ ő 85
JvIlvel l Wj nd.ow tartalmát a Vj_sualComponent feltileten ]<eresztl11 éri el nem érz6keli
a díszítő jclenlétét. AL tih'Yfél azonbln nyoITIOn Jövetlleti aszövegnéző állapc)tál, II a !{Öz-
vet]enül keJlll.ozzáférn.ie, példállllIa oly'an lnűveleteket kell megllívnia, 3. 11el}!cl( nem ré-
szei a VisualCornponent iclülctnek. A7 eleTll 17(}nosságára a.la!Jo.ló ügyicieknek s7intén
kc)zvetlenü] l<ell ]-1 tvatl<o7oiu k az elel11.re.
sme felhas nal sok
A vezérlők gra.fil{llS díszítésére számos objektumkc}zpontú felllasználói felületi c]em1{ész-
letllaszná] d1S7ít(51<et. Ilyen lJéldáu az IntcrVic\vs [lVC89, LCJ+921 J az ET++ r\'X7GM88] vagy
az ObjectWorks \ Slnallta.ll( osztályk()nyvtár llJ ar 90J. A n1.int2 .1{lilönlegescbb alkaII11a"ásár1
példa a DebuggingGlypl1 37 InterVjevls1)ó], illetve a lJassivil}T\VrapJJer a ParcPla.ce
Snlalltal]{l)ól. A DcbuggingGlyph llilJal(eresési infc)rmációt ír l(i, nliclőtt, illetv'c miután l()-
vábbít egy elrend.ezési kérést a 1107Zá tartozó elemllcz. EL a nyomkc)\retési in.forrnáció az
összetétele]{ o1)jektumai elrendczl=si viselkedésének elenlzésére és llibal<:crcsésére 11dS7-
nállldtÓ. A l)assi\lityWraIJper a7 eleJl1JTI.eJ \Tégezhető fell13sználé)i műve]etek engedélyezé-
sére, i]letve letiltására szolgál
A )íszítő minta a7()obaJ1 neI11 korlátozódil( a grafiklls felllasználói fe] ii lete]{rc, (;lmint azt
a l{övetl<.ező (az ET++ olY:lmosztálY:lin WGM8R] al1 )uIó) pé]da is illu.sztrálja
.Az ad.atfolyal110k (streal11) a.la.pvető jelentőségű f(JgalI11ai a 11emel1eti-l(iIncnti (1/0) renti-
szcrcl(nck. A folyam o11jeklUm()k 11:1Jl- \Fagy l{a aktersoroLattá való alakítására lJiztosÍt felll
letelt így egy olljel<tumot 1<éső1JlJi :'eI113.sLná.lás (éljáb{)l fájIlá vagy .ne 11óriá.ban tárult karak-
terlá.nccá alalcít11atunl{. Ennek lege b rys7erűllb 11ódJa egy elvont SlrealTI (Fc)lyalll) osztály
megllatár()zása, amely egy MemoryStream és egy FileSlream a]c)sztálJya.l rcndell<ezil(. De te-
gylil< fel, 110gy az a.Jj.l)bill{ra is lclletőséget s7:eretnénk adni:
· az ad3.tfolyam tömörítésére külcJn11()z() tc)m_örítő alg()ritlnusol< segítségé\lel Cfutás-
110SSZll k()(i.()lás, I.empel-7iv stlJ.);
· a. fo]ya.IT1!.)a.n ta.rolt adatok 7 bites ASCII kara](terekké ct..)öl{kcntésérc, 110gy átvillet{Sk
legyenek egy ASCI kC}Il1ITIUniJ<ácié)s csatornán.
A. DíSZllŐ mintával cLck a (claclalc)k kc)nnyren az adatfolya.n10klloZ ld.llatól<. A kö\Tetl{ező
olcial()n látl1aló dilgram egy példát rlllltat 3 probléll1a meg(Jl(i.ás:lrl.
Az clvont Strelm c)sztály egy beIs(i átmen.eti t(.lral (lJuffer) tlrt fenn, és ]l1űve1etel<<:t l)iztosít
a adatc)l< f()lyam11a h.elyezésére (Putint, l)utString). An1ikor 1 tár Jll.egtelil<., a Strc3.m megl1Ív-
j3, az clvont HandleBufferFlllJ műve]elet amely a tén)rlcgcs adatátvitelt \Tégzi. Amííveletet fe-
lülfr() FiieStrea]TI-változat a tár tarta.lmát egy fájlba írjl.
186 4. fejezet · Szerkezeti minták
Stream
-
-
PutlntO
PutStrngO
HandleBufferFulJ()
L
elem
MemoryStrealn
FiJeStream
StreamDecorator
HandleBufferFultO
Han die Bulf erFu ti ()
HandleBuftcrFuBO 0-.... - - - - - - - - - - component->HandleBufferFuUO
".:.
/\
ASCI17Stream
CompressingStream
HandleBufferFuno
HandeBufferFuIO 0- - r.-
adatok ömo Jtése az tmeneti táman
Stre am D eco rator:: Ha ndleBufferFul1 ()
A legfontoabb osztály itt a StreatnDecorator (FolyamDíszítój, dmely egy elemfolyamra hi-
valk07ik, és ahhoz kérelmekct továbbít. A StrearnDecordtor alosztá1yai felülírják d Handle-
BufferPull műveletet, és további tevékenységeket végeznek, mie1őtl meghívnák a Stream-
Decorator IandleBufferFull mÚveletét. A CompressingStream (TömörÍt{5 ;'olyam) a10s tá1y
például tö nöríti az adatokat, míg az ASCU7Stream 7 biLes ASCII-vé alakítja lzokat. Ahhoz:
]10gy olyan FiJeStrc3.m-et 1107ZUnl{ létre, amely tömörÍti adatait és a tÖJnörített11in.áris aclato-
kat 7 bites A..';CII-vé alakítja, :3 FilcSLreanl-et egy CompressingStream-mel és egy
ASC 17Stream-]11e] díSLítjük:
Stream* aSt re am = new CompressjngStream(
new ASCII7Stream(
new FlleSt Gam("egyFájlNév n )
)
) ;
aStream->PutInt(17);
aStream>PutString("egyKarakterlánc1l)i
K pcsolódó minták
IJesztő; A díS7ítők annyiban különböznek az illeszt6ktőJ, hogy csak az obJektumok fdada-
tát, nem ped"g aLak felületét válLo7tatJik meg. A7 iHesztők teljesen új fe1üIette1láLj.'ik ej az
obje](lu 11101{al.
Öss7etétel: A díS7Jlők csökevényes öss ctételeknek tekinthetők, amelyek 1ek csak egy ek
mük van. Minda70náltal a díszítők [delé5sségi körök h07záadására valók, nem objektum.-
össze tételre.
Stratégia; A dszíLók segítségével a7 objektumok "bőre" változtatható meg, lníg a stratégiák
révén azok belseje vagyis a obJeJttull1.()I< módosításánal( ]{ét mé)dját jelentik.
Homlokzat 187
I .
Szerkezeti ()llj ek:lu 1TI1Jl.i.n ta
E yéb nevek
Facadc, Arculat, látsZílt
Cél
Eg')! alrenclszrbcn felliletel< egyr }lalr1la7áll0Z egységes felliletet lJiztosítélJli. A móclszerrel
111ag-isal)ll SZiJltŰ felii]etet 11ltározunl( mcg lmel)lI1ek ré.v.én az ac1(Jtt 31rcnuszer 1(()11Jl")le11-
llen 11.3.szn3.l11ltó\-rá \!álik.
eladat
Ta egy rendszel1 airendszerekre l)()ntun]<, cs()1{kentlletjül( annik b()11")l()lllltságát. F011tOS
tervezési célkilű2és 110gy az d]rel1d.szrc]{ l{özölli ftiggé5ségel<et és 1{OI11l11Unikációt a leI-lelé5
]egke\Tese111lre csö]{l{entsük. Ennek elérésére a7 egyrik lllegold.ás, lla t)evezelÜt11< egy hom
lokzat ol)jektumol) amely eg'jletIen ef-,-r,.rszer(ísítet.t fcli.ilctct au ll ad.()tt llrendszer állaláno-
sll)ll szolgá ltatása i SZ 3.111 ára .
ugyfélosztályok
--------
---------------
[
Hom okzat
....
::::::::;.:::.:::::\
- . .:.:.
---------- ----------
/0
!
/
v/
o
alrendszeri osztá lyok
\'ehy\rü n 1{ 11éldá.ul egy l)rogrtmozási lc()rnye7etet, llneJy llozzáférésl lJi7Lc)sft az é11]<alr11azá-
sok SZ[ilnára a f()ftJ.ít{)i a]rend.szerJ1ez. Ez 32 alrenu.szer ()lYln osztályroJ{1.t t3.rttl111aL., mint
a }Jásztáz{) (Scanner) lZ Elcmző (lJarser), t:l IJ rC )grarl1C:soln.ól)()nl (1)rogrlJ11N(){le), a ]ájtkó(]-
Folyam (BytccodcStrcam), vagy a ProgramCsomópontÉpítő CProgramNode 3uilder) amc-
I)Tek 111egva]ósítják a :"ordítót. Egy'cs alkalm-lzás(JJ(11ak szül{séglik lellel ezen ()Sztá1.)701{ köz-
vetlel1 elérésére) de ct fortiftéJ ]egtc)1111 üg)Tfele nerl1 tür(Sdik lZ ()I)ran részletcl<l(cl, 111inl tZ
eleIl17és v:ragy l 1<ód-elő{tllítás t csal\. \/alaIlliI1Ien k{)d{)t szeretn.ének lefor(J.ítlni_ SZ{lnlU kra lZ
erőteljes, dc a.lacsony.szint(í felületek a fordítói a.lIl:11(!szer[Je]1 CSll{ 11()11jlOJítják a fcléldltot.
f
88 4 fejezet Szerkezeti minták
AJ1IIOZ, 110b:ry a7 ügyfcleket e7en osztályoklól elszigetelő magasabb szintű felüJetet bi tosft-
1 asson, a fo .d'tói alrendszer egy rordtÓ (Camp 'ler) nevű osztályt is tartalmaz, ame y egy-
séges felület Jldtá oz meg a fordJtó szolgáltatásai 10Z. A FOld.'tó osztály 1 omlok?atként viel-
l{edik: a ügyfelek számára egyetlen egys7eru felületet nyújt a fordítói a rendszerIlez, emel-
ell összcragdsotja a fo d"'tó s7()lgJ.ltatásait megvalósító osztályokat, anélkül, hogy teljesen
el -ejtené a7okat. A 'ordítÓ homlokzata a legtöbb programo ó dolg:'l megkönnyíti, miköz-
ben nem rejti el azokat az alacsonyabb sz'ntű szolgáltatásokat, .1melyekrc. egyeseknek
s7l11{ségük le let.
Fordft6
O"
.
r
'
\
iJ
'
;-
\"
'"
::
f
i.L'I...........""........... .." 1iU"....J.............. ........:... ............... .......... ........... ....."............................................. '...,.... .. ........ ........ .....:... ....... .......:. ................................. .'L 'INI...... ................;.,...................... .....,.. 1 ............. ...:. ..:................:..............:.............. ..............;.. ........... ..:...;..... "......'1.L'I..L'lUrI.II(I..,.IIt(I..II..." .................."..".....".................,....... ......... ......... ........... ...............'..,...,L'lIL'I...,Lt1...... .."......Ifi1...................... ........ ................... L'I......IJ:1IW1...... :.................... ..............
...,.....".....................:.....................................:......" .............,........."IIft'L'tI........"It"iL"I"I." .....................................:...................................................."............
..
:: t3J i1 ffltI:1'5i
..:
"
1'i'0 'o. o\'O ":,( 'O)O"Pl:;;lir
'1o'0'f. 10 t /I.O OV: ......
For ftO
10'/f._ to
.0' ;{)..".-11 J.'" H1! t "'ON
{l!:.3.J/;.. 4, if -t, /1"
,.
-1
.
I
.
I
.
.
.
I
&
.
t
t
&
t
t
L
!
i
f
J
.
- - -
olyam
o'
.:.
:
;;
o'
\".
X.
\.
.
.
.
:
.,..
.
't-
\".
r
.
.
á-tk6dFo yam
K6dEJóátlít6
-----..........
- -
V rem Ge \.ód E lóállít6
Aik Im
atós '
1
.
t
t
t
,
.
t
t
t
.
t
r
t
!
ilii.."............, ..." ...,...,......"I-.................................................................L.L'I L'I ..,....,....I.."......iII....I.............-n.............1................................- ... L'I...,...,L'I..."..,........It"(I.....,....................\"................................ ......
i
i
I
I
I
.
.
.
,
:- -- -1
-{ gra mi
,
.
.
r
t
t
t
r
.... 'oq
t
]
Pásztázó
To ken
- - .....
Elemz i I Szimb6 um ---
-
om6 ' pftó t - - · '! mCsom6pont
1\
-- .... - - .....
UtastásCsornó ont
KüeJelésCsorn6port
o Vá tozlCsomopon
- . ."
RISCK6 lóál1ft
A Homlokzat In on la al]{almazása a k()vet]{ező Lsctekben célszerű:
O
,
!
f
\
\-
!
"
g
J'
.
,
O
.,
Ji
"
O
"0
1:
.i.
il
:
FgyszefÚ clületet s7eretnén.k nyújtani egy bonyolu l al endszerlle7. Az alren(1s7erek
a fejleszlés 1,ö7ben llljlamosak egyre összetetteblJé válni, a ]egtöbb terve7ési minta
azonban több kisebb ()s7tályt cred.ménye7. Eza tal a alrendsze 1r jobban újral a.S2no-
stlr tó l.S könnyebben testreszabható lesz, de a test 'cs abást nem igénylő ügyfelek
sLán1ára ne]1CLcbbé váliJ( a }lasznaldta. A honllokzal ()lyan egysLerű a .apértelme7ett
nézetél ldlldtja (. z alrencl.s erne]<, ami a legl()bll ügyfé sLámára lnegfL el. Csa]{ a.zol\.
nak a7 ügyfelelnck ke]l betel{intcniü.k a 110mlokLat mc)gé, amelyek nagyobb testre-
s7ab 1atóságol igényellek.
Homlokzat 189
· .Az elvont fogalmalI11egval()sít() osztályc)k és az tigyfelel< kc)z()tt S7{lJl1()S fliggős(g' áll
fenn. A 11()mlc)l<zaL l1e\rezetésé\Tcl az alrendszer eJ\Tá1aszt]1a.tó az üg)Jfclcl(lől és I11ás
a]renctszcrel{t(-Sl így függel1enell11é és llorclozl131óL)lJá \lálik.
· Az alrcn(iszereket rélege70i szeretnénl( Eg)' ll()ml()k7attlJ llelépési !JOntol lla.tár{Jz-
l1atllnk 11l.eg l11indcn aIrendszeri sintlle7. IIl az cgy<..:s a.lrenliszereJ{ eg')rJnást{)l fl1gg-
l1e1{, e függőségck cgyszerűsít11eté5k, lll 3L alrcncl.szerek cSlk 11()Il11o](Zatlll\..on l<.c-
re SZlli 1 tá rsa. 1 o gJl a tn al; e gy'más:..l
Serke et
." .................... ................. ....1 ............. ........ .................
Homlokzat
.:" Y:'...::.: - :'-".:...:;..\ .'...'J.:.'-\ ::: r., ....:...'
..........
Résztvevők
· Homlokzat (For(lító)
- 1'll(l.ja, nlel)T €1IreI1d.szeri (}sztá.lyuk felelIlele egyr l(J()tt 1<ércleIJ161t.
- Az ügyfélkérellnel< l<:eze]ésél a 111egfelelő alrcntlszeri ()1)jekttl1n()1(r1 rullázza. álo
· alrendszeri osztályok (IJ{lSZt3.ZÓ, Elemző, 1)r()grlmCS()f11{}I)orlt stI").)
M egval(ísítj3.k J.Z a.lrencJ.szer sJ:()lgá] ll t3.sa it.
El végzi l{ ct 1 ()Jl1 ]()k£lt olJJeJctul11 ált.ll ráju k lJí z()ll fej aciatot.
Ki n(s lucio]11ásll]{ l }lOl11lokz;ltr()I, vlg),Tis fleIl1 11.va tkoznal<. lrrl.
Együttmú öd's
· Az lig)lfeleJ( ú h 7 léptlel{ }Z8.pcs llla.tlJa. az 1]rend.s7errel, llC>g}l klrcln1(1(et kiiJd.ene1(
aTT (1 fll1 o kza tna 1(, aJlli (].Zl2.n l ()\Tá 1) 11 í l j a az () ka t 111 e gfe 1 el (5 ll ren (Js z er i () 11 je ktll J1111 ( ) Z
V3.GY ()lJj<.:1<tlll110}.cll()Z. Bár l tén)rJegcs n111nkál az llren(Jszerl ()lljel<tL nlc>l{ végzik,
a 11()J111()k7attla k is sZl11(sége lel let !)17:()nyos felacLJt()k cl\!égzésére 11()g)T fel li lctét a.z
11 ren(lszcri fel liletckllez igIZítSI.
A ll()nl]()kzat()t llaszn.á.l() ügy[elekne]{ !1em J(eJl közvTellcnCll cl(rnili]{ 17 alrerlclszeri
()lJjektuJ11 okat.
190 4. fejezet · Szerkezeti minták
övetkezme ye"
A HOl11l()I{zlt tc:rv'czési Jllinta clől1yei a ]<.övetkez(Sk:
1. Ebzigetelí az Üf.,yyfeleket az alrendszeri Öss7etevőktől: így csökkenti azon objektu-
mok számát: amdyekkel az Ügyfeleknek foglalko7niuk kell, és megkönnyíti az -ll-
ren {1S7er 1:13.szná 1 a tá l.
2. ..a7a cSíltlJlást J102 létre 17 alrendszer és ii g vfclci k()z()tt+ Az íllrendszer<:k öss7etevői
il. ,/
gyal(ran S7oros csal()lásí13k, a lizd cS3.tolá,s révén. 3.Lonb111 anéll\.lll 'váJ, toztJ.dlató]<
llogy e7 11.ltássallen.ne aL alrencJszer iig)'felejre. A 110ml()k7ato}.. segflenel( a rcnc1s7er
rétegzésében: és az objektumok kÖ7ti fÜggős[gek szabályozásáb<Jn, megszÜntetve
a oc)n}l()lulr vagy (()rkörös rüggé5ségekct, anli igen Iény 7 eges, 113. az aJ rendszert és l2
iig)rfelel cgYJl1i.stó] függetJenij] val()sftJu k .ncg
A f()fCjít3.si f(igg(5sége]( csökl<entése létfonlC}sságll a 11lgy szoftverrend.szerc:kben, J1i-
s7en ha az alrendszeri osztályok megváltozása nem von maga után nagy s7ámÚ Újra-
fordítást, .időt llklrít11.2tllnk nleg. A függősége]( llonllc)kzatl)kl(aI lal{) csökJ\:eJltése
korlátozza a7 újrafordítás .szükségességét, ha egy fontos alrends7.erben aprÓ változás
történik. A homlok7at emellctt a rendsLer más felÜletre tÖrténő átÜltetését is meg-
kÖnnyíti, mert használata mellett kevésbé valós..ánű: hogy egy alrenclszcr felépítése
során .lZ ()sszes töl)lJi 1Jrel1.dszLr felépítésére is s7ii]{ség \7ulna.
3. Nem akadályozza meg, hogy az alkahnazások - ha szÜkségÜk van rá - használják az
alrcndszeri osztályokat, így választhatunk a használat könnyebbsége és a nagyobb
általáJl0sság l(öz()tt.
,
Megvalósítás
A 1 If)f11lokzat nlil1t3. 111egvaJé)Slt3.S3. során a kövct!<ez(5J,re l<ellligyelni:
]. .t1z 11g)!lel-al}erldszel'" csalotás csokkentése. Az tig)Tfelel( és lZ ;:llrcll<.lszer I<ÖZÖtl fenn-
állÓ csatalás tovább csökkenthetÖ, ha a homlokzatot e!yont osztállyá tesszÜk: amely
12 a.lrencis7er 1(ülünb()zé5 rnegval()sításailloz l(()nkrét alosztál)l()kkal rencleIJ<ezik. Ek-
l(()r 32 i1g):!felek az elvont 1 TC)Jl110kZtlt ()S7tály fellilctéJl kereszt.ül érintl(czlletl1ek 3.2
a]rendszerrel. Ez az elvont csatolás megak3dályozza: hogy a7 Ügyfelek tudomással
bírjanak arról, hObT)T az alrends7er melyik megvalósítását használják.
Az alosztályok származtalása helyett a7t is mcgtehetjÜk, hogya llomlokzat objektumot
.kül()n[)()zö 31rcn(iszeri objeJluI11()kkal állít juk lle. Ekkor a 11()111101-cZ3.t teslreszabásállC)Z
e b 1'szerűcn CSIJ( kll{cll cseréJn.ünl<. egy vat,»T több alreJldszeri ol)jel<tllnlá.t+
2. I\lyill)iino..-.; l)ag'}) privát ulren{.lszeri ()sztcíIJJok? Az aJren.clszcrck ann.yilJ3.n llls()nlítanak az
osztályokhoz, hO&7 nekik is van felületük: és egységbe zárnak valamit - az osztályok ál-
lapotokat és I111Ívc1eteket, az alrendszerek osztályokat. AhohTJ" pedig az oS7.tályoknak
van nyilvános és priv:it felületÜk, az airendszerek is rendelkezhetnek ilyenekkel.
Az alrendszerek nyilváno felükte olyan osztályokbóJ áll, amelyeket minden ügyfél
elérJlet, ln.íg a IJriv{lt feliilet cSlk az alrc11US7eJ11Jővílő ()tJje]{tllffiOk s7áJJ1á.ra lluzzáfér-
Homlokzat 191
llctŐ. A HC)!11lokL1.t ()sztál)' tl:rmészctesLll a n)Tilvános felülel része J (le l1er11 az egyel-
len, más 1Iren(ls7eri ()sZlály()]( is n)lilv[lnosal( A fordító. alre ldsze & Ele l1ZŐ és Pászt(;l-
ZÓ osztály"Fai példá.lll szintén a 11)filvános fellilet részei.
Az alrcn(Jszcri (JsztálytJk n)Til'7ánc)ssá tétele l1aS7Jl()S le]let, lllégis ke\Iés objeJ{tuJnköz-
p011l-ú fl)íeJv támogatja. A (++ és a SI11a.11tall( llJ.gyomá.n}osan globálit, né'vtérbe llelyez
ték az oSZlál)rol<3t, dc t C++ n)ICl\lCl szal)ványc)sfl() l)iz()ltság l<ésé51111 a né\rtere]{ }1()Z7á-
ac ásávl] lelleté5vé tette ]lOg;l cSlk a nyi1vállOS 11rel1(1szLrl oszt3.1}rok:1.t fccljtil< rcl
Péld kod
Nos, akl(or nézzLik meg, ll()g)lln lálllalllnk elll()mi()kzltllI egy fOfclít(Ji aIrel1c1szert+
Az llrenclszer InLgllltároz egy ByL ecodeSl ream CF3[ljtk()d.Fc)l)Tarll) oS7tá l)Tt, 3.111el y "F egJl
Byt ee o de (l-3ájtkód) o11jektunl o1<11ó1 álló 3.d3.tfolya.n1()t \ralósít meg. A I3y Lee o de ol)jcl(l u-
ffi()l( lJájtk()(I{)l(Í;ll Lárnak eg)lséglJe r iIlle.lye]{ géJ]i utlsílás()J{al fogaJm17n.al( tIleg. Az aIrellcl-
s7er ezenJ<1VÜ1111egllatáro7 egy rro1<en neVŰ osztáJlt is azon o1JjcktllIll(Jk száInára, amel}7ek
a progr3.Inozjsi nyelvr ala.})clcIneit (tokcn) zárják cgységlJc.
A Scan.n er (J>á.sztázó) osztály cg)r 1(3.ra.l{t.erfolya.Inut vesz, és egYTszerre eg)! e]elllet (tc)]{ent)
vizsgál\ra tol(enfol)ran1111á alal{ítjl azl.
class Scanner {
public:
Scanner(istream&) ;
'v Lrt 1J al """Sca.rJ.ner ( ) ;
virtual okcn& Scan{);
pri va te :
i strcam& _ i.flputStroaIU;
} ;
A Parser (1lemz(5) ()s7tály egy Pr-ogramNodeBu i lder (Progra.1IlCSOlllÚ!JOntÉ!Jítő) segíl-
ségével elernző 'át épít fel a ScanIler tol{cnjcil)ől.
class Pa....scr {
public:
Parser' ( ) ;
virtual Parser();
Vil-t ual vo id Parse (Scanner& r lJrograrnNodeBui lder&:) i
} ;
192 4 fejezet Szerkezeti minták
A Parser a ProgramNodeBuilder vissLahívá'1áv3.l foko7atos3.n J-elépfti az eleJl1.zőfát..
Ezek a7 osztályok a7 Építő rnintát követve m(íködnek egyiitt.
class ProgramNodcBuilder {
public:
PrngramNodeBuilder()i
virtual ProgramNode* NewVariable{
const char* varjableName
) const;
v'lrtual ProgramNode* NcwAssigrunent (
ProgramNode* variable, ProgramNode* expreSSlon
) COIlst i
virtual ProgramNode* NewReturnStatement(
ProgramNode* value
) const;
virtual ProgramNode* NewCondjlion(
ProgramNode* condilion,
P£ogramNode truePartI ProgramNode* falsePdrt
) const:.;
/ / .. .. .
ProgramN<'ldc* GetR()otNode ( ) ;
prjvate:
ProgramNode* _node;
} ;
A7 ele TILőfát olyan ProgramNode (ProgramCsomópont) alos7tályok példányai építik fel, mint
a StatementNode (UtasításCsomópont), a7 ExpressionNode (KifejezésCsomÓpont) és 1.6rr
tO\láh11. A Progra.mNodc I"lierarcllia az ()sszetétcl tervezési mintát követi. A PrograntNode
a prC)gfdIll-csomóponl és esetleges gyerlTIckei l<ezeJésérc 11atároz 111eg fejületet.
cldss PrograrnNode {
publlc.
/1 program-csomópont kezelésG
virtua] void GetSourcePosition{lnt& line, int& index);
I I - -
/1 gyermekek ke7clése
virtual void Add (PrograrnNode*) ;
virtual void Remove(PrograrnNode*);
/ / . - -
Homlokzat 93
virtual void Traverse(CodeGeneralor&)i
protected:
ProgramNode() ;
} ;
A Traverse (Bejár) művelet egy CodeGenerator (K()(lFlé5{11Iító) olJjektuJTIot veSZt an1.it
a ProgramNode alosztáJyo ( arra 113.szn.álnJ.1(, 110gy gépi kódot 5.llítsanak elő egy
ByLecodeSLream By Le code (}bjektunlai fC)rnlájál)an. A CodeGenerator oS7tály tn aga
egy Játogat() (lásd. a rátogat{) Dl.intát az 5. fejezetben).
class CodeGenerator {
public:
virtual vo'd V.sit(StatcmcntNode*);
virtual void vis it (FxpressionNodG*) ;
1/. · ·
protected:
CodeGenerator(BytecodeStream&);
protGcr.ed:
Byt codcStream& _output;
} ;
A CodeGeneraLor olyan a.loszlályokkal rendelkezik, 111int a StacJ<MachineCode-
Generator (\TeremGé)K()(iElé5állíté)) vagy a RISCCodeGenerator (RISCKódElőállító)
al11elyel( l(ülönböző llardver-arcllitel{túr£k sLámára állít-inal( elő gélJi kódc)l.
A ProgramNode valJJnennyi alosztálY3 l11egvalósítja. 3 Irraverse lnűvclctct, llogy n1Lg
llívja aLt gyertneko1Jjekt Ul11ail a. A gyermekobj eklllITIC)J( azu tá n lj gya n így lneghívják a rn.ű-
veletet saját gyerlllekeikre, és így továbl). A7 Expres si onNod_e példátll a !{övc:tkcző!(ép-
pen llatározza meg a Traverse műveletet:
void ExpressionNode::Traverse (CodeGenerator& eg) {
cg.Visit(this);
Listlterator<PrograrnNode*> i(_children) i
fo r (i. F i rs t (); ! i . 1 sDone (); i. Next=- ( )) {
i.Currentltem()->Traverse(cg) ;
}
}
Az ccldjg tárg)ralt osztályok építik fel a fordítói 3.lrcnclsLcft. Most l)evezetlink egy Compiler
(l';ord.ító) ne\lŰ ll()mlokzarosztályt, £lmely ()sszefc}gja a rend.s7er részeit. A Compj 1 er eg):r-
szerű felületet biztosít 3. forrás lefordításá.ra., és az a.dott gépfelépílésnek megfelclő k{)ci elő-
'"' ll " /
altasara.
194 4. fejezet · Szerkezet minták
class Compiler {
public:
COmfJller ( ) ;
virtual voId Compile(istream&/ BytecodeSr.ream&);
} ;
void Compiler: :Compile (
islrcam& input, BylecodeStreGm& output
) {
Scanner scan.IlOT (ill.PUt) ;
PrograDNode8uilder builderj
Parf',er parser;
parscr.Parse(scanner, buildeI);
RT SC Code Ger lG ra tor gonerat:,or (ou tp uL) ;
ProgramNodc* parseTree = b1J il der .. GetRootNode ( ) ;
parseTree->rrrav'ersG (qenerr1tor) i
}
Ez a megvalósítás lJlCrCVen bekódolja a használandó kód-előáJlftó típusát, így a programo-
zóknak nenl kell megadniuk a cél-architektúrát. Ez a Inegokiás akkor ésszerű, ha csak
egyetlen célgéptílJUS lclletséges. Ha ViSZOllt nem ez 3. llclyzet, a Cornpi 1 er k()nstJlJ]{torát
Úgy kell megváltozlalnunk) hogy egy Code GeneraL or paralnétere legyen, így a pro gr 2-
mozÓk a Camp i 1 er példányosításakor rneghatározhatják a használandó kód-elő:íllítÓL
A fordító homlokzata m.ás résztvevőket is paraméwrré tehet) például a Scanner-t és
3 J?rogramNodeBuilder-t, amj l1Ö\leli a 11Jgalmasságot, ue eltávolodik az crcci.eti céltól,
ami á 1 talá.1)l n a fel (il el e g')7S zerűsÍ lé se .
Ismert felh szn 'las
\.
A !)élcia kód részlJen s/ereplő foru.íl() a z Obje(lTorl(s \ Sma] 1tall( fCJrdítórcn(Jszerén [1)ar9()1
llapuJ t.
Az ET++ alkalmaLéÍs-keretrcnds7erbcn lWGM88] az alkalm1.zások beépített böngész{)vcl
vizsgálhatják objektumaikat futás közben. Ezek a bÖngészők önálló alrendszerekben kap-
nak helyet, ami egy "ProgrammingEnvironment" (programozási kÖrnyezet) nevű homlok-
7atosztályt tartalmaz. [z a homlokzat ct bÖngészők elérésére szolg:áJó műveleteket (például
II1spect()L)jcct 11spectC]ass) ]1;].tározz1 tlleg.
Az ET++ alkalma7.:1sok "hamisíthatják" is a beépített böngészőtámogatásl. lyen esetben
a ProgrammingEnvironmcnl a kérelmeket null-mlíveletekként valósítja meg t vagyis azok
nem cinálnak semmíl. Csak az ETProgranuningFnvironment alosztály ad olyan megvaIÓ.sí-
.
,
Homlokzat 195
tá.st a kérclnlel(11ez a.mely 111eg]latározza a l11egfelelé) llC)ngészé51(ct lncgjc!<.;nítő 111Ű\/clctckct.
Az llkllmILásnak nincs tLl(lol11ása arról, 110gy jelen vane egjr elcr]1eté5 l)()ngés7()kc)rl1ye7et,
\T8.gyis az 311(al111az3.s és a. 1Jöngésző a.lrenc szer l{özött elv'ont cS3.tülá.s áll fenn.
A (]1oices operáciéJs reJlc.is7er re: RM931 arrl }laS7I1á] IlOI111okzatokat, ]l.ogy töblJ ]{eretrend
szert cg)Icsítscn A C110iccs 1<111csfoga.lm.8.i ;1.. folyal11at (process), a tár()lá.s (st()rige) és t cím
tér (ad.ciress splce). Mi.ncJ.egyil{l1ez tartcJzik ebty l<eretrel1clszerként megvalósÍtott a]reI1ds7er,
a rn.ely tán10gatja a (]1.()ices kil]Öl1.böző llard,rerfelületc]{re tÖl1énő 5.tülrctését. Az llrLn(lszc-
rcl( közlil kcttőnll( VílO "l(épvisclőjc n C\r;lg)Iis 110111Io1<Lata); czcl( nc\'c IilcSystcmlr1lcrface
(FájlRcndszerFe iilet, t3rolás) illetve L)oll1ai.n CTa.rtoll18.ny, cí111terc]<).
Process
Domain
Add(Memory, Address)
Remove(Memory)
Protect(Memory, Protection)
RepairFault{)
o-° ............................... "." 1. .............................................. 1-.."'. ..................................................:.
..: ...1 :.1." . II:. : 1. :.:
. .1"1:: r---. ::. ..I:: l.... :-.... f.1 .. ._:: :... ..I:t} :.::.: .;:.. ..: ;;:.:.I..h:::.: .:::1;..".1:':':: .:I:: :. :::. .'=':I:.. .1.::.1f"!
. :. .- ...... ...... II . ". - ........ II. _.,; L J'......, .. -. ...iI.1 -.... ."... .... II ... .... .. .....I...J
.. ..,. I ...:
.'
.1_1..1 .. .:.....L .:'-1.. ... ........ ... .r... ......... .. .......... .......................... ........................ .................................... ..............................
.'
.'
:.:
..
.'
..
Address Translation
MemoryObject
F ndMemory(Address)
BuiidCacheO
MemoryObjectCache
..
..
:.:
."
T wolevelPage T able
Pe rs istentS to re
.
PagedMemoryObjectCache
:;
I
ile
Disk
,.
1.:
.:
."
::
.. ..... .... ........1......................-.................. ....1.... ............... ........,.0.-;;.
..,
..""';;..1. ..... .. ...................................................................... ... ..
1-. -1. .:. 1. .. .1... .. .. ...................................... .................. ...
A \lirtuális melll()ril keretrencjszernek IJéldáll1 l D()mlin (rrlrt()má]lY) a }-1()]111()kzata. A lar-
tOlllányok egj,r-egy címteret 1(éI1\riselnek, és a \riltllális cíll1ek és eltolásol( melnórilobjektu
Il1()k:ra vagy fájl()l-cra 'való leképeLLsét biztosítjál<. A Oc)main ff) mű\re]elei arrl sz()]gálnak,
]10gy egy meI11ória-o'bje]{tumot el11el)lezzünJ egy adott cíl11en eltávolítSl11k egy ilye 1 ob-
jektllffiot, illetve kezeljlinl( eg)' lapllilJát.
A111inl a fenti diagral11 is 111ut3.tja., a virtllá.lis l11emória a.lrcndszcf bll11 ct küvctl(zű ÖSSZLtL-
vé51,lJé51 á]]:
· Memor}lOlJject (MCl"11Ória01Jjcktul11, egy a(l.a.tl{Lrll képvisel);
· Mcm.of)T()l)ject(ach.e (MeJl1.C)r1.3.()1Jjektl1111Tá.r, 3. ill.C1TIÓria-o}JjcktUl110k adat.ait á.t111C-
nctileg l fizil<ai mcm()riálJ3.n tárolja; valójál)an egy stratégilJ inlel}r az átmeneti tárc)-
lás ln.óclját zlrJd. egység11e);
· A(J.(I.ressJ"11ranslili()n (Címr()ruítás, l (ímf()r(lÍt{) 11artivert zárja eg)lséglle).
1 96 4 fejezet · Szerkezeti minták
A.mikur eb:ry ]aIJlliba lniatt.i nlegsz3.l{ítás kÖ\Tet]<ezi]( be, a RelJairFault Qa.vítl-f°ba) ]nűvelt llÍ-
\róclik meg+ A Donlain 111egl(c "csi a 11ibát o](OZÓ címen levő Jne 11Ória-()l1jel{tu1110t, és lZ al1-
1102 "(-ndelt átlneneti tárra 11"'zza a l{epairFlult végre11Jjtását. A tarto l1ánycJk összetevőik
n1C gYá 1 t () zta tásá val testreszab l1atók.
Kapcso ódó mint r
A J-Io1111okzat mintával cgYlilt 11asználl13.tó lZ ElvOJ1t Gyár, ig)T felületet biztosítllatunJ{ az al-
rendszeri objektumok alre ldszcrtől független létrehozására. Az Elvont Gyár a endszerfÜg-
gő oSltály{)k eJrejtésébLn is ll.elyettesítllcti a T T01J1.lo1(zat mintát.
A KÖ7\Tetító miIlla ano)7jlJél.n llasc)nlít a Humlokzatra, J10g)T szintén meglevő osztályol< szol-
gáltatásait von.atkoztatja el A KöZ\retÍlő célja azonban a társobjcl(tllmc)l( kapcsolatldftásá-
nak elvonttá tétele, gyakran az olyan szolgáltatások központosításával, amc1yek egyik ob-
Jektumho? sem tartoznak. A közvetítő kollégái ismerik a közvetítót, és az egymás közÖtti
kÖzvetlen kommunikáció helyett vele társalognak. A h0l111okL31 eZ7.e] szemben csupán e]-
vonttá teszi a7 alrendszeri objektll1110k fclLiletét, 110gy megkcjnnyítse használltukat; (lj szol-
gáltatások.at nelll llatároz )J1.eg, 3.L d.lre]ldszeri osztálycJI< pedig nem tlldnak róla.
Általában csak egyetlen homlokzatobjektumra van szÜkség, így a homlok?atok gyakran
Egykék.
.. -1 s
S7er _(ezeti objeklllDl111i11ta
gyéb nev
rlyweigl1t, Könnyűsú]yú
Cel
fvIcgosztás révén tám()gat li a n;lgy finorTI.s3.gú objektlltTIok tön1egei]lek llatél(on1 T feJ-
Ilasználását.
Feladat
Egyes alkalmazások nyerhetnek azon, ha mindenre külön objektumol használnak, de egy
naiv meg\Ta.lósítás igen l\:öltséges le}let.
A legtöl1b dokumentum vagy s7()vegszerkcszt(S például biz()nycJs fokig m()Ciu]lriz-:Jt SZ()-
vegformázó és -sze -kesztő képességekkel rendelkezik. Az objektumközpontÚ szö\lcgszer-
Pehelysúlyú 97
l{CSL.től{ j<.:llcmzócn objcklllmokkal ábrázolják a7 (Jlyan 11eágyazott elcll1c {ct, ln+nt a táblá-
zalc)k és á11rák. A ci.cJ](Umentllill egyes lzara <te -eit azonban lnár nCl11 önálló ()l"Jjektu]110k
képviselil{, 111ég 113 CL a program legfinoil1abb szintjén is je]ente Ie rugallnaSS2.got Ha így
lennc, a karakt.ereket és t)egya7()ll elel11eket egységesen 1(ezelI1ctn6nl<., kirajzolási és f()f-
lnázási módjuktói fiiggően. A progra111 anélkül lenne bővít11eléS új l<ara1(lerkészlete ( tálll0-
gatás3va.l l10gy a tüblJi szolgáltatásra LZ llatássallenne. Az 11]{alm_azás objel{tll nszcrkcL.ctc
J)ontosan tü krözlletné a d.okllnlenturn "fjZj)(3.i u szerkczetét. Az éllálJlJi (Jiagr:]m azt mutatja,
J10g)Tan jclölllct ka.raktcrckct objckturTIokkal egy szövegszerkesztc):
......LI.....r..1 ........ ...........: .......
.. ". :LII: ....,... ... ......... I.. ........ I ...-:- ..:.1....... h.l 1_.
..... I ¥h r ......."..'1..,1:.: .1.1 ......." .... :-r l -..:;, "1-':1 ..,......
"...... -::(1. 011....."'....- ........." 1... i IL ._-.:..!. ...... .1._ Lt...."
.... ...... .1 ......r.......... .1 ......h "...... II" IL ..
..... I l' "hl.. 1.... .".I."L":';.. "
" II..,,....,, .1. .... ,.p.. I ... - ..'....:1 .11. L,n. :... ...JI..... ...-
.:.I.........L ... .".:,h. .............I ....... ..L......II "11-".: ......lt-.I...
.1. ..1 II" .1 _...... ",......
:.......... I Io" IM. "". .)-:-. .1 ..I"IL 1'1 " LUI r. ....... I,,¥.I .-.. ....
h,. ...1 .....I,. ........ "I.:. ..-c..... - ..-.,_. .ti"..I
.1 .--." ..:: 1:" " 1._1........... ..... ............L..'.I ,.... "ri"". 1.. ..1:.......-
:"rf"I .L..... .1 ....u-.., ..1..... .(v............ .1 ol ..;-.....:II.....". 1. .... 1..1. i 1.1,Ir-.:
".".." ..... ................ il..;.... .1. ..-.....:.. .......":. JI..ll.... ....,.. ...........
.!r. II....'L. \""'L. .. .: . ........)0",.",. .....,.. .......-..:.. ....
-1 IL ......... I........! L'....:. "I.LI. .L '-. .......... . -
....L...... . r......I....'I...... i ".1" . .. .......... ... ............. ..,.....
.....
karakter
objektum k
... appa.re:nt...
sor
objektumok
.
.
.
hasáb
objektumok
A l11ódszer hátlllütője 3. lnagas költség. Még a szerényelJl) nléretű dc)1<uJne.otumok is 1{3.ra.k-
tcr objektumok százezreil igényelnék, lrni re]1geteg metl1Óriát emésztene [el a flltá.si sebes-
ség pedig elfogadllatatlan szintre csökkenne. A !J e I-lelysúlyú rTI.iJlta aZ011ba.11 111eglIlutatja,
llogyran ()Szttlltllnk meg (Jt)jekturnc}kat fin()mall1J szinten való 11lsZl1álatra anélkül 11()gy
a költségek az egel{be szökné 1ek.
A pehelysúlyú obje]{l1Jlll o _yaJ1 megosztott ol)jekturn t arncly cg)ii<.lejűleg tc)bl) k()f11ye7et11en
llaszná.ll1ató. Min(lebik körn)'ezetlJen önáll() ()lJjektLlrnl{ént viselkedi1<., vagyis nem különböz-
letlleté5 meg egy nen1 megosztott objektl1r111)éldányától és nerTI élllet feltételezésekkel f11Űkö-
dési l<.örnyezetéről. A mil1Gl kulcsa a belsö és külső állll)Ol(in{-c)rmációl{) n1egkülönböztetése.
A l)clső állapC)l a pellel'}lsúlyú ()l-)jel(lUmban tár()lód.1k, és olya!1 információl(}Jól áll im.elyek
függetleI1ek a pellelysúJy(l ohjeknlffi ]{örI1yezetétől, így mcgosztI-llté)I{. A l(lllsé5 állaJ)ot ezzel
szemben a l<örnyezcttől fliggőcn \!51tozik, ezért megc)sztása nem lelletséges. Az ijgyfélo1Jjcktu-
mc)k fela(lala 110gy }<:üls{5 álla.palot adja.nak át a pc11clyslllYÚ objektllll1nak, amjkC)f a7 igényli.
A pel1e]ysúlyíl o11jektll]]1.o1{ olyall. fogall11aka.t V3.g)l cgycdel(Lt mo(lelleznek, lJllelyel( SZál113
nOfl11ális esetben túl nagy ílll110Z t 110gy objcl<:tunl()kl<:al {1l-Jráz()1]1até)k legyen.ek. Egy szöveg-
szerkesztőben például a7 ál-Jécé minc1.en 11et(íjéllez létrehozllatunJ.r egy-egy pc11clyslrlyti ()b-
19a 4. fejezet · Szerkezeti minták
jeklumot. Ezek csak egy karakte -kódoL tárolnak; a doku111cnlumban elfoglalt helyet és
a betűstílusl a szöveg-elrendező algoritmusok és a karakter megjele 1és' helyén érvényben
levő fo lnázási parancsok alapján határoz7uk meg. Akarakterkód bels6 állapolinform.áció,
mfg a többi in[orJ11áció külső+
Logika'lag d dokulTIenlum egy adott karakterének minden előfordulásához létezik egy
objektum:
,
,
FiLikailag azonban karaklerenként CbY megosztott pehelysúlyú objektummal rendelke-
zünk, amely különböző környezetekben jelenik meg a dokumentumszcrke7etben. Egy
adott karakter objektum valamennyi előfordulása ugyanarra a pék ányra hivatkozik a pe-
11eJyslr]yrlI ol)jel<tlln10k lnegosztott gyűjtőtárában:
....... .....-...
\ f
'L \. ("
I \
.1 ,
" ...
..t
..'
-1..1-- .
\. .., ,/' ........ .'L.... \
\1' \: '.
.:\ \ I '" . l .:". .
. '. .'. \ " ,
.' t i!: J ." I
J \ .t i. ' .
." \ ;1 ".
.1 \ .i:.... ."
"I_.......I..I .." .., ..1
· :. d
. O
..
." .....
.\i/ J ' k. 1 ro
} .
..1.. 1-..
. ....... .!.. . . .--
;. o
a I 1 ·
U. " V : W X
pehelysú yú kés et
Pehelysúlyú 199
A fenti objektumok osztilyszerkezetét a következő ábrán mutatjuk be. A\:épjel (Glyph)
a grafikus objektumok elvont osztálya, amelyek közÜl néhány pehelysúlyÚ lehet; a kÜlső álla-
poton alapulÓ művcIetek pararnétcrként kapják meg. A {ajzol (Draw) és a Metszi (Intersccts)
művcIeteknek például tudniuk kell: milyen kÖrnyezetben van a képjel, midőll elvégczhetnék
mlJ n]<áju]<3 t.
(
w e
.. - KépjeJ 1-
-- - 1- ......
Rajzof(Köm yezet}
Metszj(Pont Környezet)
1\
I I
<> Sor Karakter Hasáb
rrnekek (Wenne
RaJzo I (Környezet) Rajzol(Kömyezet) Rajzol(Kömyez t)
Metszi(Pont, Környezet) Metszi(Pont, Környezet) Metszi(Pont, Környezet)
char c
kek
Az "a:' belűt képvisdé5 pehelysÚlyú obje \..tum csak ct megfelelő karakterkódot tárolja, a he-
lyet vagy a betCítípust nem. A7 objektum kir:ljzolásához szükséges környe7etfüggő inform.á-
ciÓkat az ügyfelek adják át. Egy Sor (Row) képjel például tudja, hogy gyermekeinek hol
kell kirajzolniuk magukat, hogy egy sorban helyczkedjenck el, így a rajLolási kérdemben
átadl13.tja ne](iJ( 1 llclyüket+
Mi'vel a különl)()7é5 l<arakler o11jektllmok SZá1113 j(}\7aI kiscl)lJ, rniI1t a ci()1(11111cnttlmlJal1 lc\tŐ
,
karaktereké, lényegesen kevesebb objektull1unk lesz, mint amennyit egy na1V lncgvalÓsí-
tában 11asználnán](. Egy' cgyet]en lJctűtipussa.l és szíotlel írt d.c)kll.1JlenlUm l 00 1(3.rll<ter ob-
jektum sorrendje alapján előállíthatÓ (ez durván az ASCII karakterkészlet mérete), [Üggetle-
nCil l cJC)kUl11cntunl ]losszáté)l, és lnlvcl a ]egtijLlb (i.c)kulI1CnLuJll neI11 llls7n.áJ t.íznél tÖ}Jb
,...,
betíítípus-szín kombinációt, az emIített .:.zám a gyakorlatban nem n6 jclcnt{5sen. Igy válik
a.L objel<tu tIl tla l(J !11egl(özelítés önáll(J kar3]{tcrel< eseté}Jcn is 11lSZt1o.síl]-1atÓ\T3..
Ar. almazhatóság
A pchelysúlyÚ minta hatékonysága nagyban fÜgg attÓl, hol és hogyan has7.náljuk. Csak ak-
kC)f aLI(allnlzzul< h.3. aL alál-)lli állításol\: lnirlde L ({))ike iga.2:
· A_2 a.ll(all11lZás n{gy SZáJl1.Ú objeklllJll.0t lllsznál+
· Az ()lljel<tllmok nlg)l 5zállla miatt rllélgas :1 tá.rköltség+
· A ]egtöt)}J ()bje]{tum-tulajcionság Cá.1laJ10t) 1\.Lilsé5vé tellclő.
· A kü\s6 állapot eltávolítása után objektumok egész csoportjai hdyeltesíthctők vi-
s/:ony13.g kevés mcgosZl()tt objcktLln1rn8.l.
· AL alkaln1azls nem az objektumok azonosságán alapul. Miután a pehelysúlyú objek-
tumok megoszthatók, egy azonosság\ izsgálat fogalmilag külÖnbÖ7ő objektumok.
esetél)en is niga.L' ered.Jl1é11 }'l adJ 1-lt+
200 4 fejezet · Szerkezeti minták
Serkezet
helysúlyúGyár
pehelyslJ [yúa k
<>
__ .J
PehelysulYÚ
- ........
Sze 6zPeh alys úlyú( kulcs) )'
I
I
I
Múvelet(küfs6Allapof)
J"
if (pehelysúyú[kulcsllétB2ik {
retum létez6 pehelysú.lyú;
} e se {
létrehoz (jj pehelysólyú.:
hozzáad to p ehe fysólvú tár;
retu m új pe helysú Ivó;
}
1\
...
-
--..
KonkrétPehelysúlyú
\
;;. NemMegosztottKonkrétPehelysúlyú
Múvelet(kül s6Átl ap ot)
be[s6ÁJlapot
Múve1et(kü1sóÁllapot)
m indenÁUa pot
Ügyfé[
A követl(ező oujcktllITI()iagram a pe11el)rsúlYÚ o1Jjektunl()k nlegosztás3.n3.k módját nl utat ja:
..
egy U gyfel
egyÜgyfé
egyPehelysúlyúGyár
.:............................................................................................................L.......... ..... ...............- .....................L..... ..,...L.I......... .,.... ..............................L-'I....I..........L-'I ..""...."...........,,....,,............,, ..:................... ....: ..:...............:............:...:............:...:...... ............. :.-il............ ....,....,....,...........
1
:: ". ......" .
". ,...., '.'" '="'i: ,,-'. 't' '.' '.... J.... " . , .,
.. .r . .,'.\ ,. jj" .. J ., . " ... ';: \' \.
: ,r.'o.... 'o . ; J -...... r ., tj" .L"'... l 'i., .
: .... J.'
:. it ..;';' . .',' i',): ..if: .\'
.: .1. \ -:.-.... ...........: \..... :.:
egyKankrétPehe Iysútyú egyKonkrétPehelysíílyú
.
peh€ysúlyúak
belsaÁllapot
1'/ '"
belsoAlIapot
,.
\.
\:
'"
L'
:
L'
.
1
.
,\'
".
.
i:
...................:................. .......... ... .:...:... ..:...... ............ .......... ..: ...... .... ...... ...... .... .-. . .-:.: .=--:...,. ."-:..-: .. .... .. 1.'.... ..... .. -:...... ......... ......1............"....-....."..............................r................ ... .... ..... ... .. ... ... .... ......:...........-...........:.
Pehelysúlyú 201
R sztvevok
· Pehelysúlyú (Képjel)
- Felületet vezet bc, amclyen keresztül a pe11elysúl)'lÍ olJjcktum()k kills{5 á]lapotin-
fOfl11ációkat [ogaclllatnak, és lZO]{ alapján l11Űvclctckct vége711etnek+
Ko n krétPeh e Iys ú Iyú (Karakter)
- Megvalósítja a Pe11clysúlYÚ CFlyweigllt) felületet és t3.rat biztosít i7 esetleges l1eJső
álll r)otinf ormácié)k s7ámára.. A_ I(onkrétlJellelysú lyú (C oncreteFlywcigllt) olJjektu-
l11ol<oa}( Jl1.egosztllatúkna!{ kell lenniük, a benn.ük tárolt állapotnak IJe(lig 11elsőne]{
l{elllennie, vagy is függetlennek a KonkrétPellelysúlYll objektum kc)rn.yezetétől.
NemMegosztottKonkrétPehelysúlyú (50[1 I-fasálJ)
- Nem 11+nden Pe lclysúl}lú alc)s7táJynalc ](ell megosztllatónak lennie. A Pellelysll-
lyú felület csa]{ IcJetől)é teszi a megoszlást, nem ké]l)TSzerít rá. A NcmMegosz-
tottKonkrétPellclysúl ytl CU ns11ared.C()ncreteFlyweigllt) objektu moJ< (a]10gy a Sor
és Hasál) - Rc)w, Column osztályok is) bryakran rendcll<eznck Konkrét-
IJe]Jelysúlyll gye .mckobjektumcJI<l<al a l)ellelysúlyú objektumszerl<ezet \TaIamely
+ . ,
SZlnt)Cn.
Pehelysú[yúGyár
- J)ellclysúlyú objektumokat 1102 létre és kezel.
- Gc)ncicJsI<ot11k a pehelysúlYÚ objektumok megfelelő megosztásáról. AI11il{C)f egyl
üg)lfél pehelysúlyú objektumcJt kér, 2 Pel1elysúlyúG-yár (Flyvveig]ltFactory) átad
egy meglevő pélclányt, V3.gy létrelloz ehT)'et, lla még egy sem létezik.
..
· Ugyfél
- Hivalküzásllart feJ1D egy vagy tölJb pchclYSlll}Ill ()lljektumra.
- Kis7ámítja vagy tárolja 3. pcllclysúlyú ()lJjektllm(ol() kiilső álla!Jotát.
gy'.ttmukö es
· A J)ehelysll]yú obJe]{tumolc álld.! igényelt állapotinformációk belsők va b 7 kü]ső]{ le-
J1etnel<. A belső állapotc)t a Kc)nkrétPeh.elysúlyú objektum tárc)]ja t a l{ülső álla.pot t1-
[olásáról, illetve ]{iszámításáról a.z Ügyfél (Client) o11jeJ{tllJTIok gonti(Jsk()clnak.
Az iigyfelek akkor aclják át a k(ilsé5 á]]a!)otot a pe11clysúlyú ()l1je]{tUtl1na.k, a.n1il(or
rllcgllÍ\ljáh. annlk m(íveleteit.
· Az ügyfeleknek ncrTI szabad. k()7vetlenűJ IJéldányosítanitll( a Kc)nkrétlJe]lelysúlYÚ
ol)j<:l(tumokat. Kizár()!ag a ]J e l1.elysúlyúGyár objektumtói s7erezlletik be dz()kat,
110 b Y)T megos7tásuk Jl1egfelelő legyen.
Köve e me y k
A pellclysúlyú ()bjektumc)k a kl11ső állapotinformácié)k átviteJe, Dlegkercsésc, illetve }{is£á-
mítása n1iatt lassíthatjál{ a. program flJtását, külc)nösen ]la a l(ülső állapot kc)rá11han l1e]ső ál-
la.potl\:ént tárolód.c}lt. Ezt a köJtséget azonban cllcnslilyozza a tárJleIY-JJJ.egtal(3.rítá.s, ami egy-
re nagyol1l1 lesz, al10gy több pellelysúlyú objektun10t OSZtUl1k l11eg.
202 41 fejezet · Szerkezeti minták
A tárj le 1)!-rl1egtal(arítás l()111J tén)T<:Lőtől f(igg:
· l J)éJd.án)lol( SzáIl1ána]{ a ln.cgosLtás11()1 ]<övetkező c')()](]<enésétól,
· a ot)jcktumc)nkénti 11clső álllp()tin.forl11ációl( menJlyiségét(51, villInint
· attéJ], }-log)r a l{ü!ső álldJ)()tot 1(.iszárllÍtjuk vag)! tároljlll(.
Minél több pehelysÚlyii objektumot osztunk meg, annál több helyet takarítunk JTI.eg, és
a l11egtlkarftls 3 mcg()S7tC)tt állapotinforJ11áci{)k tJlcnnyiségénel{ 11.Övclésével tOl3.l)b növel-
ilete). A. ]egtöL)lJet akl{or nycrllnk lla 17 ()1)je1(tLll110k jele]ltős rn.cnn}riség(í 11cls(j és klilső ál-
lap()tinfoflTI3ciÓl ll.tsznáhla]( fel, a kü!s(S áIJapotot pcJig szánlftjuk, és nCIll lároJjuk. A sZli]{-
séges tárJlcly így két 111óc:l(Jn csökken: l 111egosztás a 11e]ső 3.lla.plJt tárolási költségét cs()]{-
kCl1ti míg l ]{Llls() .lla11()lél Belcseré!jlllt" a kiszáJl1ításá.ll(JZ szükséges id(5rc.
A PehelysÚlyú míntát gyakran együtt használják az Összetétel mintával, hogyegy hierarchi-
kus szerkezetet eh'Y olyan gráffal ábrázoljanak, amelynek megoszlott levél-csomÓpontjai
v(] nna.l(. A nlegoszt.ás eg)ri k követl(eZl11l=I1ye ll()gy a. I)cllClyslllyú levé] -cs()mé)pon.tol{ nem
tár()l]lat]la]{ m.llt.at()l s7ülé5jl11<f<:; licly.ette a lciilső álla.pot rés7eJ<éllt kaI)jálc meg a. sZlil(5IllUt1-
tál, alIli lényegesen bcf()ly.ás()lja J 110gy a llierircJlia objel(tun1ai ]10gya.n komml1n i]<:1.lnal<
cg)'nlással.
lVIegva ásítás
A l)cllelys(]IYÚ minta. I11egvaléJsítása során l kc}vetl(ezőkre l{el] figyelnlink:
1. 11 kl;;.l,-){J (illajjOl ellálJolíttlsa. A tninta 1]kllI11azlla.tóágál nag)T részben az ]latározza
1neg, 111eIln')Tire egyszerű a )<üIs{S á.ll;:LpotinJofJl1ációl( aLon()sítása és cltáv()]ításl
a 111Cg()S7tC)tt olJjcklllmc)kl)é)]. A. külső álla PC)l eltávolítása Ll bryTa njs l1cm segít a tá rl<ölt-
ség csö](kentéséI1en, 11;1 llgyanol)lan sokféle küls{) álla putinfc)rnlác1ó létezi}.\:, !11í11t
objektum (a megosztás el6tt). Ideális esetben a külső állapot egy önálló objekturn-
szerJ{e etből SZáll1Ír]lató l,i, 3.l11ell]lek JÓ\TaJ kiselJl) a tárjgénye
SZÖ\7cg's7erl<esztőnkl)ell Jlé1diu] a tiI)()gráfiai inforI11áti()k ::térJ{épét l<-lilc)n szer]{c-
zetllen t{i.rolllatjlll(, a11el)lett, 110gy a l)elűtípust c:s -lílL]st tárolnánl( rninu.e]l egyes l(a-
ral,--ter (Jl)jektl1111110Z. A )tér]{ép" l1yol110n kc:rveti a7 .zonos til)()gráfiai jLllemz()].;:]{el írt
karaktereket; amikor egy karakter kirajlolj3 önmagát, ezeket a jcllernz6ket a rajzolá-
si l)cjáris Ille]]é]{]latás3.kénl" i{lpja In.eg. Mivel l (lo]{l1nlCnll1111()I{ álta]ában (slk né-
lIán}! lJetűtípust és -stílust ]laszn.á.lnak, elen i11f()rm.(j{)k külsej tá.lolásl az egyes l(a-
rakter objel\llIITI()k SZálJlá.ra j()\lallldtéJ<.onY3.b1J, minl l l)első tár()lás.
2. A 11Jc:gO""'Ztutt ob)" e ktl-ll110k kezelé...\-c. Mivel az ()11jektllmol(3t megos7tjuJ, {Z iigyrfelek-
nek nem sLabad kÖzvetlenül pddányositaniuk azokat. Egy adott pehelysúlyú objek-
tl.1111 l11egkeresését a !Jellelysl11'yúG'yár les?:i IcllClő\!é 17 iig)lfc!ek s7áJJl.ára.
A IJeJlelyslllyr(lG)Tár ()lJjelctlLll101<: g)ral<rall. eg}T társltásc)s tá.rat (assZ()Ciltív tá.r'il) l13SZ-
nálnal<:, 1-}()h1 l az üg)lfelek nlegkercsllcsséJ.c a SZáll1u](ra érclekes pellelyslllyll objel{tu-
Pehelysúlyú 203
m.l1kat. A szövegszer]<esztő pellclysúlyú()IJjektll ]11-glárl pélc13ll1 egy ka r3.kt erk(J <..1 ok -
kal incJexelt tál)lázltot tarlllat fcnn, a Ille I)l11 (11 3. kezel() a k()(J a]apján v"issza.3.(l.jt l n1eg-
fe]elő pellclysúlYlr ()11jel{lumot J létrcllozva lzt, lla még n.er11 létezik.
A 111cgosztI-lal()ság nlaga után von \lalaIlliféle 1.l.jvat]{ozás-számlálást vagy sZLrnétg)TCíj-
lésl is: llogy felszabatlítllassll]< a pe11elyslllyú ol)jektumok 3.lta.l clfogllll tárltJ a111íkor
rllaf nincs rájllk s7Ll]{ség. Mindazonáltal ehYfil<re sin.cs szül(ség, }-la i pellel)TslllYÚ olJjel<-
lUlTIC)k s7áJl1a kicsi és rögzítell (ilyenek példá.ul az ASCII ]<araktcrl(szlcl }.Je]-le]y"Fsú]yii
obJektu111ai) - il)renkc)f érdetnes az ubjcklUm()kat Jl1jndig a l<czünl{ ü h ryél1en. tartani.
'Idakód
}-Iérjün]{ \Tissza 3. dokumenluIllfc)rrnázó példállUZ, a n1e I-yr11 en. rnost Cg)l G lyph (J<é}1jel) nC\l(i
3131)Oszt5J)lt llalározlln]{ llleg ;.1 pellelysúIyú grafil<llS olJjel<tuT110k számára L()gil(lj]ag
a képjelek összetétckk (lásd a?: Összetétel nlintát), amelyeknek grafikai jellemz6ik vannak,
és képesek kirajz(}lni önl11agukat. Mi 111()St cSlk 3 }Jctűtí}JUS jelJemz(5re öSSzI Jont ()sítunk, (ie
1Jgyane7 a nlegl<özelítés alkalma711ltó bár111el)T más grlfik{j jeJle111zőrc, amelJ)reJ egyr képjel
ren.clelkezllct.
el ass Glypll {
pu.blic:
virtu.a 1 Gl yph. ( ) ;
virtual VO] d Drdw {Window* / GJ yprlContext&) ;
virt:'11a 1 vo i d Sct"ont (FOll.t. * / GJ yphContext&) ;
virt--:'llFJ 1 Porlt * Get.Font (GlyphContcxt&) ;
vírlu.d 1 vaj d First (GlyphContcxt&) ;
virtudl void Next (GlypnContcxt&) ;
virtJufJ 1 baal lslJol1.e (GlyphCOfltcxt&) ;
vjrtual Glyph* Currenc(GlyphContext&);
virtual void Insert (Glyph*, GlyphConlexl&};
virtuLtl void 1emove(Glypl1Corltcxt&);
prot(ctcd :
G 1 VTJh ( ) ;
} i
A Character (Karakter) al()sztál')T csal<- egy lcarakter]<ódot tárul:
eJ ass Cllaracter : publ le Clyph {
public:
Character (ch.a L) ;
204 4. fejezet S z erkezeti minták
virtual vo.d Draw(Window*, GlyphContext&);
private:
cllar cn.arcodo;
} ;
AlII1UZ, l1()GY elkeriill1cssük, 110gy 111.inden egyes l{épjel betlftípl1S jellemzőjének Jle]yet fog
IaJjunk, a jellemzőt külsőleg, eID' GlyphConLext CKépjelKö "nyezet) objektu 11ban tiroljllk.
A GlyphContext a ]<ülső állapotinfcJrnlációk raktá.rlként műkc)di]{. Tömören e&rymás]10z
rentleli a képjelel{et és bctűtípusukat (illet\Te bármilyen más elletséges g'rafikai jellemzőjü
ket) a kiilcjnr)()7ő körn.)lezeteklJcn. Minden fl1lívelet, amelynek s7iiJ<sége van arra, Il()gy is-
111crje a képje] betűtípllsát eb'Y aelott környezetben J lJaraméterként egy GlyphContext
pélctán.yt l(a.p, amelytől elkéri a. 1<örnyczct)JeI1 érvényes betűtípust. A kc)rnyezet llcépjelnek
a képjelszerJ(ezetl)en elfoglalt 11elyét{51 függ, ezért a Glyph gyerl11el(bcjáró és -kezelő mű
veleteinel{ min(len tlas7nálat lltán frissíteniük kell a GlyphConLexL-et
class GlyphContext {
public:
GlyphContext();
virtual G yphContcxt();
virtual void NGxt(int step = 1);
virtual void Tnsert(int quantlty - 1);
virtual Font* CotFont();
virtual void SctFont(Font*, Int span 1);
private:
int Lndex;
BTree* _fonts;
} i
A GJ yphContexL-nel< Illlndig tuclnia kell, 11()] jár a képjclszcrkezet11en. A110gy a bejárás
llalad, a GlyphContexL: :Next ncjveli az _index-et. A GlypJl gycrmekekl<eJ. ren.dclke Ő
aIc)s7tályai (pél(]lul a Row vagy a Col umn) (lb7 kell, 110gy mcg\ralósítsáJ( a Next (l(övetl<e-
ző) műveletet, ]lOgy az a 1Jejárás mincien l10ntján megllÍvja a G lyph Con L ext : : Next et+
A GJ yphConLext : : GetFont C-(épjeIKörnyezet:SzerczBelűtíI1l1s) az indexel egy BTree
(B-ra) s7erkezet kulcsaként használja, an1ely a képjel-betlítípus hozzárendeléseket tárolja.
A fa ]llindcn csoméJpontját 3.nn.al{ a karakterláncnak a l10ssza cí.m]{ézi amelyllcz lZ acic)tt
csomól)ont tJet(jtípus-információt ad. A fa levelei egy-egy l)etűtípusra lnutatnak, míg 3 bcl-
SC) CSOlTIóponrok rés7]án.cokra tördelik a kara]<lerláncokat. Minden gyer ncl{llcz egy-egy
részlánc tartcJ7ik.
Pehelysúlyu 205
Vegyük az aláblJi részletet eg)l képjel-()sszetéte]lJől:
II 2 3 4 6 6 7 8 9 1 o 11 12 , 3 1 4- 1 16 17 18 10 ?O
'b j e C t - ori e 11 t e ct
.
.
P 1- ag.
95 96 97 98 gg 100 lOt O? 103 104 105 10F 107 100 109 11ü 1 It '12 113
. .
... p e o p 1 e
.
.
e:x:J} e c' t
t o
c11..
299 JOO 301 3Q 303 304 305 306 307 30a 309 310 j1 312 313 3}4 3t5 316 31'
.. a n
.
.
.
· terator
Fao
c a. n ..
A BTree szer]<ezet vallhogy így fLstllet:
.
Times 24
500
300
I
100
6
Times-Italic 1 2
Times 2
199
8
1
----'
"
Times-Bold 12
3
187
Courier24
-l
206 4. fejezet · Szerkezeti minták
A belsé5 CSo111ópontok képjel-indextartományokat határoznak meg. ITa a betíítípus rllcgvál-
lC)7iJ{, a sLerke7et]1ez 1(éI1jelel<et 3clunk, \T3gy l(épjele]{et vcszün}< ej onnan, a Brl1reG í'rissü 1.
TegYlil< fel példá III J 11()gy a l)ejáris sorá.n a 1 ()? -es sorszámo.ál (incJexnél) t:lrtun J<. E]<kor a7
alábbi kód az '1 ex pect" szó minden karakterét a kÖrnyező sL.öveg betűtípusára Ctimes12,
a!11i 3. F or1 t péld3.n Y1. a J 2 lJOnl()s ri ITleS Ron1ln lJet(íl(llöz) á] lítja:
el YP.Ll.Con text gc;
Pünt* tims12 = new Font(nTmes-Homan-lh);
Fünt* tirnesltalic1) = new Font (1Irrimes-Ttalic-12 II) ;
/ / . . .
gc.SetF n nt(times12 J 6);
A.2 (lj BTree sz<.:.rkezet a kövlke7;{51(él)1)Cn né7 ]<.i (3. vált()zást l{iemcllll]<):
- :.......:... .:...
.y-
\'.
":'\'.
..:
..:..
....: .:. :......--=... :..
....:.: ..:. ::: \-i." ..::.
;.:.:
.;:.:....:;..\....
.'
.....:..
.. ...
.:.
...
.::..? ..........,.:...11..:.::..
::..
......
.':......:. .
.:::;
..::
:;.:.
....:
...
..;.. -1:.......
';.'\":.'\';'.
.::.. .
:.:-"
..:.....;......... .
. ..IL.
. ,\\.
.......
.::......
..... .........:..:..
.-..., . 1.
n;":.;:::; :.:.:: .;t: i:'.\
Times 12
. ;...
. ..:...
..-::.. :.: ...)
.. ...
....:.. ;.;: .\....
.;.-nl,:.':': L .J.-. .. . ..'I.L ... .::....::....:..........J' _ .n ...:...
,.,,,..""0-'" . "'''', '<1_ .-f"'" ".. .,...,.' . '-"\\.. ,.,i'" .' "'''.. """"
/" ":'. ./.. "':::" ::.; \\
' . \. '.:" '.. ..=". .'. l \
{ .::::\; .:.: .'.:. .' }.. . .{: :\\
.;. .. S. :.: .;. ..:.: .. ....... ':
\. . t. \
.. ... ::.... .:. .
. . .\\. . . . . . .,::. .'(, ....i:::
. ..:..\ . ." ..., . ,............ , ........ _ ..: .. . . . . .;.'. .o:":'
", . --: . ....."..-,,; ,.,,, ..,.,,'" '.. . ,., -'''''',..,",.,., .'t"'"
.. .;. .....
'f :: . .... .:... .
....... ..::. ... .,....:....::.....:. ..
,,'1';/.'/;;;; .;;:;:;;:,;,:,:.:;;::;.:;:::::;:{;: ::'::...,."'''''....'''.".,...,..,-..-.,-..''''. ""-'''-''''''';.:\
\ \.. ..... .:.. .:. .:... .:.. .. L11 11:1...... \ 11(1.. .j:....-:...... .:. .:. ...:. .:.. .:. ...:. ...... .:.. .:..... .:.. .:. . .:. L".. .... :'=:-'1-1:;. ..:. .:... .:. ...:. ...... .:.. .:. ...:. ...... .:.. .:. :.:.. ..., Lf:" "...1. \ ": ...... .;.. .;. ...:. ...... .:.. .:..... ... i:,.
'j;' ' . : . ' \ "
::.:. ........... .L. ... r. ..... .... .. .:; .. -:. .... .:.. !... .:.
: , . , ::. :. ::--..: :.: ...: .:. r.......::: ; l. ..:. :.il :. . :: .:. ;.:. . ..:.:... t: .:\": ..:..\..... .. l.::. ..:.
.. '. ':' :r.. ...... ,\..' ,..,,\ ...... '.. ......, .'1:... .;. \'. '",;.' ........ ';',';:.=;>. \. .....(1 .o. .;" .o;. . ' . ; . "
.
.11(11..........:.,.1.1.:........:..:... .:....:. .......:. ..:........:...:.......:...:... ...:...:."'..:":. w 1.:.1\'" ....1. ... I..".;.;: :..:.. .:..... .........1:.:: :: .'1:.......-:... .:.1.:. ...:.......:...;... ...... ......:. .L,:'
............:..........,..,..
'.\'::. .)f"" '\'.'
. .\'.: .;;' .,....
..... ... ........
.:l.. ....
..:. .:: . : .::.': ':.:"' . ' . .
:.
'1.".
."(... .....:
...
)'"'''''-';r''''''<'':''''''''' 'Oc...
.;;.. .:.: ..:..
.l
...\.....
.......
.::
....:.::..-
.'
.:.
..
..
......:...
,L.
......
,. .
......
.::
".-./f"""''''.'''''- ,....... """\,
.'. : .... ....., 1
:::;'.. ..: .:" :. ;;;' /
\.. .o.
.. ..-
'.:.. .\\'i:
.\.... ';.;":\.'.: ..::.,.",,.;..'.:'
..::.
.
..::....:.
.:.
::.
............. ......:....:..:....:....... ... . .-...:...-.....:...-........: ...
...-......:...:....:..:...:.......... ..
Tc:gyÜk fel, hogy az "expect'1 elé heszúrjuk :d "don't" S7Ót (egy szókÖ77el cgyÜtl) . 2 pontos
Times-ltalic (dőJt) bctÍÍvel. Az alábbi kód énesíti a gc-t az eseményről, feJtétclezve hogy
nlég rnindig 3. l02-es II1.dcxen tlrtózkoclik:
gc.lnserL(6);
Jc.Setürlt (timesltalicll G);
Pehelysúlyú 207
A B'Tree szerkezet cl(kor íg)! 111ÓC!osul:
.'
..1:-
............;. ":..-
..::.1:::.-1"
..
-':
....
..'
".'-.1.
"'Li.'. .
.0'.\.\...
.':"..
-:...:. .
:.:.............
.....
.......:....:.
......;......:.......:........
'\\'.. ..,.::::.t.....,:'1
'.o.':': :_:::... .
.:
.\
.:-;.
. .
......
....\.. .
...
...... :.,
. .\....
. .L._:i;:-.........
.......
.:'.\'-
":".....:.,
.,.
-:.
.; ...
."
.?
.: ..:: . ::. . ' . :.. .: . .:. . . . ' . .::. . :: . '
..
..... i:';'
..:.... .\.,
..1.':: "''-.'.
..:..... .".- .....
." . ....... . ....:.... .... . ol".
o'" .....1.....". ....
I" -I"
".:.,
.'
'.'
:..
"':'.
;.:.
.' .
ti;.
.",,=1"
..':"';
306
.\\:
"
.'
::.
.:.:.
.::
,
'-:.
oP.\-.
.:.
..
".:".
\':
;.::
-:.
....:.
..
:.
.:.;
.'
-.:.
.,.
\:..,::..:.\"..:...:." . ":"t.,.
..': .''.
."
.,.
.::.::.
..'
-::"
:.".
.P..
'..
-:.
.:......
.:....;.... .
'.'
..
..
::.;
\.
.'
'.".
.:..'..\...;.
.\'.:.
..
.'
::.:.
.::
.._:.::.: :'1". .I.'1.:....._.....=::.::
." ":....
.:: ".L
'.:\
.o:............ .." ......: ........:;"11 ..:"0.
. .
..: . ,,:11-- ......
.: ...... . . ..-
"\'.,
...:...
. ..1:.. ..
....:::0 ....:
.....::...:..:. .........
... .1..:.:.:.
..:..
..;..
...::.
..:
..:..
.'
i...
.::
.i:.::
:.
..:.
..:.
.;:
,\0
.:Y:
..'
..
..:..
....
.......
..:.. :.:.
.:. .;.;.
.:.:. .:.
.. :.:.
'\'"
.:.
.:.
..:.
.'.
:.
..:.
..:::: ::::::: ...::::
100
6
.:.: :.... ':'.':'. .::' \ ..:
:::. . ..::; :-.. t \:. " }:' o'.
. .!
... ... ....
...:....:. .. 11..:.:.:... . ..IJ'
...:..:......::......... .........:........:. .... :.
..:.
.'
.:.
..:.
. ....1.:.:.:::.:::.:...:.:..., : ....::.:.::.:.:.::.:::.:.::.:::...::. t'''':''.;' .:..' :
.;.: .I.:.:.:..:.:.:...:O
.. .....
.:... .:;. .:.. .:. .0.... .:... .:.. .:..: .. .:..... .:;. .:.. .:. ...::.:... .:.. .::.or:. .:. . .:. ...:. .:... .:.. .:. .0.... .:.
.: ...
':{.
.... .\
.::.
..:.:
....
.'\'.':'.0. "':.'
.:.... . . . .....
.. .......
....
':'..:" ....:.. u.. . ....:::.\..:...::
.1 0 . . .
..:.
.::..
o...
..:..
..:....:::
. ........
:.y
.:.
..
.. ......::......
... '. .....::.,.:...::. ..:...:..,.:....:..: '..:.:. .:.,.:. ...:.....:. ..::.,.::.,.::....:::..:.\.. \.
..:...
.,\....... ........ ,
fl' ... ., ol" ,.. .-!I,
\ ;',-:.::\f'.,,: ".. '.,.
.. .i ;: 1: :. .....:. ... ..... ....
.:;
.:.;
.:.:
.
.:.
Times-I alic 12
.
,.
.
I"'. .. . . ...
. ; (:,: ': ::;. \',.' '.' A"
. ...;; .. .. .......... .1. ....:....
.'
..:.0
.:.:....:....:..0.....:...:...:..:...:...:......: ..::.:..:.. ........:1..::.......... . . ,:"1.1: ..:::..::...:....:....._.
.:. .:. ...
' , .' , .:11.-11 .... .. .. ..... o .:.
;.;. . " .... u ... ..). .::";J (."\ )' ,.,.. '/:. fo .:.:
.. .:. ,:. =: ..;' .... .,.:. :"..\. ..,..:.:.' ....: :: ::. :: Ji .'
1- 1. L= -.:,.. ....... . ..J ...J. .. ....-=,:. .: .:....
::. .
.:. .-..:..::...,,:._ ................:...:....... .. ...::...:...:.:.....:...:...:.......:...:... . :;... o:.:
;.:..'.:.::...... .....::.. ':::. ::.,::...:.. .:0..... .::.... ..:....... ':.,.. 'o:.::.
:r..:. {). '::::.;r ...Z: 1. .:.
..
.:.,.: .......:...:..:....:....:..:.,.... o":....:::::. .=:-..... 11:11:".. .:. -":'-I..".L..
..:..
. .:...:..:...:..............'...11= "::,.......... . o....:.:.. :.. .:...:........:...:....:..:....:..
..
.:....": .,.:......":.,:-..":.I":. ..:..\,. ........-::.... .-:::. .!..... ...
.:.
. .. . . .
..:..................:...:....:......................... -. ..:.
.:.
.'.
Al11il(or a Glypl1-Context-től clkéril<- az al(tllális eleI TI uetűtípusát, \régigllalld aB-fáJl, 31nÍg
Ineg nem t-illlja aL. aklL]llis incjexnel{ megfelelő lletűtÍpuSl. Miután £1 lJetíftípllS-\Táltáso]{ szá-
m.a Viszol1yla.g csel(él)l a fa a l{épjclszerkezet mércléllcZ l<éj)cst kicsi l11aracJ., al11i tlacso-
nyan tartja a tárk()ltséget, anél l<:ii 1 : 11()b7 aránytalanul ]léSne a }<eresési icI {5. 3
Az ulolsó objektum, amire szükségÜI1k van, egy }JelleJysú1y(lC;Y[lf= amely 1étre]loZZl 1 l<ép-
jelel{et és gC)]ldc)skoc1i]{ megfeleléS l11egosztásul( áll A Glypll.lactory (I(épjelG'yár) osztály
Char ac Lor és más Lípusú képjelekeljJél(Ján)l()sít. Csak a Character ()11jel{tuI11()klt ()S7t-
JU I{ nl eg; al. Öss7etett 1<épjele]<L1ől jéJ\Tal ke\TeseblJ van, és fontosalJb Jla.l)otil1forlnác. óil(
(péIl13l11 ct g)lcrmel(cl(re \lonatl(ozók) amúgy is belsé5J.c.
const inL NCHARCODES = 128i
class Glyphractory {
public:
Glyph.b'actory () ;
virtual GlyphFacLory();
virlual Charucter* Crea.teChdracter(char);
vLrtuaJ Row* CreaLeRow();
v j rtual Col umn- CreDLeCol umn () ;
I / . . .
3 .1:\ krLs6si lelt)' Lbbcn a sérná l)an J bl.(iríJ Jus-vál1.ás()k gyaJ(()rjság8vaJ arínY(Js. 1\ leljesíllnél1Y akkor a leg-
rosszaIJl), ha nl1nden karaklerre jut egy l)ctűtít)us-\'áltásJ dL CI' a gyakC)r]allxJ n sz{)ia1 I.n ]cnnc.
,
208 4 fejezet Szerkezeti minták
privaLe:
Charactcr* _character[NCHARCODES]i
} ;
A _characLer tÖlnb !(arakler]<ódda] indexell Characler l\:élJjeleket cÍmző mutJtó]{at taf-
t3.ln1az. A töI1111 a konstJl.Jktorban nulla ]<ezdőértéket kap.
GlyphFactory: : GlyphFactory () {
for (i.nt ::: Oi i < NCHARCODES; ++i) {
_character ri 1 = Oj
}
}
A CreateCharacter (LétrehozKarakter) megkeres egy karaktel1 a tömbben levő képjeJ-
11en., és viss7aacija a megfele ő képjelel, lla ]étezil\.. lia neJl1 létezik, létre110zLi, a tÖlnbbc
llcl}rezi, majd ezután -ldja \rissza:
Character* GlyphFactory: :CreateCharacler (char c) {
if (!_character[cl) {
_characler[c] = new Character(c) ;
}
reLurn _character re] ;
}
A többi m(Í\Telet <:gyszerűen. egy új olljel<tumot l)élt1án.yosít minden J1íváskor, mivel "'t nem
karakter ]{épjcleket n.em. osztjuk nleg:
Row GlyphFaclory: :CreateRow () {
rt..t urn new Row;
}
Col u.mn* GlyphFactory:: CreatcColunm () {
rcturn new Columni
}
(j is hagyhatnánk ezeket a műveJeteket, és a 111eg nem osztott képjelek példányosítását
közvetlenül az ügyfélre bí7hatnánk, de ha később Úgy döntunk, hogy mégis megosztható-
vá tess7iil{ ől{et, m()d.osíta.nunk keJllétre]10zó ké}djukat az lig}rfélben.
Isme f Ihaszn I sok
A pellcJysú1YÚ o}JjCktUITIO]{ ötletét el{Ss7ör az InterViews 3+0 [CL9()1 írta le és ako.ázta ki ler-
vezési módszerként. Fejleszté5i l1izonyítékként egy c[()teJjes szö\regszerkesztőt (Dc)c) is el-
készítettek LCT 921. A Doc a dokumentumok valamennyi karakterét képjel (Glyph) objcktu-
Pehelysulyu 209
mokl(al abrázolja. A zerkcsztő TI L t1cteJl karakter szárná.ra, an1.eJyel egyadott (a gr3.fikai jel-
le]117Őkel mcgllatározó) stílussal írt a.lz , Jzülön C;lypll pélclányt élJít, így a karal{terek belső á
lapota a karakterkódból és a stíJusinforn1.Ícióból (egy stilustáblá7at adott indexéből) ál .4
Ez azt jclcnti 110gy csak a kar'lktcr l1elye ]<üIs{5 információ, am.ineJ{ révén a Doc múl(ödése
g)'ors+ A d.okumenlum.okat a ])ocument (Dol(umentl1111) ()sztály jcll{élJCzi t 3tl1ely egll1en
a I)cllclysúl)rú(yá[ szerepét is betölti. A !)oc vizsgálata azt ml1tatta, 11CJgy a ]JcllLlysúl)'Ú ka-
rakterek megoszt1.sa igen 112tékony: egy átlagos, 180 000 kara!(t<:rl)ől álló do](umentum
mindössze 480 karakter o})jel,tu111 S7ámára igén}'el tá.rlle]yet.
AL ET++ f\XTC;MRR] a lnegjclcn.ítési szallványol{tó való fi.iggetlenséget támogatja pel1elysú-
lyú (Jojektu1110kl<a]. S A megjelenítési szabvány()]{ a felllaszn3.lói feJiilet elemeinek (gö "dí
tősávok, gombok) n1cn.ük - egységes ncviiköo. vezérlők) !negjelenésél, illetve azo}, (árnyé-
]{olással, tér113.tássa] való) díszítését szalJá]yoZ7ák. A vezérlők ezeket a felad.at()kal (elrende-
zés, J{irajzolás) CbY önálló Layollt (Elrenoczés) objektumra rurlázzák át, amelynek megvál-
t()Zldl3.S1.\Ta.J. aJ<.ár flltási(161Jcn módosítható a megjelcnítés + nlód.
Minden ve7érI()c)SLlálylloz egy-egy I.aycJul osztály tartozik CSc[c}lllJarLayout, Menubar-
Layout stb.). A megoJd.ással J1yilvánva.lóan. az a gc)n{i., 110gy a fclllasználói feliilet objel<tu-
ma,inal( 5zánla megkélszcr<.::ződ.ik+ Ezt a lerllelést elkerülendő a 1 aY()lll ()bjektumok })e]l.e]y-
súlYlJak. Ez terl11észetesen adódik, l1isze11 e7en ()lJjeklUlTIok cladata tölJlJnyire valal11ilycn
,'isclkedés megl1£ltározása.) 3.2 elrend.ezésllez étJ rajzolás 102 szükséges Lsekély mcn.n.yiségű
klilső állapotin.fc)rmáció ])cciig kön.nyen álac111ató nckil(.
A Layout o11jel<tumokat Lool( (K.l1é7et) objel{tun10k 1102Zák létre és l<eLelik. A Lool< osztály
egy elvont gyár, aJJ1.ely a 111egfelclő La.yout objektuffiC)l olyan múvclete]{J{e] állítja elő, mint
a GetButtonLa)TOllt (SzerczGolnllElrend.ezés), GctMenu13arLa yout (S7ere' McnliSorEl. e.o.-
dezés) és így továl)11 Mind.cn megJelenítési s Z lbványlloz t3.rtozik egy Iool{ alc)sztály
(Motifloo]<= 0J)enLook stb.)t aJ11elyek a megfelelő La.)rout objel<llIITIC)kat l)iztosítjá.k.
A Layout ()bjektuInok egyé11iránl lényegiikct tekinlve stralégiák (láscl :l Stratégia mi!1lát),
\Tagyis ulya.n stratégi::l ()[Jjektumol\:, 3.melye](et J)e11elysúlyClként \'3.lósÍtottal< meg.
Kapcsolódó m"nták
A Pehelysúlyú mintát gyakran has7náljáh. egyÜtt az Összetétel mintával, hogy egy 111egosz-
tütl levél-csOlllóllontokkal renclcll{cző irányított l«jrmntcs g áf fOfJllájá11aJl valósílsa113.k
Ineg egy 11ierarcllikus logikal szerl<ezetet.
,
A7 Allapol6 a Stratégia. .ninta olJjeklllmait álta.lálJan pelleJysúlYÚként a legjobb l11.egvalósítatl1.
i
A Pél(h-tk()(f r(.sri )Ln sfcrcp1(i k(}clllan a slí1l1sinfornlció kÜl()J cak akarakterkóc! lJelső álla l10tin[orn1áció.
5 1\ rncgjclcnil(i szal)ványol<t{)l val{) fÜggeLlel1ség l)izhJ$]t:isára gy n1ásik megközelítést a E!v(Jnl ()'yár t11intánál
la lállla lunk.
210 4. fejezet · Szerkezeti minták
HI. .s
Szerkezeti objektun1TI11nta
C '1
Adott objektumot képviselőn vabT}' hclyörzőn keresztÜl irányítan( hogy szorosabban iel-
ii g)Tell1essü 1,,- III űk ö cI ését +
r
gye neve
l)fC)XY, SlI rrog(;tte CI Jel }'eltes'ítő)
elad
Az objcktUlllokho7. valÓ hozzáférés szabályoLásának egyik célja, hogy létreho7ásuk és elő-
készítésük teljes költségének "tnegfizetését" elh;,llasszuk addig, amíg ténylegesen sor nem
kerül h'1sználatukra. Vegyünk egy szövegszerkes7tő programot, amely képes grafikus ob-
jektumokat beágyazni egy dokumcntuJ11ba. Egyes grafikus objektumok - például a nagy-
méretű raszterképek létrehozása igen költséges lehet. A dokumentum 1l1cgnyitásának
a70nban gyorsnak kell lennie, ezért el kell kerülnünk azt, hogya kÖltséges objektumokat
a dokumentum n1cgnyÜásakor, egyszerre hozzuk létre. Erre egyébként sincs szÜkség, hi-
t,zen egyidejűll:g ]1en1 min.degyik objcl\:lurn Iá.tl1ató a d.ol<uJ11cntllnl}JaI1.
Mindezckb61 az kÖvetkezik, hOh7 a költséges objektumokat igény szerint kell létrehoz-
nunk, vagyis ebben a7 esetben akkor, amikor az adott kép láthatóv:í válik. De audig Init te-
gyünk a helyére a dokumentumban. és hogyan rejtsük el azt a tényt, hogya kép igény sze-
rint jön létre, anélkül, hogy túlbonyolítanánk a szerkesztő megvalÓsft:ísát? Csak hogy egy
példát említsÜnk, a létrehozás optimaliLálásának neIn sLabad hatással lennie a megjeleníté-
si és formázási ké)dra
A megoldás egy új objektum, a képhelyettes has7nálata , anldya tényleges kép helyén áll.
A helyettes ugyanÚh:ry viselkedik, mint maga a képI és gondoskodik annak példányosÍldsá-
ról, ll.a szü]<ség \'an. r:d.
kép
egyKépHelyettes
egySzöveg Dokumentu m
fáH Név - - - - -- - -
egy\.ep
adato k
1. .
. . L
Ub....
a memóriában I
"'" b...
L =:: . teme en
J
Helyettes 211
A l{épllelyettes csal{ al{l{or l10zza létre a képet, an1il<or a sLövcgsLc...rl{esztő Rajzol (Draw)
111ŰVLILténLJ 111eg11ívas3.va.l öntnaga l<iraj7oIására s7ólítja fej. A llelyelles eZtltán közvetlenül
a kél)hez továl11Jftja a kéreln1ekel, ezért hivatl<oznia kell a képre, n1iután létrellozta..
Tegyll]( fel, 110hTY a képek önálló fájlokba.n tárolódna.k. Ebben 3.2 esetben. a tél1yleges ohjel{-
tU111ra. a fájlnévvel ]ljvat]{07Jlatun]{. A 11elyelte emellett a kép kiterjedését (cxtcnt), vagyis
a s7élességél 6s lnagassagát is t3.folja. A l{iterjedés tárolása le]l.etővé teszi a helyettes s7á111á-
ra., ]10gy l{ezelje a formá7é)l()] a Inéret beállítására \'onatkozó kerelmel-cct, ané ]{ül, 110g}' va-
lólJan példá.nyosítaná a képet.
Az 1láblJi osztálydiagratD rés71eleselJ11en illLls7lrálja a fenti pélelál:
Do kume ntumSze rke szt o _....1 Grafíka
--
Rajzo/O
SzerozKiterjeds(}
Táro/O
BetiiJt()
L\
Kép .... - - -- KépHelyettes
kép o- L..
R;] ]zolO -- Rajzol( )
-
SZe re zJ{jterj Bdés () Sze rezKite edés ( 0- ....-
Táro 10 Táro' ()
B etöt{) Betölt( )
kB pMegval ósftás fájlNév
k.ter"cdás kite M edés
ff (p = O) {
kép;:::; BetcitKép(fájINév);
}
kép- > R aizol{)
I
I
I
I
------
if (kép == O) {
rerum kiteeds
} else {
retum kép->SzerezKtteedés();
}
A clol(Ulnentlllnszcrkcsztő a beá.gyazott képeket az elvont Grafika CGrapJlic) oS7lály által
meg1 alározotl felületen keresztül éri Ll. Az igény szerint létrell0zott képel( ()sztálya a Ké'p-
Helyettes (Irna.geProxy). A KélJIlelyettes a lel11ezen találllató l<épre a fájlnévvelllivatkozik.
A fájlnevLt a .gumentu.mként adjuk dt a KépHelyettes l{onstrul<toránal{.
A KC})Hclyettes a kél) befogl3.ló dobozát is tárolja, illetve egy Jlivat]{07ást a tényleges T(ép
(mage) Jéld.ányra. A lliv:llkl)zás mindaddig nen1 érvényes, a.míg a llcl)Tcttcs nem példá
nyos1tja a képet. A Rajzo] (IJraw) művelet gondosl{odik róla, hOb l kép péld.áIlyosítására
sor kerllljön t mieléStl a kérelrnek továbbílódnának hOLZá.. A SLerCLKitcrjcdés (GetExtent)
csaJ( a.kkor továbbít ]{érelJJJ.et a ](épne](, ll.a !11ár létezil< beléSle pél ci-ány r eh'Yé11ként a J(ép-
Helyettes l tárait kiterjedést adja viss a
2 2 4 fejezet · Szerkezeti minták
Ikalm hatós '
A Helyettes terve7ési ninta akkor has7:nálható, amikor LSry- egyszerű mutatónál rughna-
sabb vagy kifjno nultabb hivatko7ás szükséges egy objektumho7. A mintát többek között
a kövctke7Ő 11elyzelekben célszerű a.lkaJIllazni;
1. Távoli helyettes -lelyi képviselőt bi7toSít egy másik címtérben található obje {tum
s7ámára. A NEXTS rEP [Add91] erre a célra az NXlJ roxy osztályt használja. Coplien
rCop92] az ilyen Jle yettest 'Jnagykövetnek" (AmI1assador) nevezi.
2. Virtuális helyettes - igény szerint lélrehozza a kÖltséges objektumokat. A Feladat részben
leíI1 KéI1I-Iclyettes is ilyen helyettes.
3. Védelmi helyettes - sLabá yozza a hozzáférést az eredeti ohjektumhoz. A védeln1' he-
lyettesek akkor hasznosak, ha egyLs objektumoknak kÜlönböző hOZ7áfé+ési jogo-
sultságokkll ]{eJl rencleIl{ezniük. A C]10ices ()perációs rendS2Crbe]1 rCIRM93] talállla-
tó KcrneJl)roxy-k (RenclsL.erlnagHclyettes-ek) l)élciául védett 110zzáférést biztc}sfta-
11al< az operációs rend.szer ol)jcJtumai szá nára
4. Okos helyettes - olyan, 111int egy si na mutató, csak az objektum elérésekor további
lnűvelete1{et végez. Használatára néllány jellcml(5 IJélda:
- a tényleges objcktumra való hivatkoLások számlá.lása, hogy az objektum helye au-
tomatilzusan felszabaclítl13tó legyen, ]la l11ár nem ]livatko7ik ri semmi (okos mutató-
nak is llÍvjál< rIdc92J);
- ChJY maradandó objektum betöltése a men1óriába az első rá vonatkozÓ hivat \.üzá o;;nál;
- annak dlen6rzése, h0 6 ry hozLáférés előtt sor került-c a tényleges objektum zárolá-
sára, amivel mcgakadályozJlató, l10gy kÖ7ben nlás objektuln módosítsa
Sze zet
'd
t: : f':"';'" ..-ii- '. -.:-- - -1- ............0..... ........... . . .1. ..... ............:;.;\...:.... Al nr
". II o" ...... IL
..... ......=:- ": . ...."i
..... ..
.... . u.. .. " "."
Kére/m zr)
.....
/\
TénylegesAlany tényle gesAlany Helyettes
........
KéreJmez( ) Kére me.zO o- l- -
.... ...
-.. ....... ........ ..... ....
....
--......... ..........--
ténylegesAJany- > Kére mel();
....
Helyettes 2 3
Í]lle egy 11elyettes-S7erkezet lehetséges ()11jektunl{liagra111ja futásid.ől-Jen:
gyŰ gyfé I
egyHelyettes
egyTényle esAlany
ala ny
té ny (egesAIany
észtv vők
· Helyettes (KépHelyettes)
- 1 Iivalkc)7ást tart fenn, ame]ynel< segítségével 3 11elyettes elérheti a tény eges alan.yt.
A llclycttes egy Alanyra (Subject) is l1ivatkozllat, ha 3 TénylcgesAJa.ny (RealSubject)
és az AlaJ1Y felülete a7()nC)S.
.
Az AJa.ny feliiletévei azonos felületet lJiztosít, 110gy 3 l1el)Tettcs k.cscrélllctő legyen
a tényleges alannyal.
Szabályozza a Jlozzáférést a té11yleges alanyiloz, és felel11et a.nnal{ lét "Cllozásáért
és tc)rlésfért is.
A7 egyéll fele őssége]{ a }le]yettes típusától filggnek:
)) A távoli Jlelyettesek feladata a kérel111ek és argumentulnaiJ{ kéJd.olása, illetve
a ké)cic)]t kéreJem eJküldése a n1ásik cfmtérlJen laláJllató tényjeges alanYl1al(.
» A l)i11uális llCI)Jettesek ideiglenesen kiegészítő információkat tárolhatnak
a tényleges alany
ré)l, 110gy
elérését eU-lalas7lI13Ssák. A Felac at rés7Llen S7e-
replő KépI-Ielyettes például a kép {iterjedését tárolja.
)) A védellni hell'ettesek e lenc)f7ik, 11()gy a ]lfv() rend.elke7ik-e a 1<éreJen1 lelje-
sítésé lez szükséges hozzáfé .ési engedéllyel.
· Alany (Grafika)
- Meg11atározza a Tén)!legesAlany és a IIelyettes CProxy) {özös felületét, 110 gy a He
ly<:ttes mindazokon a llelyckcn llasználllató legyen,
ill01 J"1
énylcgesAlanyra van
szükség.
· TénylegesAlany (Kép)
- Meg11atáro77a a J1elyettes által J{épviselt tényleges o11jektl11TIot.
E yü muködés
A Helyettes SLlikség eselén kérelmckcl továbl)ít a 'l
énylegesAlanynak, a l1elyetles tí-
pusától függően.
214 4. fejezet · Szerkezeti minták
Köv tkezmények
A Helyettes minta kÖ7vetettséget biztosít az objektum.ok elérésében, Ennek a kÓLvetettség-
nek a IleJ).relLes tJjJllSá.t()] fiiggően számos előnye van:
1. A táv"oli l1elyettes elrejti., ]lOg)l a7 objektulll egy l11ásik címtérlJcn találllató.
2, A virtuális helyettes optimalizálja a viselkedést, például a7/:al, hogy igény szerint
11()ZZ3. létre az objcktumoJ<'3.t.
3. A védelmi és okos helycttesek további műveleteket tesznek lehetővé a7 objektumok
clérésel(or.
A Helycttes mintával emellctt még valamit elrejthetÜnk az ügyfelek elől, mégpedig a t,máso-
lás íráskor" (copy-on-write) megoldást, ami az igény szerinti létreho7.áshoz kapcsolódik,
A nagy és bonyolult objektumok mjsolása költséges műveletlehet t pedig e költség szük-
séglelen, ha a másolat soha nen1 módosul. Ha helyettcs has7.nálatával elhalasztjuk a máso-
lást, gonduskodhatunk róla, hogya n1ásolás költségét csak akkor fizetjük meg, ha az objek-
tllmot módosíljtlk
AJ.1110L, Ilogya másolás írásk()f t11Űl{öclj()n, az a.lanyra vonaLkc)7() l1ivatkc)7ások SZáJ1113Já.sára
van s7üksé b - A helyettes másolása csupán a hivatkozásS7áInláló értékét nÖveli. Az alany
tényleges másolását csak akkor hajtja végre a helyettes, ha aL. ügyfél olyan mííveletet kércl-
111eZ, ami mÓtlosítja.
lLl. El<ko"
lllelyettesnck cSÖ]<kcl1lellie is kell a ]livatl(ozásszáJnláléJ ér
tél{ét. Amikor elZ érték nulIá.ra csc)kl{en
az ala11Y törlő,Jik_.
A másolás íráskor jdentősen csÖkkenti a nehézsÚlyú alanyok tnásol.ás1nak kö1ts
gél.
egvalósltás
A Hel)Tettcs Illinta ré\'én a l(övetkező n.ycl\
i s701g3.lt.atások a!{náz}1atól{ ki:
1. A C++ tagelé1
6 mIiveletének {últerhelése. A C++ támogatja a tagok elérésére szolgáló
operator-> mlívclet túlterhclését. E mcgoldás révén további műveletekel végez-
hetÜnk, amikor ct:,1)' objektUlI1 hivatkozásál feloldjuk (dereferencia), CL pedig segítsé-
günkre lehet egyes hdyettestípu
ok megvalósításában; a helyettes ugyanÚgy visd-
ke{li]<, lnint eg)l mutat().
A követke7Ő példa azt mutatja be, hogyan használható a fenti eljárás egy lmag!?Ptr
(KépMlltató) ne\'Ű viI1tláI is llelyeLles nlegv
llé)sítására.
class Image;
extcrn Image* LoadArllmageF j 1 c {COT18 L char*) i
1/ külső függvény
class lmageptr {
public:
IlnagePtr (C<.10St char* in1ageFi le) ;
virtual
TmdgePtr();
He yettes 215
virtual lmage* operator->{);
virtual Image& operator*();
privatc:
Tmdge* Loadlmage();
prJvate:
IInage * image i
const char* imaaeFlle.
-........ £
} ;
ImagePtr: : ImaqePtr (const: c:har* tllellTLageFile) {
_imagePile = theTmageFile;
_image = O;
}
Image Imagertr:" TJoadlmagc () {
if (_ima. ge == O) {
j mage = LoadAnImag eF ile (_ i rnd ge}1 ile) j
}
return image;
}
A tú]terl1elt -> és * mCívclete]{ (()J)erálorok) a LoadImage (letöltI(ép) segítségé\rel
adjál{ vissza az _image-et a h.ívól<n.3.l( (illet\le t()ltH( l)e, J:l3 Ziikséges).
Image* TmagcPtr; :operator-> () {
return Loadlmage();
}
Jmagc& lmagePtr: :operator* () {
rcturn *Loadlmage();
}
E l11eg]<özclítés ré\,én anéIkiilI1Ív}13.tjlll, lTIeg az Irnage művejetcit IlnagePtr ol)jel<tu-
IJlol(or11(crCSZllil h{) l Jl1.űvelctcl{ct az ImagePtr feliilet részévé .kellene tennünl(:
ImagePtr imago = lmageptr ( n egyKép}1áj lNév U ) ;
image->Oraw(Point(5ü, 100));
/ / (j Jnage. operator-> ( ) ) ->Draw (Point (5 O I 10 O) )
MCf,figyell1etjü]<, 110gy 3.Z image I-1elyettes I11ut1.tól(ént vise]l<eclik, l)edig nem egy7
Image-re llivath:uzó mlllaté)ként v'ezetjül\. be. EbllC5I ](övetl<ező<:I1 ncnl 113S7:ná1J1ató
pontosan (Igy, miJlt egy! valóeli Image nlutat{), va.gyis 3.Z ügyrfelel{ne]{ 1(ülönl)öz(51(éll
:pen keH ]<ezelniül( az Imago és Imageptr objeJ(LlJmc)kat.
A tagelérő 111lIvcleL llllterllelése neItl felel nleg Jninden.félc llclyeltesnél. Egyes 11c-
l)lctleSel(]lel{ po 1tosan tlJ(l.niul< kell, l1Jcl)Jik tnűvelet }.lí\Tására 1,cliilt s()r, így a7 iJyen
lú]ter}1.elés cbuen lZ esetlJen nem rnűköclil{.
216 4 fejezet · Szerkezeti minták
\'eg)rük a FelacJat részbell. szereplő Virtlldljs l1elyettes péld.áját. A l<épet egy adott id.ő-
pontban Ca !)raw lnűvclct meghrlásakor), és nem a képre va]ó nlil1.cl<:n llivatkozás-
nál kell betölteni A tagelérő lnűvclet lúlter11e]ése ezt a l11cgl(ülönl)()7tetést n.em teszi
lchctővl.. I"le]lát itt egyenként, Il1agunkna]{ l<ell mcgvalósítanunk a ]lelyettes Inind.en
olya 1. rnűveletét, ami kére]n1et továbbít aL alanynak
Az Cl111ített rnű\reletek általában nagy1"()n llasonlítlnGlk egymásra, aJl1int 3.Lt majd
a !Jélcialcód részben is lál11atjllk. ]e]lemzőcn lninu.egyil< művelet ellenőrzi, 11067 a 1{é-
relem érvényet,-e, 110gy az eredeti objektuIl1 léte7j]{-e és így lovábL1, mielőtt a l(érel-
Inct az alan)Tho7 tová11l)ítaná. Ezt a kódot újra és újra nl<:g'Írni Il1eg]e]letőse11 fárasztéJt
e7ért tÖ}Jbnyire el(Sfeld.olgozó segr""tségével aut()matikusan 31Iítjál( elő
2+ A doesNotU11deT"stUJld 11aszfzálala a SJnalltalk-ba11.. A Smalltalk egy h.o :gat biztosít
amellye] tál110gatllatjuk a --érelmel{ automatikus t()váll11ítását+ A n.kor egy llgyfél
üzenetet küld egy olya.n foga.dóntk, aJnelynek 1incs megfeleléS nletódusa a nyelv-
l)en a doesNotUndes Land: aMes sage ll"'vására kenil 50r+ A Helyettes (IJ roxy ) osz-
tály úgy írllalja felül a do e sN o L Under stand-et, 110gy az üzenet tc}válJbítódjon az
alanyllo7.
AJl}10Z 110gy bizl()sítsuk, a kérelelll továl)bítód.i -<: az alanyl10z nem pedig csendesen
elnyeli a ]1elyettes mcgllatárc)7]latunl{ egy ol)Tan Helyettes osztályt, arnely e...fD/ctlen
üzen.etet scm ért meg. A Smalltalk ezt úgy lám()gatja, llogya Helyellesl ősosztály nél-
küli oszlály1<ént llatározza meg. 6
A doesNoLUnderstand: Jegnagyo1Jb 11átránya az., 110 gy a legtöbb Smalltalk rend-
szer néllány olyan küJÖI1.1cgcs üLeneltel rend.el]{ezil{, 3.melyeket kC:'7vetlenül a \rirluá-
lis gép ]<ezel t így nell1 kerijl sor a szol{ásos metó(Jus-kike.esésre+ AL egyetlen, ame-
lyet altalál)an Ollject-ben valósítanak ill.eg (és így érintheti a l1elyetteseket) aL azo-
n()sságvizsgáló == művelet.
I la a llclyettes megvalósítá.sára. ct doe sNot Unders t and: et llas7náljul{t meg l{elI
kcrülnűn]( ezt a problél11át, lliszen a ]lelyettesel( azon()ssága nelTI jelenti a tényleges
alanyok a.lonosságát. ElTIellctt aL. is 11átrány ]lOgy a doesNolUnderstand: -et lliba
keLc..Jésre tervezték, nem llclyettesek építésére, eLér1 általá11an e]ég la.ssú.
3. A hcl)Jettesnek 11em m.indig kell isnler1/lie a ténylege alut1)' típlASál. Ha egy 1 Ielyettes
osztá]y ki7árólag egy elvont felü]elen ]<ereszt(illé!Jllct l(apcs()lat113 £1.2 3.lannyal, ninc
sZlikség rá, 110gy min(len TényjegesAlany osztálYl()Z kll1ön IIelyettes osztályt készít-
SÜ11k - a l1e]yettes lnindcn TénylegesAlany osztályt egységesen kezelilet. Ha aLon-
ban a IIelyettesck péld.ányc)sfljá]{ a TénylcgesAlanycJkat (mitl.t a110gy Gl virtllá]is l1e-
Jyettesek tcsLik), iSlllernjül< J.cell a konkrét oS7tályt.
6 A EXTSTEP lAdd94] elOszLott objektut11ainak D1cgvalósítása (ponl()sal)llan az NX])[(}xy oszl;lly) is eZl a JTIi.:gol-
dást aJkalmlzza. Itt a forward (továl)lJít) [elülírására kerül sor an1i a '\Jl:XTS'fEP llasonló célú horga.
Helyettes 17
A megva ósítássall(apcsolatban szó kell cjtenünk arról is, hogyan 11vatl(ozllatunk az alany-
ra annak példán'yosítása előtt. Ehryes he yetteseknek attól függetlenül kell 11ivatl<o7njuk
a hozzájuk tartozó alanyra, hogy az a memóriában vagy a emezen talállató-e, vagy+s vala-
milyen c....mtérfüggetlen ob>e tuma onos....Lót kelll asználniu { A Feladat részben er e a célra
a fájlnevet al ?"a maztuk
P I kod
A ]{övetl{ező (ódban }{étféle helyettest valóílunk meg; a Feladat észben lLÍrt v+rtuális l1e-
yellest, és egy o]yan 11elyettest, ami a doesNotUnderstand: horgot használja7
1. 1/irtuális llelyettes. A Graphic (Gra.fil{a) osztály 11aLáro za meg a grafikus osztályok
elü etét:
class Graphlc {
public:
virtual -Graphic();
virtual void Draw(const Point& at) = O;
virtual void HandleMouse(Event& event) - O;
virtual const POlnt& GetExtent{) O;
virtual VOlÓ Load(istream& from) - O;
virtual void Save(ostream& to) = O.
protected:
Graphic();
} ;
Az Image (Kép) osztálya kép ájlok megjelenítésé11ez valóstja meg a Graphic fe]ű-
letel A Image felülbírálja a HandleMouse (Ke7eIEgér) műve etet, 11.ogy a ellas -
l1áló I( interal(tívan á.tmérLtezhes[k a képet
class Image : public Graphic {
public:
Image (const char* flle); / /1{épet tölt be egy fáj Ibál
virtual Image();
virtual void Draw(const Point& at);
virtual void HandleMouse(Event& event);
I
virtual const point& GetExtent();
virtual void Load{istream& írom)j
virtual void Save (ostream& to).
private:
I / · · ·
} ;
, A Bejáró rnintánál a következő fejezetben egy másfajta helyettest 's betllutatunk
218 4. fejezet · Szerkezeti minták
A7 ImageProxy (KépHel)'ettes) felijletc megegyezil( lZ Image-év<:l:
class ImageProxy : publIc Graphic {
public:
ImageProxy(const char* imagePile) ;
virtual -ImageProxy();
virtual void Drdw(const Point& at);
virtual void HandleMouse(Event& evenl);
virtual consl point& GeLRxtent()j
virLual void Load {istream& (rom);
virtual vajd Save{osLrcam& to};
protected:
Tmage* Getlmage{);
private:
lmag.e * _ i rnage ;
Point exLent.
- I
char* _fileName;
} ;
A ]<.o.lstrukt()f Jlel)Ti má.solal()l !11ent 3. ké.pel tároló fájl ne\7éről, és kezdé5értél{ct ac1 a7
_exlent (_kitcrjc(Jés) és _image (_1<é11) tagol(na!{:
ImaqeProxy: :lmageproxy (const char* fileName) {
_fileName strdup(fileName);
_ext{-rlt = Point:: Zcro; / / aki tcrj edésl rnég nem ismerj ük
j magG = O i
}
lmage* TmageProxy::Cctlmaqe() {
if (image == O) {
_image = new Image (fileName) ;
}
rcturn _imiJQc;
}
A Get: lxl en L (S7erczKiterje(J.és) 111.cg\lal()sílása 113. lcllelséges, 3.Z ideiglen.esen tá-
raIt kiterjedést ac ja viss7a, egyébként a kép betöltődik a fájlból. A Draw (Rajzol) tölti
be a képet, a Hand] eMouse pedig a tényl e ges képheL továbbítja az eseményt.
consl Point& ImageProxy: :GetRxtent () {
if (exent == Point::Zero) {
extent = GetTmagQ{)->GetRxtcnt()j
}
returl1. _exterlt;
}
voll) JrnageProxy:: Draw ( const l)oint& al) {
Getlmage()>Draw(al);
}
Helyettes 2 9
vOld ImageProxy::HandleMouse (Event& event) {
Gellmage()->HandleMouse(event);
}
A Save (Ment) művelet egy f()lyatnba menti a lárc)ll !<élJ]{.iterjcdést és fájlne\ret
A Load (Betölt) elkéri ezel{et a nformációkat, és előkcszÍti 3. megfelelő tago]{at
void IrnageProxy::Save (ostream& to) {
lo « _extent « fileName;
}
void ImageProxy::Load (.stream& from) {
fIom » exlent » _fileNamei
}
Végül, tegyük fel, 110gy van egy TextDocument (SzövegDokl menlllJl1) JleVŰ osztá-
lyunk, amely larta]n1az]1at Graphic ()11jektulTIokat:
class TcxtDocumenl {
public:
TextDocument()j
void lnsert(Gaphic*);
I / · · ·
} ;
Egy ImageProry-t így s7úrhalunk be egy szcjvegd.okuJnentumba:
extDocument* text = new TextDocument;
/ / . . -
texL->Insert{new ImageProxy(egyKépFájlNév"));
2 IJelyettesek, a}llelJ}ek a doc}:;NotU'flde1'Sla11d-et lzaszflálják+ A Smalltal <11an olyat105L-
tályok rTIcgllatár()7ásával }(ész"'tllctünk dlll]ános llelyettescket, aT11elyel{ ősosztál)13
a niP\ va]am.1t a doesNoLUnderstand: ffiLlód.us Tllegh.3.tá ozásával ]{épes az (ize-
netel{ l{ezelésére.
Az alábbi metódus feltételezi, 11()gy a ll.elyettcsnek \ran egy rea lSubj ect nletódu-
sa, aJl.1i a tényleges ala]lyt acIja vissLa Az ImagePJro' csetében e7 a Jl1etóclus ellen-
őriznér llc)gy létrejött-e az Image, szükség csetén lélreJlozná, és végül vissza3.tiná.
A metódus a per [orrn: wi tllArgumenLs: segítségéve! juttatja cél11a az iizenetct.
doesNoLUnderstand: aMessage
A self realSubject
perform: aMessage selector
withArquments: aMessage argumenLs
A doesNotUnderstand: argumenlulna a Message (Üzenel) e&ry pélc1á.n)!a, ami
,..
a llelyeltes által ne Il él1clme7Jlet{5 i.izer1etct jcll(épezi. Tg'V a l1elycttes nlind.en üzenetre
úbry vá aszol 110gy ellen()rzi, létezil\.-c dZ alany, Jl1jelőtt az iizenetel tov{Í.blJÍtaná llC)Z7á.
8 S ..inle l11Í11(ien oS7lá'y végs() óüszlálya a7: Olljecl) CI:611 a kifejezés egyenértéJ\J1 dZLal, lnintha a?t mon(laü.áT.1.1(:
olyan osztál)'u]( lnegllaLározásávaJ, arncJycknek az Objecl nem ()sc H .
220 4. fejezet · Szerkezeti minták
A do e sN o t Unde r s Land: e.6'Yik előJlye, J10gy különféle fcl(1olg()zé) mll\'eletel{et vé-
gczllet l)élJául egy védelmi llelyettcst 110Ll13tunk létre, Ila tneg]1atározzul< az elfc)-
gadható üzenctcl< 11almazát (legalMessages), majd az alábbi mel()(fussallátjuk cI
a l1el)'cttest:
doesNotUndGrstand: aMes sage
A (lcgalMessages includes: aMes sage selector)
ifl'rue: [self realSubjecl
per form: aMes sage selector
wlthArguments: aMes sage arguments]
if False: [self error: I Ervény telen műveleti]
A l11etódus ellenőrzi, }l()gy az tizenet érvényese, mielőtt továbbítaná azt a tén)Tlcgcs
alanylloz. ITa az üze11et nern elfogallllaló, error: Ü7enetet küld a llelyettesnek, ami
3. llibál( véglelen cil{lusát ind.it11atja el, l1acsak a llclycttes meg nem határozza az
error: -t Az error: 111egllatározá.sát aL esetleges metódusokl{al együtt az OL1ject
osztály1Jól kell ide más()lni.
Ismert elhasználások
A Fela{i.at részben. szereplő virtuális llelyeltes az [1 1 ++ szövegépítő-blokk oS7tályaibóJ.
s ZárJl1.3 zik.
A NEXTSTEP [Add.9!] a IncboSZlllató ()l)jektumok 11.elyi l(épvise16i (ént l1Asznál h.eJyettesel{et
(a.z l'\Xl)f()XY ()S7t{1Iy péJdányait)+ A kiszolgálóI\: llclYLttesekel llo7naJ< létre 3. távoli objektu-
n101c szárnára., a111il(or aL ügyfelek igénylik a7okat. A 11ilzor üzenct érkezik, a llelyettes argu-
111el1tumaivtl együtt k()dolja, ]11ajd a ](ódolt üzenetet to\!{.blJítja a távol] alan_y110z Az alany
ubryaní ]<ódolja. az esetleges eredményeket, és visszaJ<üldi az NXProxy objeklunlnak
lvlcCll1logl1 fMcC87] a távoli objcl(lumok 11elyeltesek]{el való elérését tárgy'alja l SmaI]talk-
lJan. Pascoe [IJas86] azt írja Ie, hc)gyan. adh.atll11k "lnellékllatásokat' a meté)dus11Ívások110L
és a llozzáférés-s7al1ál)Tozá.sllOZ úgynevezett "egységbe zár()kkaJ" (En.capsulator).
K pcsolodo mint r
Illcsztó: Az illesZlől{ más feJiiletet bjztosít.nak az illesztett objektumo]{ számára, míg a lle-
lyeltesek felülete ugyanaz, l11int alanyail<é. MinlJ.a7()náltal az elérés védelmére 11as7ná1t 11e-
lyettesel( vissL:autasÍtll3tnak egy olyan rTIüve]etet, a111it az alany végrel1ajta]la, így felületük
az alany felli]etéJlek .ész11alll1aza is lellet.
DíszítéS: Bár l ciísZÍtől{ lnegvalóstása llasonló lellel a helyetteseJ<éJlez, a dísZÍtők célj;l más.
A d.iszítők új felelősségelcet d(lnlk egy ()bjektunlJloz, lníg a llelycltcsck lZ olJjektlJ]111107 va-
ló llozzátérésl szalJályozzál(.
Helyettes 22
A 11elyettesel{ fficgvalósíLásána]< ]lason.Jósága. a díszítőkéllez ]<üIönllöző le11et. Egy védelmi
l1elycttes ponlosln llgyanúgy lS lTIcgvalósítllató, mint egy dis7ítő, m.íg egy táv()li 11elyettes
nem 11ivat]{ozil{ lcözveLlcnüJ az alanyára, cS3.k olyan kÖLveLell }-li\Tatkozásokon kcrcsLtlil,
n1int ar11ilycn a sLánlÍl()géJJ azonosítója. és a célgél)en érvényes l1elyi cím. A virtllális Ilelyel-
lesek ]<e7detlJen a fájlnév11ez llascJnl() ]{()7vet]en J}iV3Xkozásokal 11kaIJlla7na]{, de 'légü] egy
közvetett lliva.tkozást szereznek meg és 11.3szn.3.lna!(.
A
· k-
.
I
.
I
r.
Olvasás !{özben t)i7onyára észrevettük a 113-sonlóság()1<at a szerkezeti minták kC}ZC)Lt, küli,}-
n()sen rés7tvevőil{et és azo!\: együLlműkc)d.ését il]etően. A llasunlóságc)l< valószÍl1űleg a.1JL)ól
erednel\:, 110gy nlinc egyi <. minta a kód és az objeklurnol< szenTezésére szolgáló nyelvj 570]-
gá.ltatásol< azonos rész11allna.Lára tál11aS7!<od.ik: az osztály alapú minták esetélJeo. egyszeres
és tÖ}J bszörös üri) kl és l, az o lJJ el\:turTIrnintálcnál o bj e kLtl m -()SS7 etétel t llasznál unl{. A ]-laS()111 ()-
ságok azon.llan elfedll( az egyes minták céljai közti különbségch:eL, e7érl ell1Jen a .-észben
()sszeJlason.lítjul( 3 szerkezeti nlinlá]< egyes csoIJortjaiL, ll()gy e](511yeiJzfől tisztál)lJ kél)el
1{3 pjllnl{.
Iles O vagy ld?
Az Illesztő és a Híti minta ()s7tozi!{ n.é11ány közös tulajd()nságon: .11indkettő a rllgalIl1assá-
got lámc)gatja azálta.l, 110gy l(ÖZ\'ctcll elérést n)TLÍjt egy objcktulnll{JZ, illetve Jl1illdkettőbcn
s7erepel az o1Jjcl<tuméLól eltéréS felületen keresztüli kérelemt()válJIJÍtás.
A l<ét lnint3. l(öLti IcgfonL()sallI1 kilJön.hséget céljuk jelenti. Az Jllesztő tnintl két meglevéS, el-
térő felülel összee\jyeztetésére összpontosít. A felüJete]{ megva.lósílá.sával, vagy e .llástól
független fejlesztésével nem f()glal]{oziJ{ va.glis arrl szolgál, 110gy l<ét ön3.llóan tcrvLzell ()S7-
tály egyiittlTIűk()d.ését 11izt()sítS3., 3.nélkiil, 110g)l l1árme]yi1< meg\7alósításál át kellene (loJgoz-
nunk. A IIíd minta ezzel SLCll1bcn egy el'l(Jnt fogaIJl1.3.t és 1.nnak (esetleg s7áIJ10S) megvalóí
tását l(öti össze. A megva]ósÍtó osztályok cserélgelllet(51{, 111égis staJ)"1 felületet 11)llljt az ligy-
felcl\:nel{, ezen](1vi.i] ]{önn.ycn 3.dllatók ll()zzá l1j Jlleg\la]ósítások a ren(l.szer fejles7tésc során.
Az említell különlJségek credmenyekéIJpen a7 Illesztő és a Hí(!111intát brylkran a szoftver
élcl(iklusánal{ ki..ilönböző pontjain a]](alrnazzál( Az illcszLéjkre általálJa11 a]{kor ffilJtatl(()zil<
igény a.lnil<or felfe(le7li.l]{ 110gy l(ét ÖSSLC nCITI egye7tetl1ető osztálynak együtt kel]ene Jn.ű-
l(üdnie (állalállan a kód megkelLő7ésének elkerülése végett), és el a csatolás előre nem Iát-
l1até)_ A hida.k alka.lll1azásánál viszont előre tudjuk, llOgy az aelott elvont fogal()n1na]{ szá-
nos megvalé)sltása l(ell lcgycn, és a l<ettéSo.e]< eg)rmástól [iiggetlenül fejIesztllctőnck kel]
ennie A7 Illesztő minti terve7és utárll)l.ltosítja az együtlI11líl<öd.ést, n1íg ct Hí(l n1inta i ter-
vezés elott bz nem je e11ti azt, 110gy az IlleS7tő alacsol1Y3.bb rcocl.ű l [- Í(inál, csupán a.zt rnu
tatja, ll()gy céljuJ l{ülönböző.
222 4. fejezet Szerkezeti minták
A homlok7atokra (lásd a Homlok7at m' ntát) gondolhatunk úgy is, mint objektumok hahlla-
L/.nak iUesztóire, de ez az értelmezés fibyelmen kívül hagyja azt a lényt, hogy a homlokza-
tok Új felületet lldtároznak meg) míg az illcsztők egy légi felület újrahasznosításával mű-
ködnek. Véssük jÓl észbe, hob'V az illes' tők mindig két létező felület együttmúkÖdését bi -
losltjál(, nem pedig lljaL Jlozna.k létre
..
Osszete 1, D's íto vagy Hely ttes.
AL Összetétel és a Díszítő minla szerkcLeLi diagramja hasonló, ami a7t tükrözi, hogy mind-
(ettő önhívó össLetételre épül, é Így rendez el kor átlan számú objektumot. Ez a hasonló-
ság a7t sugallhatja számunkra, hogy egy dÍS7'tő objektum neIll más) mint egy csÖkevényes
összetétel, de ennek semmi köze a Díszítő minta lényegéhez. A hasonlóság valójában meg-
áll 3.7 ön11\7ó ös7etétclnél- a J(ét lninta célja ismét CSdJ( egészen más.
A DíS7ítőt a Ta tervezték, hogy alosztályok s7ármaztatása nélkül adhassunk felel6sségekLl
,
objektumoki oz, Igy elkerülhető aT_ aIosztályok s7ámának robbanásszuű növe (edése, ami
bekövetkezne) ha statikusan prÓbálnánk a felelősségek minden lehetséges kombinációját
lefedni. A' Összetétel minta más céh s7olgál: az osztályok szerve ésére öSs7pontosít, lOgy
rokon obje (tumokat egységesen, illetvc öbb obJe numOl egyként kezelhessünk. Közép-
pCJntjában te}-1ál o_e 11 3 díszítés, 113.ncm a7 ál1rázolás áll.
Az említett célok kü önböznek, de kkgés7ítik egymást, amiből az is következik, l0gy a két
mintát gyak an együtt használják. Mindkettő olyan felepílé3t eredménye7, nlelynek révén
egys7erűen ol)jektumok egym.[ S1102 csatJakoztatásávaI, új osztályok l11egllatár()zása nélkijl
építhetünk programokat. Lesz egy elvont osztályunk, a .nelynek egyes alos7tályai összetéte-
lck) míg mások dÍS7ítők lesLnek, más alosztáIyok pcdi b a rendszer alapvető építé5köveit va-
lÓsítják meg. Fbben az esetben . díszítők és összetételek közös felü etet kapnak. A DíS7Ítő
minta sZemlJOntjállól az üss. etételek a K()nkrétElcm s7erepét töllik lJe, míg a7 Összeté el
minta felől tekintve a díszítők Levelek. A két nint.:it te _ .TIés.letesen nelTI muszáj együll al-
kalrna7ni, céljuk l)edjg - mint láttul{ - teljesen ]<ülönbüző.
Igy másik tervezési minta, amelynek szerke ete hasonló a Díszítőéhez, a Helyclles, M'nd-
két minta aZl írja le, hogyan b'ztosíthatunk közvetett elérést egy objektumhozt és mind
a helyettes, m'nd d d.íS7ítő objektll1TI ITIcgvalósítása cbY másik objektum a hivatkozik,
arnely lez kéreimeket továbbílanal{. A cé! azonban ebben az esetlJen is }{ülönbc)7é5+
A Dí7íté5höz llaS()n lóan a He yettes l1inta is összeállít egy objektumot, és 3,zonos felületet
nyújt az ügyfeleknek. Abban viszont mir különböz'k) hogy nem foglalkozik a tulajdons3-
gol{ dinamlkus csalc)lás5.val 6s leválasztásával, és nC111 is ön.J1JVÓ összetételre tC:r\le7ték+ Cél-
jl egy 1elyetles lliztosílása egy a.la.ny szá1nára, a.mikor a Inak közvetjen elérése J1eml{ívána-
tos vagy kényehnetlen, példaul mert egy távoH gépen található, elérése engedélyhe7 kötött]
vah7 lnaradand() (perzis7ten.s) objektum.
4. fejezet · Szerkezeti minták 223
A Helyettes minta klllcsa az alany a.melyJle7 a llelyct -cs elérést 11i7tosít, vagy lnegtaga(i.jt
a- t. A Dszítő 1.ntában az elemel{ csal( a szolgá]tatás()l< egy részét n.y(ljtjá]-c, a löbbiről a clí-
szítő]{ g()nd.osl(odna.k A DíSLÍtő minta l1as7nálalára al(l(or l(erii]llel sor, amikor egy ()lJjek
tlllTI teljes S olgáltatásl{öre nem határozllató l1J.eg f()rd.ításl<.or, \'agy lega]álll)is nel11 egysze-
ruen. Ez a mcgl1atáro allanság teszi az ()n]1Í\lÓ összetételt a DíS7ítő minta lényegi elemévé.
Ez a Helyettes minta esetéhen nem áll fcn.n, l11ert ill a küzélJpontban egyetlen l(a.pcsolal -
a helyettes és a]anya kapcsolata - áll, aTni statil(usan is kifejezllető.
Az említett klll()nbségek jelen.té5sek, 111Crt lnindegyil{ az objektul11 {öZponl(l rendszere { egy-
egy viss atérő prolJlémájára ad ncgoldást F7 a7(Jnban nern jelenti azt, 110gy ezel( a ter\'e
zés+ min.tá]{ nem llas.lnálllaló]{ ehryütl. Elképzell1.elő péld.ául egy olya 1 "llelycttcsdíszítő',
ami e b Y)7 llelyettest egészít ki új feladatokkal, illetve egy olya 1 "díszílőllelyettes") arni egy tá-
volí objektumot díszít, Az Jyen keverékc { haszna elképzelhető (bár gyakorlati példát nost
egyet sem tud .lánJ{ fell1ozni), de al11.i l)j Zlos, llogy felbont latéJI< valóbatl11asznos mi n tákra.
.
I
.
I
.
In
.
A viselked.ési minták l(özzépontjában az algoritmusok állnak, ille vc a felelősségi körök
110zzárendelése a7 objeklumok110z. E mintál{ nem csupán oS7lályc)k vagy ob>ektumok
renl s erét írják le, l1anem a l<özöttük f(J]Yó kommunikációt is, így a futásidőben ne 1ezen
nyomon }{Övet]lető, bonyolult vezérlési folya .l1atot Jllode lezil<, mégpedig (igy, lOgy éppen
a vLzéllésről telelil( e] a figye münkel, 110 gy aL objel<tumok között fennálló l{apcso atokra
összpo 1tos""thassunk.
A Vl!-:.e kedési osztálymintál( a l{Jvánt viselkedét őrc)klés segítségCvel rendel+k az egyes 052-
tályok110z. Ez a fejezet l{él ilyen mintát tartalrnaz, közülük a Sablonfüggvény (Template
Mel}10d) az egyszcrUbb és az iSD1ertebll. E m()dszer egy algoritmus elvont megllatározására
szolgál, al11jt lépés ő] lépésre ír le. Minden egyes lépés egy elvont Jnűveletel vagy egy alap-
műveletet indít e . Az algoritmust az aloszlályok töltik meg ta.rtaloffilnal, ami]{o megl1atá-
.;
rozzák az elvont műveletekel6 A másil( tt bemutatandó viselkedési osztá yminla az Ertel-
mező (Inter )rete .), amely egy oS7táJyhierdrc11ia Dflnájában ír le egy nyelvtant, anlelyl1ez
egy él1elme7(5l valósít meg az osztályol< példánYdival d.()lgozó műveletként.
A viselkedési objc {tuffil11inták öröklés he yelt objektum-öszetételt alkal1TIazna (. Egyes
tninták azt írjáJ( Je, hogyal1 működik együtt társobjcktu nak egy csoportja, ]10gy végrehajt-
11assanak eg); olyan műveletet, amit egyetlen objektum önmagában nem lenne képes vég-
rellajlani. III a7 a lényeges kérdés, l10gyan értesülne (egymásró a objektumok. HivatkoL-
hatnánal( l{" -ejezetten is egymásra, ele ekkor c:,atolásuk mértéke neml{ívánatos ll1ódon
megnövekedne; szélsőséges esetben 1 inde objektum. smerne minden objektumot.
A Közvetítő (Med.ialor) minta ezt úgy kerüli el, 110gy a társobje]{tull1ok }{ö é egy közvetÍlő
objektumot iktat be} amely biztosítja a laza csalolásho s7ükséges közvetettséget
A Fe előss(glánc (Cl1ain of Responsib 6 ity) 116nta ll1ég ennél is la. ább csata ast hoz létre t az-
állal, hogy megengedi, 110gy egy objektunma.k je ölt objel{tumol{ láncán keres lül rejtve
(üldjünk kérelmet. A kére met a Ulásidcjű körü ményekt61 függően bármelyi]{ je}ölt telje-
226 5. fejezet · Viselkedesi minták
sítheti. A jelöltek s7án1a nem kor .átos, Cs a7t is ITIc:gválaszthJtjuk, mely jelöltek vegyenek
rés7t futásidőbeJl a fclelősségláncbdn.
A Megfgyc1ő (Observer) minta objektumok közötti függőségeket határoz meg és tart fenn.
A Megfigyelő dasszikllS péld.ája a Smalltalk m()dellnézel-ve7ér16 (ModelNicw/C()ntroller)
felosztása, amelyben a 1110delJ minden nézele értesítesl kap, ha a n10dell áHapota megváltozik.
Más viselkedési obje]<tuI111nintál< ala.pja a viselkedések olljektumba 7árása, illetve a l(érel-
me - teljesítésének ezen objektuma (fa való átruhá ása. A Stratégia (Stratc:gy) minta cgy al-
goritmust tokoL be egy objc:ktumba, mcgkönnyítve ezáltal az algoritmus 111eghatáro7ását Ls
megváltoztatás.:it. A Parancs (Command) mÍnta egy kérelmet .lár egy objeklUmba, hogy a7
paramCterké 1t átadható, előzménylistaban tárolható, va,y más módon keze hetű legyen,
Az Állapot (State) minta egy objektum ál1apotaiból hoz lét.c önálló objektumot, így az ob-
jektum módosíthatja viselkedését, amikor állapotobjektuma megváltozik. A Látogató (Visi-
or) minta az olyan visdkedéseket zárja egységbe, amelyek másképp több osztályban len-
nének e osztva, a Bejáró (Iterator) pedig az öss7esítő (aggregát) objektumok elcmeinek el-
érésére és bejárdsára ad elvonlleírásI.
. . I
.. I
.
\Tiselkedési objektumminla
Egyeb nev k
Cllain of Responslbility, Válat,71ánc
C'l
A minta arra szolgál, ]lOgy clkerü.ljül{ a kéreleI11 küldőjének a [ogaci.é)}lOZ való kölését E t
úgy érjük el, hogy több objektumnak is jogot adunk a kérelem kezelésére. A fogadá objek-
tu 1110 km láncba állít juk, amelyen a kérelem a(ldig halad, amíg el nem ér egy obje rtumot,
ami ](épcs d kezeJésére.
F at
Adott egy grafikus felhasználój felület; ehhez szerctnénk környezetfüggő súgót készíteni,
vagyis azt elérni, 110gy 113 a fe.l1asználó a fellllet valamelyik elemére kattint, az a.dott ele]11-
l1ez segítséget kapllasson. A megjelenő súgószövcg a választott felületi elcmlé51 és anndk
környezetétől függ, például egy párbes7édab ak eh'Y gmTIbjához más in[ormác"_ó tarto z hat,
nint a főablak egy ugyanolyan gombjához Ha az adott elemhez nem tartozik súgószöveg,
a súgórendszernek az elem környezetérő] (például d párbeszédablakról, mint egészlől) kell
va amilyen általánosabb jnfo mácié}l m.egjelcnílenie+
Fe elősséglánc 227
Tcrll1ésLctcscn a.clóclik, llogyaL inform3.ciól(a.t az állalánossig foka szerint rend.e7zük,
a legk()nkrétablJlé)1 a legáltalán()sa)l)ig. Az is világc)s, l10gy a súgó nlegjele 1ítésére -ál1yuló
lcérclrnet több fell13.sználói felületi objel<tllffi is 1<.eLcl11Lti; az, 110gy az élllolllJillanatl)an nle-
lyik, l kc)rn)7eZellől é az elérllel(5 inf()rmácic) k()nkrétságáté)l függ.
A bon(l aZ J 110gy az információt tétlylegcsen sz()lgáltaté) ()lJjektLlmC)t a 1(érel1nel lailJ()csát()
o11jeJ<tum Cpé]d.ául a gom11) nenl feJtétlenü] ismerj. Vagyis eg')! olya.n. lJlÓds2Crrc 'lan szük-
ség, 3.111cllyel a.l<érelrTIcző objcktll1110t függe.tlcnít11ctjük az inforrnáció szolgáltatására kél1es
()I)jektLlmoklól. A :clelősséglánc minta CLt a mé)dszert l"lalár()zza Jl1eg
Az alipg()n(I()lal az, I-IOgy a kii.ld.é5l és a f()gat éJt azáltal válaszljuk s7ét, 110gy töll11 o11Jekturn-
D.a]{ is leh.etőséget adllo.l( a ]{éreleJ)J. teljesítésére. A l<érelem \Iégiglla.1a.d ezen objcl\.tUlTIok lá.n-
cán, élmíg ei:,ry olyan110z nem ér, amelyik ténylegeen végrellajtjd.
egyMentésPárbeszédabrak
keze1ő
agyAlkalmazás
egyNyomtatásGomb
keze I ő
kezelö
egyOKGomb
egyNyomtatPárbeszédablak
kezelő
kezelő
kDnkrét
általános
A lánc első objcl\.tlllna rnegl(3}Jja a kércl111ct és vagy lcljcsíli, \fagy tO\Tál)lJítja a lánc k{)\7etke-
7éS jeJ()ltjéJ1ek, ame]y llasonJ.é)](éppen cselekszik+ A l(érelmező objel<lUlTI nelTI tudja, IIIClyil(
objel{tu 11 fogja l<czelni a l{érést, ezért azt mondjul{J a kérelenl rejtett fogadóval Cinlplicil
reCei\Ter) reneie] l<ezík.
TCg}'Üh: fcl, 110gy a Jell13sználó klltintásal egy Nyc}mtat{ls (J]rint) feliratú gOlnlJl1.oz ](ér segít-
séget. A gom.1Jot egy Nyomt3tá.slárbeszéda.blal( (PrintDialog) l)éldány tartallnaZ.la, anlcly is-
n1eri aL Ől tarlalmlzó alkaln1azásobjektllll1()l (lásd. az el(5z(5 ál-)rát) A7 alábbi együttl11Űköd.ési
diagram a7llllutalja }logyan tová111JJtóciik a kérelern a felelősségJánco 1 keresztiil:
2 8 5. fejezet · Viselkedési minták
egyNyomtatásGomb egy Nyomtatás Párbeszédabla k
egyAJkalmazás
KezeISúgó()
Keze[Súgó()
Ebben az esetben sem az cgyNyomtatáGomb Ca PrintButton), sem az cgyNyo ntatásPárbe-
szédablak (aPrintDialog) nem kczeli a kéreln1et; a7 az egyAlkalmazás CanApplication) ob-
jektUlnnál áll meg, amely vagy válaszol rá, vagy figyelmen kívül hagyja. A ké -elmet kibo-
csátÓ ü\:Nfél nem hivatko7ik közvetlenül a végrehajtó objektumra.
Ahhoz, hogy biztosíthassuk a fogadók reJtettsé!,Ú és továbbíthassuk a kérelmcl a láncon át,
a lánc objeklllmai köz()s felülettel rendell{cznek, ami a kérelmek kezelését é a lánc követ
kező elemének (kÖvető, successor) elérését írja le. A sÚgórendszer )éldául lTIcghatározhat
egy SúgóKe7elő CHclpHandler) nevű osztályt, a megfeleléS KezelSúgÓ CHandleI Jelp) műve-
lettel egyiitt. A SúgóKezelő lehet a jelölt objektumosztályok szülőosztálya, de mcghatá .oz-
ható lnixin C,bekcveredő") osztályként is, Ekkor a súgókérelmcket kezelni kÍvánó osztá-
lyok szülővé tellclik a SúgóKezelőt:
sza o
Súg6Keze/6
.... KezBISúg6() 0- ----... kazel
---
/\
. .
almazás V zérl
- -.-; -... J\ - --
Párbeszédablak Gomb
K zalS úg60 o -
MutatSúg6()
k: [
6-> Keze1Sl1g60
i képes keze {
MutatSL1g6( )
} else {
Kezelő:: Kez IS (í g6()
}
Felelósséglánc 229
A Gomi) (Button) Párbeszéda111ak (D'alog) és .AJka]Jnazás CApplicalion) osztályol{ a súgó-
J{érelnleket a Sú b óKe7elő CI-IelpHandler) n1űveleteinek segí ségévei teljcsít.k. A Ke7elSílgó
(HandleHeIp) művelet aidpértelmezés szer'nt a kérelmet a (övctkezÓ jelölthöz továbbítja;
a7 alosztályol( c lnűvelet fe]ülb álásával jeJenít]1etnel{ meg Súh()t JTI.egfelelő l{örnyezet ese-
tén, más esell)en pedig a.2 alapértelmezett l1egvalósítás S7erÍnt továbbítják a ](érelJnet.
Ali alm h osag
A Felelé5sséglá.l1c minta a kc)vet!<.ező esetekben alkalmazl1ató:
Egy 1{érelll1ct egynél t()11lJ objektum ke7e11et t a kezelő ped.ig előr'e ncrll ismerl a7t
3.utamatikusan l{elll<ijelölni.
· Anélkül szcretnénk kérelmet intézni töblJ objelctum valalnelyikéh.ez, 110gy konkré-
tan megllatárc)7nánk a fogadól.
· A l<ére]em teljesítésére képes objel{tuffic)k Jlalmazát dinalnikusan l(elllneglldtárc}zn.i.
S erk et
Ügyfél
, r
övetó
Lll- Keze/6
KezeIK rolamO
/\
Konkrét ezelé1 KcnkrétKezeh52
Kezel Kére[e m{) Keze IKérelam()
Az objektLlnlS7erkczct vall110gy így festllct:
egyÜ gyfé I
egyKezelő
egy orkrétKezelo
követő
egyKonkrétKezelo
köve ő
230 5. fejezet · Vise[kedési minták
Résztv vők
· Kezelő (SúgóKezclő)
- Felülctcll1atároz meg a kéreIT11ek ]{ezeléséllez.
Megvalósítj3. a kÖVClkeh() jeJöltl1öz való l{apcsolódást. (Nem kötelező)
· KonkrétKezelő (!\íy()mtatásGomb, Nyc)mtatásPá.rbcszécJall]ak)
- Kezeli a feleJé5sségi körélJe tartozó l{érclmekel.
- Képes elérni a kC)\Tetkező jelöltet
- I-Ia a IZonkrétKezelő (Con(reteIJan.dlcr) képes teljesíteni a kéreIJl1.et, a.kkor teljesí-
ti, egyél1J(ént lJCtlig tc)vál11)ítJ3. a r{11(övetke7ő jelöltnt:l\..
...
· Ugyfél
- Kéreln1.et intéz a lánc egy Konl(rétl(ezelé5 olJJe}{tllmállo7.
Egyuttmúködés
· i\mikor ;:17 ügyféll(érelI11et lJocsát l<i, a kéreJeJll \régigllalld a ]áncon t ill1íg ew? Konk-
rétKezelő objel\tllnl feJelősségct nem válJa a l(czeléséért+
,övetkezmények
A FelelősségJánc Jllinta clőn}rei és J1átra.nyai a követJ<ezők:
1. Lazább csatolás+ A lninta szükségtelenné teszi, llogr a 11ÍV{)J, tud.jál<, Illelyik objek-
tum milyen kérelmeket keLd l csak azt kell tudniuk t hogy a kérelem kezelése "meg-
fele16cn" nleg fog törlénni. Sem a JcüldŐ J sem a fogadá nem tud Cg)rlnásréJ]; a lá.nc
objektl1Jll.3.i113.l< l lánc szerkezetél sem kel] iS111Lrni[iI{.
MindcLek erednlénycként a Felelósséglánc egyszerűsíti az objektumok kÖ7:Ötti kap-
csolatokat: az objektumok nem hivatkoznak minden fogadójclöltre, csak a rájuk
]<övctkcz(Sre.
2+ f.lagJ,ohh rugalJl1asság {lZ objekttlr},lOkrelel{fsségi köréllek kij+elölésébett. A Pelelősség-
lánc lninta nagyobb szabadságot ad az objektumok feladatainak kioszt1sában: egy-
egy kérelern J.ccLcléséllez futá.sidőlJen is j(iegészít11etjü]( vagy más m()dc)n JnóclosÍl-
hat juk a láncot, de ezt párosílhatjuk azzal is, hogy bizonyos kérelmek teljesítésére
sZ3.l(os()dott aJos2tály()kat Jlozunl{ létre slatikusal1.
3. A kérelem teljesítése nem garantált. Miután a kérelmeknek nincs konkrét fogad6juk,
]<ezelésül\:re nincs semrnilyen gara11cia - a kérelern végigllaJadllat (] láncon, -lnéJ.k(il,
llog)7 egyetlen o1Jjektum is válaszoIna rá Ez 3.kkur is megtörténllct 111 a lánc beállítá-
sa nem megfele1ő
Felelósséglánc 23
Me valósItás
A Fele]ősséglánc minta megvaJ.ósításá\lal kapcsola.tbln a kC)\Tetl<ező dolgok léI1yegcsck:
A hJvatkozási lá11C rllegLalósílása. A ]ánc kétfél<:képpen l10z11ató létre:
,.
Ca) Uj }livatJ{()zásol( megllalároz3.sáv3.l (pz áJtalá.1).n a Ke7előbcn történik, ele
a Konl(réll(ezelé5k is m.egtclletik.)
Cb) A meglevő ]11vatl(ozásol( felhaszn.3.l.sáv11.
Az ed.d.igi lJéldákban új llivatkozásokit al]<alnl3.ztun!<, d.e a lliva.tkozási lánc létrello-
zásállOL sol( esetlJeo. ]1asználl13tjlll< a Jneglcvő ()t}jel<tl1JTI.11i\'3.tk()zásoJ{at .s. Ilyenek
le]letnek pélclául a rész-egész llicrarc]-1iá]{ sZiilőllivalkc)zásai.; ;1 gra.fiklJS felületi el c-
l11ek altalát)élt1 tartalm3zna.k il)!enel{et. Az Összetéle] 111illt1. iSInertetésénél részlete-
selJl)e!1 is l{itérünl( a szülé5111.Vat.1{ozásokra.
A_ lTIcglc,/(j llival](ozások 113sználata aJ<]{or célszenJ, 11.a illcszkcdnel< d létrcllozdnc1é)
lá11(11()Z. A1ne 1nyibcn megfeJelnel<., l11cgkín1é]nel( minket atte)l, llOgy. (ljakat ]{elljen
létrelloznunk, és llellet takarítana]( rneg. Ha azon11111 d. szcrl<'Lzet Jlell1 tükrÖLi lZ l]-
kllIl1azás igényelte felel(5sségláncot., i szü]{séges 11ivatJ«()zás()kat létre kLll ]1ozlll1nk.
2. Az. elelnek összekötésc. lIa nincsenek m{lf Jétező llival]«)zásol( a lánc létrellozá.sállOZ,
l11aglln](n11( kell aLukat elkészíten.ünk. El)t)en az esetben a Kezelő (HaneJler) neln
cSll{ felületet biZlC)S1l a kérclmek kelelésél1cz Ilanen1 a KczclKéreleJll (Hanule
("
Requcst) alapérte!Jnezctt mei:,'Valósításában hivatkozást is a következő jelÖltre,
all1elylleL a l{érelmet továL1l1ítja. l-la valarneJyil( KonkrétKezelő 3.losztály-rra nem tarto
zil, az 3,(I{)tt kéreleJ11, 3. továbbíté) mŰ"'leletet nem keJl feJ.üllJírálnia, Jliszen 3.2 alapér-
telmezett m.eg\ral()Sllás feltétel nélkiiltová11111t.
Íme a SÚgÓKezelő (IIelpHandler) alaposztály, amely a hivatkozást tartahnazza:
class HelpHandJer {
public:
HelpHandler (HelpHandler* s) : _succcssor(s) {}
virtual vaj d Handlellel p () ;
J)rivate:
HelpI-IancJl cr* successor;
} ;
void HelpHandler::HandleHelp{) {
if (_succcssor) {
succcssor->HandlcHelp() ;
}
}
::, A kér"ell1Zek ábrázolása+ A lzérclrTIcl( á11rázoJ3.s3.r3 lüLJll Ielletóségünk is \Tan A legcgy-
szerű})1), lll i l<ére]Jl1.et a kó(lba "cirótozott n műveletl11vásként ac1jll]{ rneg, rninl all()gy
a Ke7elSúgó (HJndleI JeJl)) csetében is tettül{. EL l{ényelmes és biztc)nságos, igaz,
csal{ 3.zak l kérehll.e.k továbbítl-Iatók fg)!, a.mcl)lel<et a !(cLclő osztály megllalárc)z.
232 5. fejezet · Viselkedési mintak
Egy másik lelleté5ség t ]10gy egyetlen ke7e1ő fllggvényt írunk, ami pa a .néterl(ént kaJ]-
ja meb a kérelem l(ódjit (pélcLlul egy egész számot vab'Y l{arakterlá.ncot). Ezzel a ké-
re]mel{ llalmaza kc)rlát]an.ul bővíd1elővé válik; a): egyetlen megkölés, 110gy a küldó-
nek és a fogad.ón.ak l11Cg l(cll egyezr1ie a ]{ére]em kódolásábal1.
E7 a megközelítés rugalnlasabb, de feltételes utasítások.at igényel, amelyekl{el a ké-
relem a kód()lásától függőcn t(Jvál)llÍtl1ató Ezen l{Ívül a paraméterek át3.dá.sára nincs
típuslli7tos mód, vagyis nlagun.J<nak kell be és kicsomagoln.unk azokat, ami nyil-
vál1valóan kevésbé 11iztOl1Ságos, minlila kC)7vetleo.ül11Ívnánk meg egy műveletet.
A paraméter-átadási problél11a rnegcJlcJ.ására önálló kérelen10bjektuJnokat 11asznállla-
tllnk, amelyek össefogjáJ{ a l(érclcm-pararnétereket. A l{érclmeket mondjuk egy
Reques t (Kére1enl) neVŰ oSLtály képviseJ]leti, (lj kércJcmlípus()I<at pedig úgy ve11e-
lünk fel t 110gy alosztályc)kat száflnaztatunk ebből IZ oS7tályból. Ezek az alos7tályok
aztán 1{ülönbö7éS típusú pararnétcreket I-latározllatna.k lneg. A ke7előkn.el{ iS1TICrniük
kell d kérelem tíl)Usát (vagyis ]logy melyil{ Requesl a]osztályt llasználják), 110gy
]lozzáférllLssenek a paratnétercklleL.
A kérelem azonosításállOZ a Reques t mcg11atározl1al egy elérő függvényt, amI az
adott osztály dzon()sJtóját aclja vissza. Egy másik Jl1.egoldás 1 110&1]' - amen.nyiben
a Illcg\Talé)sításl10Z llasználl nyeIv támogatja - a fogadá a futásidejű típusinfornláció-
kat hasznalja fLI.
Ílne egy továbbító függvény váLlata: amely a ké .-elmek aLonosításáho7 kérelemobjek-
tlJmo1{at l1asznál. A kérele II típusát a Reques t alaposztályban megadc)tt GetKind
(SzerezTíl)Us) művelet l1atározLa meg.
void Handler: :HandleRequest (Hequest* theRequest) {
switch (theRequest->GetKind()) {
case Help:
//a a-gumentum átalakítása a megfelelő típusra
HandleHelp( (HelpRequest*) theRequest);
break;
case Prjnt:
IIandJ cprint ( (PrintRequest *) theFI\.equest);
/ / . . .
break;
de fau.l t ;
1/. · ·
break;
}
}
Az alosztályTok a to\ráL111ítást a l-IandleRequest (K.ezell{érclem) felüll1Jrálásával bő
vítlletik, fgy csal{ azokat a kérelmel{et kezelik, amelyel{re sZ3.kosodrak, a l()bbit
a szülőosztályl1()z továbbtjál{. Ez a I{andleRequ.est műveletnek hatékony bővÍtésc
(nem is felülírás3). Lássunk egy példát t 110gyan bő\rÍllleti egy ExtendedHandler
(BővítettKezelő) nevű alosztály a I-Iandler oS7tály HandleRequest-válloza.tá.t:
Felelósséglánc 233
class EvtendedHandler : public Handler {
public:
virtual void HandleRequest(Request* the Request);
/ / . . +
} i
void ExtendedHdndler: : HandleRequesl (Request* theRequest) {
sw.tch (theRequest->GetKind()) {
case Preview:
lia Preview - Nyomtatási kép - kérelem kezelése
break;
default:
lia többi kérelmet a Handler-re bízuk
Handler: :HandleRequest{theRequest)i
}
}
1.. Atf.tolnatikus továbbítás (Snzalltalk). A SJJlallta.lkban a kérelmek továblJÍtás2.ra
a doe sNa t Unde r stand l1asznál11ató) melynek meg\ralósftása elfogja a megfelelő
metód.ussa] nem rendell(ező üzeneteket. A doesNotUnderstand feIil1hírálás3.val az
üzenet az objcktumol követéS olljekturnl10z továbbít11ató) így a tO\lálJbítást nem szük-
séges maglInknak l11egvalósítanunl<; aL osztályok csak a 1102zájuk tarto7ó kérelmeJet
ke7elil{, a többit a doesNolUnderstand segítségével más oS7tályolz.loZ továbbítják.
Péld kod
A kö\retkezé5 péld.a azt illusztrálja, ll()gyan ke7e]i a felelősséglánc a súgórendszcrllez inté-
7ett kére]mel<et. Maga a sllgókérelem itt konkrétan l(ifejezett művelet. A l{érclmeket a lánc
grafikus felületi elemei !{özött a gra "'ikus elemel< Jlierarcl1iájában jelenlevő szi.ilőI1ivatkozá-
s()k segítségével továbbít juk, a. egyéb elemel( pedig a Kezelő (IIan.dler) osztályban meg-
llatározottllivatkc)7ás révén l{a.pják lneg.
A HeJ pHandler (Súgé)Ke7elő) osztálya súgókérelmel{ ]{ezelésénck felületét l1atározza
rneg. 1 arta]n1azza az alapértelmezett (üres) súgótémal{ört (help l()pic), illetve egy 11ivatkc)-
zást a lán.c kövctl{LZŐ súgókezelő e]em.ére. A kulcsmíívelet a HandleI-íelp (KezeISúgó),
tmLlyet az alos7tályol< fe!ülÍrna!(. A HasHelp (VanSúgó) lnűvelel célja, ]10gy (ényelmeseb-
l1é tegye annak ellenőrzését, })()gy Iétezil(-e az adott elem11ez l10zzárendclt súgótémakör.
typedef int Topic;
const Topic NO_HELP TOPIC - -1;
class He]pHandler {
public:
r-IelpHandler (HelpHandler* = O, Iropic :: NO_HELP _TOPIC ) ;
virtual boal HasHelp();
virtual void SetHandler(HelpHandler*, Topje);
virtual void HandleHelp();
234 5t fejezet · Viselkedési minták
private:
JlelpHandler* _successor;
Topic tüpic;
} ;
HelpHandlcr: : HelpHandler (
HclpHandler* h, Toplc t
) : _succcssor(h), _topic(t) { }
bo ol HelpHandler: :HasHelp() {
reLurn top ic != NO_HELP_OPIC;
}
vuid HelpHandler::HandleHelp() {
if (_successor != O) {
successor->HandleHelp{};
}
}
Valamennyi grafikus elem a Widget (Vczérl6) elvont osztály al osztálya , alni viszont a
HelpHandler alosztálY:I, hiszen a fell1as7n.álói felülel va13.J.ncnnyi eleJllé11ez lartoz11at sú-
gó. (Természetesen Jllixi.1 alapú megva .ósítást is Ilaszn.1.l11attllnl< volna.)
class W "_dget = public Helpr-Tandler {
prot:.ected:
WJdget(Widgel* parenti opic t - NO_HELP_TOPTC);
prlvale:
Widgct* _parent;
} ;
Widget: :Widget (WidgeL* WI 'l'opic L) : HelpHandJGr(w( L) {
--parent = w;
}
Példánkban a lánc ds6 kezelódeme egy gomb (button). A But ton oSLtály a WidgeL a]-
osztálya, konstruktora pedig két paIamétert vár: egy hivatkozást az (St tartalmazó gatlkus
eleJnre j illet\'e a súgótéma]<ört.
class Button : plJblic Widget {
public:
Button(Widget* d l 'lopic t - NO_I-1EI,P_'l'OllC) i
virlu.a.l void HandleHelp ( ) ;
1/ A Button által felüJirt Widget műveletek...
} ;
A Button HandleHelp-változata először eIJenőrzi, hogy léte.lik-e súgótémakÖr a gom-
bokhoL. lIa a fejlesztő nem adott meg ilyet, a kérelelll a HelpHandler-ben meghatáro7:ott
l1:andleHelp 111(ívelet segítségével továbbíl()C1ik a l{övctkező jelöltl1ö7. Am.ennyiben létezik
s(lgótélnakör, a g0111b l11egjelen.íti azt, é 3 keresés lJefejezőclik.
Felelősséglánc 235
Button: :Button (Widget* h, Topic t) · W>dget(h J t) { }
void Button: :HandleHGlp () {
if (Has1lelp ( )) {
II súgó a gombhoz
} else {
HelpHandler: :HandleHelp();
}
}
A Dialog CPálbeszédablak) llasonléJ Inegoldást ad, de el<kor a következő jelc)lt nen1 egy
rnát,ik grafikus e]eJl1., ]1anem bárlnilyel1 sllgé)ke7elő lellct. A l)emutatott progra.I11ban a jelölt
a7 App 1 i c at ion CAll(almazás) oztály eg)' péld3.nya lesz.
class Dialog : public Wldget {
publlc:
Dialog (HelpHandler* h, Topic t = NO_HETJP _1'OPIC) ;
virtual void HandleHelp();
II A Dialog áltaJ felülírt Widget műveletek..
/ / . . .
} ;
Dialog: :Dialog (HeJpHandler* hl Topjc t) : Widget(O) {
SetHan.dler (h, t);
}
void Dialog::HandleHeJp {) {
i f ( 1-1 a s r-r e 1 p ( )) {
II súgó a párbesédablakhoz
} else {
HelpHandler::HandleHelp();
}
}
A lánc végén az !\pplication egy példánya áll AL alkalmazás nem grafiklls elem
(Widget), így 3.Z Applicatj on közvetlenül l HelpHall.dler oszlálybéJ) SZár111.azik+ Amikc)f
egy súgókérelem erre a szintre ér, az alkalmazás sajá.t magáról szoJgáltatl1.at általános infcJr-
m.ációkat, va.gy fclajánll1alja a súgótéma.körök listáját:
class Application : public HelpHandler {
public:
Application(Toplc t) : HelpHandler(O, t) { }
virtual void HandleHelp();
/1 az alkalmazásho- tartozó műveletek...
} ;
voiá Application::HandleHelp () {
I / a súgólémakörö]<: listáj ának meg j elení tése
}
36 5. fejezet · Viselkedési minták
Az alábbi kód létrehozza és öss7eköti az emIített objektumokat. Párbeszédablakunk egy
nyon1tatási IJárl)eszédablak J e7ért az objektumokhoz a nyomtatással kapcsolatos télnakö-
rök tartoznal{
const Topic PRINT_TOPIC = 1;
consL Topic PAPER_ORIENrATIONrrOPIC - 2 i
const Topic APPLICATION'rOPIC = 3;
Application* application = new Application(APPLICA1ION_TOPJC);
Dialog* dialog - new Dialog(application, PRINT_TOPIC) ;
Button* but ton = new Button(djalog, PAPERORTPNTATION_TOPIC);
A. súgó megjelenítésére irán.yuló kérelmet a HandleHelp-et a lánc valame]yik objektumára
meghívva adhat juk ki. Ha a keresést a gombnál s7eretnénk ke7deni, a gombra ke 1 meghív-
ni J művejetet:
button->HandleHelp() ;
Ebben az esetben a gomb a onnal kLLelni fogja a kérelmet. Figyeljük meg, hogy a Dialog-
ra bármeJyik HelpHandl er osztály követkeLhet t sőt az, hogy a sorban melyik objektum
követkeLik, d.inamikusan mÓdosítható, igy nem számít, melyik párbeszédablakot nyitolluk
In eg , rnin.denl<éppen a lnegfLlclő k{)rnyezetfüggo súgót indítllatjuk el
Ism rt f Ihas nalasok
A felhasználót események kezeléséhez zámos osztálykönyvtár alkalma7za a Fdelősség-
lánc mintát. A Ke7elő osztály neve ugyan különbÖ7het, de az alapgondolat ugyanaz: ami-
kor a felhas7náló kattint dZ egérrel vagy lenYOlTI egy billentyűt, egy esemény váltódik ki,
ami végigfut a láncon. A MacApp lApp89] és aL E r++ rWGM8B] az "eseménykezelő" (Event-
1 Jandler), a Symantec 11CI könyvtára lSym93bl az ,ügyintéző" (Bureaucrat), a NeA!
AIJpKit-je fAdd94] pe(ijg a "válaszoló' (Respo11der) nevet használja.
A grafikus s7.erkesztőprogramok Unidraw keretrendszere parancs (Command) objeklumo-
kat határoL meg, amelyek a Component (Elem) és ComponentView (Elem1\ézet) objcktu-
1110k felé irányuló l{érelmeket zá.rják e!:,ységbe+ A parancsok ilyen értelemllen kérelmek, J1i-
szen az összetevők vagy nézetek egyr .11űvelet végreJlajtásállOL ugyanúgy a Megvalósítás
részben bemutatott "kérelmek mint objektumok" eJv alapján értelmezik a kapott parancsot.
Az c..lemel{ (COffi!)Onent) és nézeteik (Co111ponentView) hierarcllikus rendbe állítl1atók
melylJen a. l)arancs értelmezésél az eleJl1.e ( a szülőjüknek továbbíthatják, ami 37tán. továb-
lJítja azt a saját szülőjéne)<, és így továl111 - vagyis előáll a felelősséglánc.
Az ET ++ a grafikus friss"'tésllez llasLnálja a Felelősséglánc n1jntát Amiko. egy grafikus ob-
jektumnak frissítenie kell CbY rés7e megjelenítését, az InvalidateRect 111űveletet hívja meg,
amlt a grafikus objektumok maguk nem képesek kezelni, mert nem tudnak eleget sajat kör-
arancs 23
nyezetükről. E ófordulhat pé dául, 110gy az objeklllffi a kooord.inátarendsze ét átalakító
Scroller (Gördítősáv) vagy oamer (Nagyító) objektum a ágyazó ik, vagyis az objektum
görgethető, i letve nagyt .ató, így egy észe néh. nem látható. Emiatt az InvaldateRect
alapértelmezett megvalósítása a rissí ési kérelmellovábbadja a befog alá táro ó ob.ek Uffi-
nak. A továbbítási lánc utolsó agja a Window (Ablak) osztá y egy példánya Am ko a kére-
lem a Window-hoz érJ a rissÍtendő terület koordinátáindk megfe elő áta aktására már biL-
tosan sor ketilll Az InvalidateRect műveletet a W. ndow úgy kezeli, lOgy érteílést . ülci. d7
ablal(kezelő rendszer felü]etének és fr ssítest kér.
'- pcsolódó minták
A Fe elősségJánc m..ntát gya :r an ]1asználják együtt az Összelétel m.ntával, allo a7 elemek
szülői jelentik a ánc következó elemét
.. · n
Viselkedési obje ?"lumminta
CI
A kére meket ob'ektumokba zárjuk) aminek célja, logy az ügyfelel{nek paraméterként kü-
lönböző kéreImeket adjunk át, eze]{et sorba állítsuk vagy naplóLzuk, illetve lámogassu {
a rnűveletek visszavonását.
Egyéb neve
Command, Művelet, Akció (Action), Tranzakció (Transaclion)
F dat
Időnként szükséges lehet olJjektumol{lloz anélkül intézn kérellTIckLt, 110 6 '1' a kérelmezelt
műve et ól vagy a kérelem fogadójáról bármilyen ismeretünk enne. A fell1aszná ói felületi
es köz- vagy ele 1 készletek_ példáu olyan objektulllo {at ta.rtalmaznak, mint ;1 gombok és
menük, anle]yel< a felhasználó tevékenységétől függő műveleteke hajtanal{ végre (vagyis ké-
relmeke leljesítenck). Maga az elemkészlet azol1ban nem adl1at konkrét lnegvalósítást a ké-
relmekhez magukban a gombokban és menükben, hszen csa a adott elemkészletet 11asz-
náló alka ma.zásD ( tudják, melyik objektumnak mit kell cs.nálnia. Az eleml{észlet fejlesztője
nem ismerheti e1őre a kérelem fogadóját t jllehTe a.2 általa végre11ajtandó muve ele ret.
A 1) drancs terve7ési minta lehetővé teszi az elemkészlete ab' ek umaina r, hogy meg nell1
l1atározott a ]{almazás-objektumo { 102 inlézzcnek kérelmeket, mégpedig úgy, 110gy magu-
kat a l{érc meket is objeklumokká alakílják. Eze]{ a7 obJe {turnak azután ugyanúgy ldfol11a-
....
238 5. fejezet · Viselkedés. minták
tók és továbbadllatók, lninl más objektllD10k. A minta kulcsa a7 e]vont Parancs (Command)
osztály! amely a műveletek végrehajtásához bi7tosít felületet. LLgegyszerlíbb form.ájában
a felÜlet egy elvont Végrehajt CExecute) mlívelctet tartalmaz. A konkrét Parancs aloszlályok
a fogadá példányváltozÓként való tároJásával LS a Végrehajt-nak a kérelmet meghívó Incg-
valósításával egy {ogadó-művelet párt határoznak meg, A kérdem teljesítéséhez szükséges
l\.él)ességekcl a foga.dó tartal 01a2Z3..
....
Alka[mazás
Menü
MenüElem
Parancs
parancs
HD ad(Dokumentum)
Hozzáad{MemjErem)
Kattintva{} ?
VAgrehEljt()
Dokumentum
aran cs-> Végrehajt{
=----.....
MegnyitO
Bezárn
tGvég()
MáselO
Beill eszt()
A Parancs ()lljektulll()kkal a InenijJ{ l{önnyen eJ]{észítllclé5k. A menük (Men,ü, Menu) Ininclen
eleme a MenüElem (McnultenJ) osztály egy példánya A menüket és elemeiket a felllas7D.á-
lói felülct cbryéh részeivel együtt a z Alkalmazás CApplication) osztály hozza létre. Az Alkal-
rnazás osztály gondoskodik a felhasználó által megnyitott Dokumentum (Documcnr) objek-
lumo]{ nyilvántartásá.ról is.
Az alkahnazás minden rnenülemd vaJamelyik 1 arancs alos7tály egy pék ányával áHít elő.
Amikor a felhasználó kiválasztja az egyik elem.et, a MenüElem a h07Zá tartozó parancsra
lneghívja a Végrehajt (Execute) műveletet, az pedig végrchajtja a parancsot. Maguk a llle-
nüeleIllck nem tudják, hogya Parancs melyik ::dosztálya kapcsolódik hozzájuk. A P3r2ncs
alos tályok tárolják a kérelem fogadÓját és meghívnak rá egy vagy több művelctet.
A Beilles7tParancs (PastcCornmancl) például szöveg beillesztését teszi lchetővé a vágólapról
a dokull1entUll1ba. A parancs fogadÓja az a Dokull1entum objektum, amelyet példányosítás-
kor megkapj a Végrehajt m(ívelet pedig a Beilleszt (Paste) parancsot a fogadó dokumcntum-
ra llívja meg.
P rancs
Végrahajt(}
Do "umentum
/\
=r='W' =-- =-".
Megny.t()
Bazár() dokumentum
Kivág() ........ BeillesztParancs
--
Máso I()
Bei IesztO Végrehajt() o - - - - - - -
... -+- - - dokumentum-> B iIIeszt()
Parancs 239
A Mcgnyitlarancs (OpenCoI11man{J.) VégreJ-lajt művelete ettől cllér: a fclllasználótól egy do-
kllJllentun1ne\ret kér, létrclloLl.a a.z eo.nek Jl1.egfelelő })O]<ul11entuI11 ()l1jektuIllot, lzt 110Lzá-
adja a fogadá a.lkall11.azásJ1.oz, mlj(i megnyitja a dokum cn lu III ol.
Parancs
Végrehajt()
/\
I
A[kalmazás I
.
- MegnyitParancs
-
Hozzáad (Ookumentum) al ka 1mazás
Végreh ajt() o
I
KérFe[haszn ál6() I
.
I
név = KérFelhaszn áI6()
dokumentum = new Dckumentum(név)
akBI m azás > Hozzáad(d okumentum)
dc kumentum-> Megnyiti)
El é5fordtl II-1 al, 110 gy egy mcnüelem.1.ek parancsole ...\orozatát I{elI \régrellajtÍ-lnia. A d.cJkumcn-
tumolclalt n.orrnál méretl1en ]<özépre t1elyező MenüElem például egy Dol(U111entunlKözépre-
Parancs (CentcrDocumcntCon1n13.nd) és egy Norrná1MéretI)arancs (N()fJna]SizeC()ffiInand)
objektllmllé)l épülhet fel. Miután a parancsok ilyetén összefűzése eJég g)7akofi eg\! lVIakré)-
]Jarancs (MacroConunand) nevCí osztályt lélrell()7la lel1elé5vé le}1etjük, }l()gy a 111enliclcl"llCk
korlátlan számú parancsol llajLllassa.nlk végrc
A M.(] leróJJa ran cs l I)arancs kc)nl(rét alosztá.l)la, an1ely egyszeruen. paraJ1Cso]{ soro7:atát II ajt ja
végre. Nincs kifejezette!1 megadott f()gacié)ja, Inerl az általa sorban végrcl13jtott palancsol{
JTIegllalárc)zzák sajál f()gadójlll(at
Parancs
...
Végrehajt{} -- -
/\
I
, parancsok
Makr6 arancs <:>
Végrehat() 9
I
fo r a II c in parancsok
c- > Végrehajt{)
240 5. fejezet · Viselkedési minták
A fenti példák mindegyikében megfigyelhetjÜk, hogyan választja el a Pa anc<; minta a műve-
letet kezdeményező obje :tumot a művelet végrehajtásának képességévei rendelkező objek-
tUlntól. Ez igen nagy 11Jf.,almasságot ad a felhasználói felüjet mehtervezésében, hiszen --gy
egy alkalmazásban egy szolgáltatáshoz menÜt és parancsgombot 's kapcso hatunk, ha azok
ugyanazon Parancs alosztály egy példányán OSZlc)Z11ak. A parancsok d. 13.mikusan ki is cse
rélhetők, ami kÖrnyezetfüggő helyi menük megvalósításánál jöhet jól, a pa ancsok nagyobb
egységekben való egyesítésével pedig a parancssorozatok összeáJIítását támogathatjuk.
Mindez azél1 lehetséges, mert a kérelmet kibocsátó objektumnak csak azt keJl tudnia, ho-
gyan adja l<i a kérelmet; annal{ végre113.jtá.si módjáról nem kell ismeretekkel rendelkeznie.
....
alm atós I
A I)arancs lninta l1asználata a következő esetekben célszerű:
Objektumoknak paraméterként egy végfchajtandó mlíveletet s7eretnénk átadni,
11lint ahogy feJjebb, a MenüElem obje cturnak esetében '5 tettük. Az ilyen paraméte-
re7és módja az cljárás]{özpontú (proced.urális) nyelvekben a visszahivható (callback)
függvények használata. A visszahívható függvény olyan függvény, am't egy adott
ponton bevezetünk, de később hívjuk meg. A p.lrancsok a visszahív ható függvények
objcktumköLpontú rnegf elelői.
· Kéreimeket különbÖző időpontokban szeretnénk meghatározni, sorba állítani, illet-
ve v"égre 1ajtani. A Pa anes objektumol< élettartama függet]en le11et az ered.eti kére-
lemtő1. Ha a kérelem fogadóját címtér-független nlódon ábrázoljuk, a kérelemhez
tartozó parancsobjektumot egy másik folyamathoz ir.ínyíthatjuk és ott teljesíthetjf k
a l(érést.
· Támogatni szeretnénk a művelet-visszavonást. A )a ancs Végrehajt művelete hatásá-
nak meg ordít.ísához állapotokat tárolhat. A Parancs felü1etnck rende keznie ke 1 eby
Visszavon CUnexecute) művelettel, ami megford--tja egy korábbi Végrehajt hívás hatá-
sát. A végrehajtott parancsokat előzménylistában tároljuk. A korlátlan szinlű visszavo-
nást és ismételt végrehajtást úh'Y érjük el, Jl0gy 3. Végrehajt) illetve a Visszavon 11Ívás3-
val előre-hátra bejárjul( ezt a listát.
· Támogatni szeretnénk a változások naplÓ7ását, hogy rendszerösszeomlás eserén
helyrcállítha.ssuk a l{orábbi á ]apotot. ITa a Parancs felületet betöltő és tároló mű\rcle-
tekke1 egészítjü ;r (i) következetes változásnaplót tarthatunk fenn.. Az össJi:eomlás11ól
való helyreállítás abból áll, hogy a napló70tt parancsokat v'sszatöltjük a lemez .ől,
majd a Végrcllajt művelettel újra végreJ1ajtjuk azokat.
· Egy programot a.la.pműveletekből felépített magas szintű művelctekre szcretl1énk
alapozni. Az ilyen szerkeLel gya cori a tranzakciókat támogató információs rendsl.c.-
rekben, A tranzakciók adatok változtatásainak halmazát zárják egységbe, A Parancs
mil1ta segítségével modellezl1etjük a lranzakciókat, a parancsok közös felülete révén
pedig nlinden tranzakciót egyformán hívhatunk meg. A minta azt is egyszerűbbé te-
s7i, 110bya rendszert új tranzal{ciókkal egésLítsük ki
P---rancs 241
Se zet
. .
.. k> arancs
UgyféJ Hívó -
-
Végrshajt()
Fogad6 /\
-
.,...
fogad6 . .
KonkrétParancs
M I1velet()
-
VégrshaJ1:( ) o ..- - - - -
-------------------------- állapot
fogad6--> ML1velet() L
"
es ava
Parancs
- Felületet biLtosít egy művelet végre11ajtásál10z.
KonkrétParancs (Be ..llesztParancs) McgnyitJJarancs)
- Összeköt egy Fogad.ó CReceiver) objel{tumot és egy műveletet.
A Fogadának megfelelő művelct(ek) me gllí vásá vaJ nlegvalósítja a Végrehajt (Exe-
cute) tnűvelctet.
...
· Ugyfél (Alkalmazás)
- Létrehoz egy I<onkrétParancs (ConcreteColTIJnand) objektum ol és beállítja annak
fogadóját.
· Hívó (MenüElem_)
- Fell{éri a parancsot a \-érelem teljesítésére.
· Fogado CI)()kumentum, Alkalmazás)
- Tudja, 110gyan kell végre11ajtani az adott kérelemhez ](apcsolódó műveleteket.
Bármelyi]\: oS7tály betölt11eti a Foga(ló szerepét.
Együttmúköd ' s
· Az ügyfél Iétre11()7 egy KonkrétParancs objeklumot és n1eg11atá azza annak fogad.é)ját
Valame]yil< Hívó (Invoker) objektum elraklározza a. Konkrell)arancs objektumot.
A J-{ívó a Végrcl1ajt (xecute) műve]etne}( az adott pardncsra való lnegllívásával kérLl
met bocsát ki. 1 la a parancsok visszavonI1atók, a Konlc étPara.ncs a Végrehajt meg11í-
vása előtt elraktároLza a viSS7aV()oás 102 szükséges állal)ot()l
· A KonkrétlJarancs ()t)jekllJffi a kéreleiTI teljesítésélle7 műveleteket hv meg a fogadójá.n.
Az alábbi diagralll az említett ol)jektumok közötti együttműkc)dést mutatja, illusztrálva, ho-
gyan válas7tja el a Parancs a 11ívót a [ogaci.()t{) , illetve az utóbbi által teljesített kérelemtől.
242 5. fejezet · Viselkedési minták
egyFogad6
..
egyUgyfél
egy arancs
egyHfv6
new Parancs(egyFcgadó)
--------------
T árai Parancs{ e gyParan cs)
Művelet{ )
Végrehajt(}
Következmények
A Parancs f11inta előnyei a J{ö\'Ltkezők
1. A !Jarallcs lllinla elválasztja a I11(fveletet 1'-ezdell1é 1yező ubjektuJTIot a mllvelet végre-
Jlajtási mó(iját iSlTICrŐ o11jek.tulntól
2. A parancsok else] osztályú ()11jektll1ll0k, ugyan(lgy kczelhetől( és béSvítJletők i rninl
11ármely más olljektum.
3. A parancsokból parancsösszetételek alakíthatók kI. Ennek egyik példája a korábban
eml"tett Makré)]Jarancs osztály. Az öSS2cletl parancsol\: általál1an az Összetétel minta
példái.
4. KöIlnyű uj parancsol(3t felvenni, Jnert 1 megJe"\rő osztály()kat ne111!(elJ módosítani.
Me va ásítás
A Plr3J1CS Ininta lncgvalósításáv3.l kalJcsoIat11an a. kc)vetke7ő dolgűl( lényegesek:
1. 114cnnYlre legyenek'J intelligensek'J a parancsok? A7 egyes parancsok képességek szé-
les körcvel rendelkeLhetnek. Az egyik szélsőség az lehet, ha a parancs csupán Öss7e-
kapcol egy fogadót a kérelem végrehajtásához szükséges mííveletekkel, míg a másik
37, ]la tn.8.ga val()sít lneg mindent, fogadá otJjektlllTI bevonása J1élkül Az lltóbbi lkk()r
lehet hasznos) ha a meglevő osztályoktÓi független parancsokat szeretnénk meghatá-
ruzni, h.a nincs megfelelő foga.{i.ó objel(tum, vagy J13. a parancs egyébké 1t is isrneri
a fogadójá.t. Egy 11ásil{ llkalnlazás-ablakot létre]10zó paran.cs l)éldá.ul a7 3.blak Iétre-
hozásán kh Ül más objektumok készítésére is képes lehet. A két szélsőség között a7-
olyan parancsok találhatók) an1elyek éppen elegendő ismerettel rendelkeznek ahhoz,
110g)1 (11nalnikusan megta.lálják a f()gadójukat.
Parancs 243
2. A visSZaVOl'lás és újbóli végr'eha}tás tárnogatása. A parancsohjeklUITIo1( lkkor képe-
sek támogalni a visszavonást és tljbóli végrellajtást) ]1.a rendelkeznek vaJanljlyen
módszerrel (például \Tjsszavon vagy Mégse - Unexecule J Unde) műveleltel) l vég-
rellajtás "mLgforllítas3.ra.1 A Konl(rétParan.cs osztályoknak e]1.11.e7 á1ta]á11an lZ állaJl()-
tot is tárolnjlll< ke]], A álla}1()l a kc)vetkezőket rögzíti:
a Fogadá o1Jjcl{tum.ot, a.m.ely té11ylegesen \Tégrehajtja a ](érelem teIjesítéséllez
szükséges oltíveletekel,
· a fogadón végreJ1ajtott lnűvelet argllmentumait,
· a fOgddó azon eredeti értél(eit, al11elyeJ( a l<.érelern 1<eze]ése 1<övetke7té11en meg-
változ}1atna!z. A f()gadónal< 11izt()sítania kell aZCJkal a mŰ'Iclctekct, amelyek scgít-
ségé\rel a parancs 2. fogadót visszaállítllatja a k.orá111Ji állap()tlla.
Ha csaJz egys7eri v]sszav()násl akarlink támogatni, elég, lIa az alkallna.zás cS3.k az
ut()ljára \légrcllajtott })a.rancsot tárolja+ A töbl1szintű \TiSs7a\l()násll'<)7, illelve ismétlés-
l1ez ViSZOll.t a programnak a végrel1ajlott J)ara.ncsok előzmény[istájára va.ll szüksége,
amelynek lelletségcs 110ssza llatározza meg J1ány Jl1Űveletet vonllatunk vissza.
Az előzmén.y]ista parancss()r()zatokat lárol; lIa a sorban visszafelé llaladunl( és
}1vissLafordító' mtíveleteket ]lajtunk végre, tC)f()1jük a l1alást, 11a 11edig előre, al(kor új-
1Jól végrel1ajtjuk a parancsokat.
Előford.ullI3.t, 110 gy a \TisszaV(}n]latéJ parancs()kr{)} az elő7ménylislára törlénő felvétel
elé5lt másolatot kell késLÍt<.:ni. Erre akkor lellet szükség, lla a7 eredeti - m()ndju]( egy
mcnüclcmtől érkező - lzéreltnet teljesíté) parancsobje1<tumo1al későlJl1 más művelc-
teket kívánunk végrel1ajtatni. 1-Ia az objel{tum állapota a ]<ü1ön.lJözé5 l1ívásoh:nál más
és l11ás leb.et, a 1násc)]ás bizl()sítja, ll()gy a különböző \láltozatokat meg tudjul{ l(ülön-
11özlelni.
Egy ]<ijelöJt ()[JJektun1()kal lörlő 1örölParancs (DeleteColll nand) objel{tumnak pél-
dául 111indcn végre11ajtásnál l{ülönböző objektum.okat ](eJI lár()1nia, ezért a l ör()l
Parancs-ról a végreJlajtás után lnásolatot kell késL.ítcni és ezt a másolatot helyezzül(
majd az előzménylitára. Ha egy adott parancs állapota sollasem "\Iálto7ik, a Jnásolls
o.ern s7ükséges; e11t)en az esetben elég, lla az előzménylistában egy l1iva.tl{ozást he-
lyezünk el a parancsra+ A listára helye7és elé5lt más()land.é) parancsok prototípuskent
viseJl<etinel<. (Lásci. a l)rototípus trvezési 111.ntát a 3. fejezetben.)
3. A hiballalrtlOZódás elke.rülése a visszavo11ások sOrátlr Amikor egy megbíz11ató, a jelen-
tést n1egőrző visszavonási-islnétlési rendszert l)fóbálunk l{ia 1 al{ítani, az ál}all0t}lil1a
gondot ol(ozI1at. Al10gy paran.csokat 11ajtunk végre, vonunk vissza é.s iS111étlünk meg,
a llibál< llalmozódllatnak és az all(alnlazás állapota végül eJtérllet a7 eredeti értékek-
től. Ennek elkeriilése érdeké11en továl)l)i informá.ciól<at kell tárolnunk a parancsobjel{-
lumoklJan, 110gy az eredeti állapotl1a való viss7aál1ítást lliztosílhassuk Er)ben segít11cl
az Emlékeztető lerveLési minta. a.melynek ré\Tén a parallcso]( ané]](ül férhetnek 1107Zá
ezek11cz az információlrnoz, h.ogy más o11jeklllD10k 11elsc) s7erl<e7etét felfe(inék.
4. C++ sablonok Itasználata. A (1) vissza nem vonl13tó, illetve (2) az argutl1enturno]<at
nem igénylő para.ncso]{]10Z C++ sablon.okat llas7náIllatunk, Íh7 elkerülhetjük, 110gy
minden műveletllez és fogad.óhoz (rjabb l)arancs alosztályt kelljen létre.J1.ozn.unk+
A Pélclakód rés7:11en megmutatjtIk, llogyan.
244 5 fejezet · Viselkedési minták
éldako
Az alább bemutatott C++ kód a Feladat részben bevezetett Parancs (Command) osztályok
megvalÓsítását vá70lja fel; a?: OpenCommand, PasteCommand é MacroCommand (Megnyit-
Parancs, BeillesztParancs és MakróParancs) meghatáro7ására kerül sor. Először persze az el-
vont Command osztályt kell elkészítenünk:
class Corrunand {
public. :
virtual Command()i
virtual void Execute{) - O;
protected:
Command() i
} ;
Az OpenComrnand a felhasználó állal megadott nevű doku nentumot nyitja meg, Konstruk-
torában ei:,'Y App 1 ica t i on (Al {almazás) objektumot kell átadnunk neki. A megnyitandó
dokumentum nevének megadására az AskUser (KérFelhasználÓ) eljárás kéri meg a fel-
flaS7nálót.
class OpenCommand : publjc Command {
public:
OpenCommand(Application*);
virtual void Execute();
prolected:
virtual const char* AskUser();
prjvate:
Application* _application;
char* _response;
} ;
OpenCommand: :OpenCommand (Application* a) {
_app!ication = a;
}
void OpenCommand::Execute () {
const char* name = AskUser(};
i f (name !::: O) {
Document* document = new Docurnent(name);
_appljcation->Add{document)j
document>Open();
}
}
Parancs 245
A PasteCornmand egy Document (])okumentum) objektumot vár, ami a fogadója lesz.
A fogadót J1araméterként adjuk át a Pa s t eCommand h:on.struktorának.
class PasteCommand : pU.bl ic Command {
public:
PasteCommand(Document*) ;
virtual void Execute();
private:
Document* _document;
} ;
pasteComrnand: :PasteCommand (Document* doc) {
=docurnent = doc;
}
void PasteCommand: : Execute () {
_document->Paste() ;
}
Az egyszerű viss7a nem von11ató és argun1entumot nem várá - parancsokllOZ osztá.lysab-
lant llasználl1atunk, így a I)arancs fogadóját paraméterként adllatjuk álo Az ilyen parancsok
számára 110ZLuk létre a SimpleCornmand (EgyszLfűl)arancs) sablon aloszlál-ytJ am.elynck
pa.ramétere a Receiver (Fogació) típllsa, feladata pe(iOg a kapcsolat fenntartása a fogadó
ol)jektum és egy művelet l<ö7ött, amelyet eb!)' tagfüggvényt cím7ő nlutatól{ént tárc)lun]{.
template <class Receiver>
class SimpleCommand : public Command {
public:
typedef void (Receiver::* Actjon) ();
SimpleCommand{Recejver* rJ Action ci)
_receiver( -), _action{a) { }
.
.
virtual void Execute();
prjvate:
Action _action;
Receiver* receiver;
} ;
A konstrul{tor a fogadót és a műveletet a megfelelő példányváltóLól<ban tárolja, aL
Execute (Végrehajt) pedig egyszeruen végrellajtja a műveletet a fügadón.
template <class Receiver>
void SimpleCommand<Receiver>: :Execute () {
(_receiver->*_action) ();
}
246 5. fejezet Viselkedési minták
AhhoL, hogy létrehoz7on eb7 parancsot, amely a MyClass (SajátOsztály) oS7tály egy pél-
dányára meghívja a7 Action-t (Művelet), az Ügyfél a követke7ő kódot tarta]maZ73.:
MyClass* rcceiver = new MyClass;
I / . . .
Command* aCommand =
.now Si npleCorrunand<MyClass> {rcceiver, &MyClass: :Action} ;
I / - .
aCOnlITland->Execute ( ) ;
Ne feledjük, hogy ez a megoldás csak aL egyszerű parancsok esetében műkÖdik. Az össze-
tettebb parancsok, amelyek nem csupán fogadÓjukat tartják nyilván, hanem más argumen-
,
tu ITI okat, illetve a visszavonási állapotot is, a Command alosztályai kell legyenek.
A MacroComrnand parancsok .sorozatát kezeli, illetve műveleteket biztosít a parancssorozat
bővítésére és sLűkítésére. Fogadóra itt kifejezetten nincs szükség, hiszen az egyes
"alparancsok" meghatározzák a saját fogadójukat.
class MacroComrnand : pu.bl ic Command {
public:
MacroCornmand() ;
virtual Macr0Command();
virLual void A.dd(Command*) ;
virtual void Rcmove(Command*) i
virtual void Rxecute()i
privale:
List<Command*>* _cmds;
} ;
A MacroCommand Inűködésének kulcsa az Execute tagfüggvénYJ amely bejárja a parancs-
soro7at elemeit és egyesével végrehajtja rajtuk az Execu Le műveletet.
void MacroCommand::Execute () {
ListIlerator<Command*> i(_cmds);
lor (j ..First (); i.IsDone(); i..Ne'C.t()} {
Command* c = i.Currentltem();
c->Execute() ;
}
}
Megjegyzendő, hOhY amennyiben a MaCToComrnand megvalÓsítja az Unexecule (V'ssza-
von) m(Íveletet j az egyes parancsele 11ek vissLavonására az Execule megvalósítás5hoz ké-
pesl fordított sorrendben van s£liJ<ség.
Parancs 247
Végül, a MacroCornmand-nak endelkeznic kell a pa ancselerllck kezeléséJ:1ez, köztük az
azo { törlésé11ez s7ükséges művelctLkkel.
void MacroCommand: :Add (Command* e) {
cmds->Append(c) ;
}
void MacroCommand: : Remove (Cornmand.* c) {
_cmds->Rernove(c) ,
}
Ism rt Ihasznál ' sok
A l)arancs 11inta va.1ószínűleg Lieberman. dolgozatában [ ie85] bukkdnt fel eléSs7ör. A vissza-
vonlla.tó műveletel{ parancsokkal való megvaJósításának ötletét a7 Apple [App89] letle nép-
szerűvé. A7 ET++ [WGM88J, lZ InterViews [LCI+92] és a Unid.raw [VL90] slintén ta.1almaz-
nak olyan osztályol{at, amelyel{ a })arancs mi]1tát követik. Az InlerViews Action (M(Íve]et)
elv(Jnl osztálya pl +ancsszolgáltatásokat biztosít, az Action.Callbacl{ (MuveletVisszaJ1Ívás)
sablon. pedig, amelynek paramétere egy tnűveleti függvény automalikusan képes pé dá-
nyosítani a paran.cs-a.losztályokat.
A THIK osztályl<önyvtár [Sym93b] ugyancsak parancsokat 113sznál a visszavonl1ató műve-
letek tárn.ogat;,sáfd A parancsol{at a THINI( "feladatol{na (" (Tat,k) neve7i A feladatobjeklLl-
Inak egy FcleI{5sségJáncon. haladnak v[gig
A Unidra\\ parancs()lJje <tuma.i abban az értelemben egyediek, n0 6 7 üzenetként viselked.het-
nek. A Unidraw pa.r3.ncsok értelmezés céljábó l11ás objeklLI no moz illldhLlŐk, a7 érteltl.ezés
pedig cl. fogadá objektlJmtól függőcn változhat. A fogadá cll1ellelt át is ru11áz11atja az <.:rteln1e-
.lés feladatát egy J11.ásik objektumraj ami jellelTIzően . szülője egy nagyobb szerke. etbe.1, pél
dául egy FcJelősségIáncban. A Unidraw parancsok fOg3dói így tulajdonl{éppen "számított" és
nem tár()lt foga .ók. Az éltelme.és módja a futás.dejű típusinformációktól függ.
Coplien leírja rCop92], 10gyan készÍtJletünl( funktorol{at t vagy is függvényobjektumokat
a C++-ban. Használa.tukat a függvén.yl1ívó operÁtor (opera tor ( )) lúlter11e ésével +észbcn
elrejti. A IJarancs minta azonban ettől eltér, 11iszen középpontjában_ a fogadá é a függvény
Cvagyis a művelet) össLekötése, és nem csu})án egy függvény }JiztosÍlása á 1
K pcsolódó min 'k
A Makról)arancsok 11legvalósításáhoL az Összetétel minta használlató
Az Emlékeztető mi 1ta segítségével a parancs álta a hatásánal< visszavonásá.hoz igén_yelt ál-
lapotot tároillatjuk.
A lislára helyezés előtt rnásolandó paran.csok Prototípusként viselkednek.
8 5. fejezet · Viselkedési minták
I -Im - .
Viselked.ési osztál Ylninta
I gyé n vak
nterpreter
Cél
Egy aclott nyelv nyelvtanát áb. ázoljuk, illetve eJ1hez az ábrázolás}lOZ értelmezőt bi7tosí-
tun]{J amely annak alapján l(épes a nyelv mondatait megérteni.
Fel dat
fIa egy bizonyos tÍpusú problémd rendszeresen felbukkan, célszerű lellet egy egyszerű
nyelv mO.ndataiként megfogalma7ni a problélna előfc)rdulási le11ctőségeit, m.ajd egy értel-
Inezől k.észíteni, amelye mon(latok értelmezésével megoldja a problélnát.
G.yakori fejadat l)éldául, 110gy l)".zonyos nlintákra illeszl<edő karakte . láncokat keressünl{.
A karahterlánc-mintál( megllatározásának sLabvá.nyos nyelvét a szahályos kifejezések
(regular expressions) jelentik" lIa a kereső algoritmusol( a l(eresendő karakter láncokat leíró
s7abáJyos ki cjezéseket értelmezik, elkerül11etjü (, 110gy minden minta-karakterláJ1c párosí-
tásllOL külön algoritmust kelljen írnunk
,
Az ErtLlme7ő tervezési minta an.na]{ lnódszerét adja meg, llogyan határoz11atjuk meg egy
eb7s7erű l1yelv nyelvtanát J l10gyan ábrázoll13tjuk a nyelv mondata"t, és llo!:,ryan értelmez-
lletjül( ezeket a mondatokat. Az említett esetben a mInta a szabályos kifejezésel( nyelvtaná-
nak leírását, adott szal)ályos kifejezések ál)rá701ását illetve azok értelmezését segíti
Tegyük l-el, 110gy az alál1bi nyeJvtan llatározza meg a szabályos kifejezésel{Lt:
kifejezés ::- literál I vlasztás I sorozat I ismétlés I
I (I kifejezés.) 1
választás ::- kifejezés 1 I 1 kifejezés
sorozat::= kifejezés 1&1 kifejezés
ismétlés::= kifejezés 1*1
1 iter á 1 :: = · alI 1 b 1 Ile 1 I .. .... {. a. I 1 b 1 J 1 cll .. + + } *
A kezdőszimb{)lum a ki fej ezés Cexpression) a zárós7in1bólum ped.ig az a.lapszavakat
lnegl13 táro7ó 1 i ter á 1 (literal) .
,
ErteI mezo 249
...
Az Ertelmező mintában m.nelen nyel\rta.n.i szabályt egy-egy osztállyal ábrázoJunk+ A szabáJy
jolJb old.alán álléJ szimbólumok ezen oSLtályol,- példányai. A f<:nti nyelvta.nt öl osztállyal áb
rázolhatjuk: a Szabá.1yosK".fejezés (ReglllarExpression) e vont osztáilyal, és an.oa], négy al-
()s7tályával CLiterálKifcjeLés, Választá.sKifejczés, SorozatKifejezés, IsmetlésKifejezés - vagyis
Li teraIExpression., AJ.tern.a ti on Exp fessi on, Seq u en ce Fxp [ess ion és Repet iti ()nExp ressi on) .
Az utolsó llárom osztály alkifejezésel(et tartalmazó változól{at ]la.tá .OZ meg
------- - ... -- .-.
Szabál sKifejezés -
-
-
Étfsfmez() -
.... -
- .-
-
L
I J kifejezés 1
l[t rálKi ejezés SorozatKifej zés <>
kifejezés2
rtelmez() rtelmez( } <::=
[iterá
ismétiés r Bhot6sé-g 1
O Ism 'tiésKifejezés VálasztásKif jezés r<>
lehe 6:5ég2
rtEl1mez( ) rtel mazO O
A 1yelvtan által meghatározott valamennyi szabá yos kifejezést ebry, az osztályok pélciánya-
il1é)1 felépülő elvont sLintaxisfa ábrá.zolja.
egySo ozatKifeje és
kifejezés 1
kifejezés2
e gyLiterálKife j ezé s
Iraining '
egylsmétlésKi ej zés
ismét'és
egyVálasztásKifej zés
lehetőség
lehetóség2
egyLi erálKifejezés
Idogs.
egyliterá Kife.ezés
1C ats I
250 5. fejezet · Viselkedési minták
A fenti szintaxisfa például a követke7ő szabályos kifcjezésnek fclel meg:
rain. ng & (dogs I ca "Ls ) *
A szabályos kifejezésekhe7 úgy kés íthetünk érteJmezőt, ha a SzabályosKifejezés (Regular-
Expression) minden alosztályára meghatározzuk az Erlelmez (Interpret) műve] etet. Az Er-
telme7 argumentumként dzt a környe7etet várja, amelyben a kifejezést énehne7me kell.
A kÖrnycLet a benlcnő karaktcrláncot jelenti, illetve azt, hogyakarakterlánc mekkora ré-
s7ét próbálták már a mintához illeszteni. A SzabályosK1fejezés alosztályai az Értelmez mű-
veletet úgy valósítják meg, hogy a7 adott környezet alapján a bemenő karakterIánc kÖvet-
l<ező részét vizsgáljáJ<. LásslInk néJ1ány példát:
· A LiterálKifejezés azt ellenőrzi) hogya bemenet illeszkedik-e aL általa meghatározott
1 iterálra.
· A VáJasztásKifejezés azt elJenőrzi, hogya bemenet illeszkedik-e bármelyik választási
le .1etőségre.
· Az ls métlésKifejezés azt ellenőrzi, hogya bemenet tartalmaz-e ismétlé5déS kifejezést.
Alkalm hatós ' 9
A7 Ertelme7:ő minta használata akkor célsLerCí, ha van értehnezhető nyelv, amelynek ki feje-
,
7éseit elvont sÚntaxisfában ábrázolhatjuk. Az Ertelmező minta a követke7ő helyzetekben
alkalll1azl1alÓ a Jegnag)i()bll sikerrel:
· A nyelvtan egyszerű. A bonyolult nyelvtanok osztályhierarchiája túl nagy és kezelhe-
tetlen ]ehet; ezek esetében az elem76 gencrátorok és hasonló eszkÖzök jobb megol-
dást kínálnak, mert elvont szintaxisfa felépítése nélkül képesek értelme7ni a kifLje-
Léseket, amivel helyet és valószínűleg időt takaríthatunk meg,
· A hatékonyság nem létfontosságú szempont. A leghatékonyabb érteln1ez6k általá-
ban nem kÖLvctlenü] ekn17ik a fákat, hanem először más formára alakítják azokat.
A szabályos kifejezéseket példáu] gyaklan aJakítják állapotautomatákká. Mindazon-
által a fordító ekkor is lnegvalósítható a7. Értelmező minta segítségével.
,
Erte I mező 251
S rkezet
- Környezet
-
..
Ugyfél - ElvontKifejezés '- --
-- I'W'" -
ÉrteJmoz(KömY8ZBtj
J\ - -
Terminá sKJfeJezés Nm rm ináli s Kife.jezés fO
Értelmez(Kömyezet) Értelmez(Kömyezet)
R'sztvevők
· ElvontKifejezés CSzalJályosKifejezés)
- Egy elvont Érte mez (Interpret) művel elet ve7et be 1 ami az eIV()]lt szintaxisfa lnin-
d.en csomópontjár3. l(özös
· TerminálisKifejezés CLiterálKifejezés)
-r
- A nyeJvtan terrn.inálszimbólumaill()z kapcsolódó Ertelmez műveletet \la]ósítja
meg+
A nlondalo]( m.inden egyes termináls7jmbólul11ál10L egy-egy péJdány szükséges.
· NemterminálisKifejezés CVálas7tásKifejezés ISlnéllésKifejezés, SOfozatKifejezés)
- A nyelvtan. n1jo.den R := RIR2 . /(1'1 s7al1áJyállOZ egy-egy ilyen osztály sLül(séges.
- Az RI-tóI az Rn-ig tnind.en s7im11ólumlloz ehy-egy ElvontKlfcjczés (Allstract-
Expression) tíPUSl] példán.yváltozót biztosít.
- Megvalós"'tja a nyel\l"lan nemterminális s2imbólumlill(1Z ]{apcsolódó frtelmez lnű-
",.
veletet. Az Ertelmez jel1emzően isrnételten önmagát h.ívja. inch az R 1 -R J1 szilnbólu
mol(at jelképező változókra.
· Környezet
- Az értelmezéS g]obális környezetéről tartalmaz infoflnáci()kat.
....
Ugyfél
- A n)!elvtan által meghatározott nyelv egy adott D10ndatát álJrá701ó elvont sLinta-
xisfát épít fej (vagy l{ap meg). A fa a NemterminálisKifeje7és (NontcrminalExpre<)-
sion) és a TermjnáJisKifejczés CTerminalFxpression) osztályok példányailJól áll.
...
- Megl1Ívja az ErtelnlCZ műveletet.
5 5. fejezet · Viselkedési minták
Együ mukódés
· Az ügyfél felépíti (vagy megkapja) a mondatot, egy N<...mtermináLsKifej<...zés és
1-'erminálisKifeje7és pé]dányokból állé) elvont szintaxisfa formájál)an, majd előkészíti
-'
a környe etet és . eg 1/vja az Erlelmez lTIűveletet
· A Nemter 11inálisKiieje7és csa nópontok mindegyike al: a kifejezéseknek megfelelő-
,
en hatá.foz a meg az Ertelmez műve1etet. A Terminál sKifejezésel\: brtelmez művelete
az alape,;etet hatJ.rozza meg.
,
A7 egyes csomópontokban levő Ertelmez múvelc ek a !(örnyezet (Context) segítsé-
gével tárolják és éril{ el az értelme ő á lapotát.
öv tkezm' n
Az Értelmező minta előnyei és hátrányai - következők:
1. A Jl)Jelvtarz kön'11 Jen nzódosítllató és b6víthet6 Mivel a minta a nyelvtdni szal)á.lyokat
DSL ályokkal áb ázol.a, a nyelvtant örökléssel 11Ódosít11atjuk vagy bővít]1etjül{.
A nlegJevő k+fejezéek fokozatosan m()dos.thatól{, az ú.akat pedig a régiek változa
taiként 11atároz11atjuk meg.
2. A 11yelvtan megvalósítása is kÖ11nJ,iI. Az elvont szintaxis 'a csomópon jail meg. .atáro-
zó oszt/Iyok megvalósí .áa 11asonló; az osztályok könnyen lTILgír11dló]<, sót, létre 10-
7ásuk fordílóprogram- vagy elemzőgenerátor segítségéve] automatiLál11ató is
3 A bo 17.YO lu It nj}ellJtanokfenntanása n.ehéz Az Ertelme 6 minta nye vlani sZ3.bályon-
lcénllega]ább egy os tályt határoz meg. (Ha a s7alJályol{at BI\F fo . Illában adju -- meg,
több oSLtályra is szükség lellet.) Enné .fogva a sok s ahályból álló nyelvLa 10k keLe é-
se ne11é7 A probléma enyll"'tésére 11asználl1atunk más lervezési n intákat (lásd
a Megva.lósítás részt), de ha. a nyelvtan nagyon bonyolult, az olyan megoldások, minl
a ordító- vagy elemz6generá oro ;or l1asznalatd célszerűbb Ic 1et,
...
4. A kifejezések értelnlezéséle könl1Jiu új nl.ódszereket hozzáad-rll Az Ette m.ező n>nla
egyszerűbbé teszi, 110gy d kifeje7ésel<et új méd.on érté].celjül{ ki. H3 egy adott kifeje-
Cs osztályára új műveletet llatározunk meg, tám.ogatllaljuk például a típu sei enőr
zést Ha a kifejezések értelmezési módját gyal<ran vá tozta.tju {, ércieIlles a Látoható
mintát al ka lnazn', hah'Y elkerüljük a nyelvtanj osztálya módos"'tását.
M valasI as
... ..
Az Ertelmező Cs a Osszetétel nlinla a megva ásítás mócijálJa11 SZ[.ffiOS S7em. ontból haso }-
lít, AL alább'ak viszont kifejezetten az Értelmező mintához kapcsolódnak:
1. Elvont szintaxisfa építése, Az Értelmező m'nta nem magya ázza el, hogyan hozhat-
juk létre az elvont s intaxisfál, vagyis a7 elelTIzéssel (parsing) nLm -oglalkozik. A fa
létre1107ható táblave ér ésű eleiTIzővel: "ké7j" (általában rekur7ív ercszked.ő) elem
zővel, il elve közvetlenül az ügyfél által
,
rtelmezo 53
2. Az E17elnlcz tníivelet lnegllatározása. A 1{ifejezésos7lályc)}<ban nem kell meg]latároz-
nllnk az ErtelJ11ez tnűveletet. lIa gya]<ran készJtün]{ új értelrnezőt, érdemeseb}) a Lá-
togató lninlál alkallnazni 6s a mŰ'lelelet kiilön ),Iátoba.ló" ()11jeklum11a l1elye7oj. Egy
programo7ási nyelv ]lyelvtana például s7ámos l11Űveletet végez az elvont szintaxis:a-
kan (típuscllcnőrzést, llatél<onyságnövclést, kód-előállítást stb.). AlII-loZ, Il()gy elke-
rüljük, hc)gy mind.en nyelvtani (JS7lályll()Z oleg kellje]l határo7nunl( ezeket a mŰ\Tele
teket célszerűbb látogatót alkal naznunk
3 A termi11álszi111bó/1ffn.ok 111egosztása a PehelysúVll 111i11távalr Azon o)lelvtan(JI< eseté-
.ben, amelye]{ monciatai egy ad.ott terJ11Jnálszil11bólum szán10S előfordulását tartalITlaz
zák, érdelnes a 7imb()ll1m ebryetlen más()latát meg()S7tani. A s7ámit()gépprogramok
nyelvtanai jó példák erre - gondo]junl{ csak a l{ód b an. számos l1elyen felbuld<.anó válto-
zókra. A Feladat részlJcn leírt példa. lTIonda.taiban a dog terminálszimbólum (alnil a Ij-
teráJKifejezés osztály álJrázol) fordul11at ele) töblJször. A te miná .s csomópontok általá-
ban nem tárolnak info 1TIációt az elvont szintaxisfában elfoglalt llelyükrőI; az ér1elme-
7és}lez s7ükséges ]<ö -nye7etet a s7ülőcsorTIóponto1{ adják át nekiJ( Így megkiilönbözte-
tünk megosztott (belső) és átadott (l{ülső) á.llapotokat, és alkallnazllatjuk a IJe11elysú])rl1
minlát. l)éldául a LiterálI<ifejezés minden dog p[ld.ánya m.egkapja a k()rnyezetet, 3J11i az
a.ddig mintára illesztett karakterlánc-részt tartalmazza. Ezután minden ilyen Lilerá.l
Kifejezés ubryanazt csinálja az Énelnle. műveletl)en: eUenőr7i J 11()l:,,>"ya bemen.et követ-
kező része tartalma7-e dog-ot, fLiggetlenül attól, ]10l11el)lezkedjl( el a példányafáJJan.
, lakó
Íme két J1éJcla; a7 els{5 egy teljes J)fC)gram Sma]ltllk nyelven, arni e]1en,őrzi, 110gy egy 1(3.ra.k-
tersorozat illeszl(edik-e egy adott szabályos kifejezésre, l má.sodik egy logika.i (Boolean) ki
fejeésel{el értékelé5 C++ IJfc)gram.
A szal1ályos kifejezésre illesztő IJrogram azt vizsgálja 110gy egy adott 1<araktersorozatot
meg11atáro7nak-e a nyelv szabályos ]{ifeje7ései A szabályos kifejezések nyelvtana a kö\rCl-
k<:ző (cLúttal angolul):
express ion ::= literal I alternatlon 1 sequence I repelition I
, (' express ion '}'
aJternatLon ::= express'on 1 (1 epress.on
sequence ::= epressjon 1&1 express. on
repeliton ::= expression 1 repeat 1
1 iter a] :: = 1 al' 1 b' Ile 1 I _ . _ {' a. I 1 b' Ile' I " " " } *
EL a nycl\rtan a Feladat résL.bcn szcrCIJlő lJélda némileg mé)d{)sÍlc)tl váll()Zata A7ért volt
S7likség a váll()ztalásra, 111ert a Snlalltllk-ban a " * rt szim11ólum nem le11et utótagos (postfix)
lTIűvclct; így ezt a repeat-rc cseréltük.
(('dog- I -cat-) repeat & rweather-)
A fenti szabályos kifejezés például a n dog dog cat weatrler II beme11ő J;araklerláncnak
felelln_eg
54 5 fejezet · Viselkedési minták
Az illesztéS megvalÓsításához a pár oldallal korábban ben1utatott öt oSLtályt határozzuk meg.
A SeCJUenceExpression CSoroLÍ;llKifejezés) oS7tály I)éld.ányvaltoz()i az expressionl
(kifejezésI) és az expression2 (k.1fejczés2): alnclyek a7 osztály gyennekeit jelölik az elvont
szintaxisfában. A7 AJ ternationExpression (VálasztásKi[eje7és) a választási lehetőségekct
dZ alternativel (lehetőségl) és alternative2 (lehetőség2) példányvált07Ókban tárolja t
míg a RepetitionExpression CIsméllésKifejezés) az ismétlendődfcjezést a repetition
(ismétlés) változóhan, a Li teralExpression (I iterálKifejezés) components (elen1ek) pél-
dányvált076ja pedig objektumok (valószínűleg karakterek) listáját tartalmazza, amelyek azt
a litcrális karal(lerlá]lcot jelölik J aminek illeszkednie ke]l a bemeo.(i karaklersorozatra
A ma Leh: Cíllcszt) művelet a szabályos ki 'ejezés értelmezője, alnit az e]vont szintaxisfát
meg11atározéJ valalllennyi oSLtály megvalósít. .A.rgurnentllJ1l.3. aL: inpu tS tat e (lJemenet-
Állapot), ami aL illesztési folyamat aktuális ál apotát jelöli a bemenő karakterlánc egy ésd-
nek elolvasása után.
Ezt a7 állapotot be TIcnet' folyamok jellemLik, anlelyck a szabályo kifejezés által elfogad-
ható bemenetekcl ábrázolják. (Ez nagyjából megfelel annak, mintha egy egyenértékű vé
gcs állapotú automata minden lehetséges állapotát ögzítenénk az adott pontig, a bemené5
adatfolyam felismerése sorá.n.)
Az aktuális állapot a repea L (ismétel) művelet szempontjából a legfontosabb, Tegyük fel,
hom' a szal)Jyos kifejezés a követl(cző:
tat repeat
F]{]{or lZ értelmezéS ° lleszke{iőként érlelrnezi az .. a .., "aa rt, II aaa" .sti). soro7at()kat.
Ha a szahá.ly"os }{ifejczés azonl)an ez:
1
tal repeat & Ibc l
Az illeszkedő soro7atok máris az II abc II, It aabc TI t II a aabc II és így tovább, Nézzünk egy má-
sik váJtozatot:
la' rGpeat & -abc l
A:z II aabc It bemenet illesztése az " rar repeat It alkifejezéshcz ckkor két bemenő folya-
mot erednlényez, amelyek köLii! az egyik a bemenet egy karakterét, míg a más 'k annak két
karakterét vizsgálta már meg. Csak az eh? karakteI1 elfogadó folyam fog il1eszkedni a lnara-
dék II abc It -re.
Most nézzük a s7abályos kifejezést n1eghatáro7ó osztályok m.indegyikére a ffidtch: megha-
tározását. A SequenceExpression meghatároLása sorban minden alkirejezésére vizsgálja
az meszkeclést a bemenő folyaInokat pedig általában eltávolítja aL inputSLate-ből.
Értelmező 255
malch: inputState
A expression2 match: (expressionl match: inputState) .
Az Al ternal ionExpression-öl< a z ebrye vállsztási le11etősége]( állapotának uniója.ból
álló állapotot adnal{ vissza. A match: l11eg11atározása az Al LernationExpression ese-
tében a l<övelkező:
match: inputState
I finalState I
finalState := alternativel match: inputState.
finalState add.AJ l: (alternative2 match: I npulState) .
A finalState
A Rep e tit i onExpr ess i on ma t ch: művelete annyi esetleg ílJ eS7ked(5 álla 10tOt próbál
lllálni, amennyit csak lellet:
match: inputState
I aStato final State I
aState := inputSlate.
finalStato := inputState copy.
[aState isEmpty]
whilc"False:
[aState := repetition match: aState.
fOnalSlale addAlI: aState].
A finalStaLe
A kimeneti állapot általál)an több állapotot tarta]nla7, mint a bmeneti, mert a Repe-
tit i onExpr ess i on a r ep e tit i on egy, kettő vagy több előfordu lásá t előr ord.ulását il-
leszdlcti a bemenetre. A bemcneti á.llapoto]{ e ]ehetséges állapotol{a.t ábrázolJák, 19y a sza-
bályos kifejezés következő elemei eldöntllelik: rnelyik állalJot a llelyes.
A Li teralExpression match: művelete a kifejezés összetev(5it megprób5.lja. mit1den le-
llctséges bemeJleli adalfolya111fa ráilleszteni és csak aLl1kat a folya.nlol(at tartja meg, amc-
lyekben illcszkedést ta]ál:
match: inputState
l finalState tStIcam I
f'nalState := Sct new
input State
do:
[:strcam I tStream := stream copy.
(tStream nextAvailable:
components size
) = components
i[True: [finalState add: tSLream]
] .
A finalState
256 5 fejezet · Viselkedési minták
A beIlleneti adatFolyamoL a nexlAva ilable = CkÖ\elkezőElCrhet6) üzenet lépteti előre; ez
az egyetlen léptető match: művelet. Fii:,:IJ'eljük meg, hogy a visszakapott állapot a bemene-
li adatfolyaJn másolatát lartahnazza, ezáltal b'ztosítva, hogy eb'Y illeszkedő literál soha TIe
változtassa meg az adatfolyamot. Ez azérlfontos, mert az AILernationExpression lehe-
tőségeinek a bClnenő a.dali()Iyam az()nos pél(i.ányait kelllátn'ul{
Most, hogy meghatároztuk a7 elvont s71ntaxisfát felé Jítő osztályokat, leírhatjuk a felép:ítés
módját. NeIn írunk elcmzőt a sLabályos kifejezésekhez t inkább mcghatároLunk néhány
műveletet a RegularExpression oszlályokhoz. Így a Smalltalk kifejezések kiértékelése
a mcgfeleJő szabályos kifejezés elvont szintaxisfáját eredlnényezi, és ugyanúgy használhat-
Íuk a Smalltalk beépílett fordítóját, lninlha a szabályos kifejezések cJemzőjc lenne.
Az elvont szinlaxlsfa felépítéséhez az II , II, a rr. repea tH, illetve az pr & II s7imbólumokat
a RegularExpress ion műveletciként meg kell határoznunk. A7 osztályban a meghatáro-
z3.sok a l{övctkezől{éppen néznel< 1\:i:
& aNodo
A SequenceExpression new
expressionl: self expression2: aNode asRExp
repeat
A RcpetiLionExpression nGW repetition: self
aNOae
A AlternationExpression new
aJternativel: seJf alternative: aNode asRExp
asRExp
A self
Az asRExp művelet a lite "álokat RegularExpression-ökké alakítja. Ezeket a művelete-
ket a String CKarakte "lánc) osztályban határo7zuk meg:
& aNode
A SequenceExprossion new
expressionl: self asRExp expression2: aNodc asRExp
repeat
A RepetitionExpression new repetition: self
aNode
AlternationExpress'on new
al terna_ti vel: self a.sRExp alternat i ve2: ctNode asRExp
asRExp
A LiteralExpressj OIl new components: self
Értelmező 25
Ha ezeket a műveleleket al oS7tályJ1ierarcllia magasa.bb foká 1 l1atározna.nk meg (Sequen-
ceableCollection a Smalltalk80-banJ IndexedCollection l Smalltalk/V-l)en), akkor
az olyar1 osztál)lokra is érvényesek lennénel{, mint az Arr ay 'lagyr az Orde redCo II ee t i OllJ
így a szabályos kifejezéseket bármilyen objcktum11ól álló sorozata (ra illesztl1etnénk.
A lnásodik példa egy logikai (Boolean) kifeje7éseket l<ezelő és kiértékelő program, C++
nyelven megvalós"'tva. E ny'elv tern1inálshimbólumai logikai vált()zó]{J vagyis a true és
false állandók. A nemtermi]1ális szi.mlJólumok az and, or és not operátorokat tarlaln1alé)
l\:ifcjezéseket jelölil{. A n)relvtan megllatározása a l<övetkező: t
BooleanExp ::= VariableExp I Constant I OrExp I AndExp I NotExp I
- (- BooleanExp 1) I
AndExp ::= BooleanExp andl BooleanExp
OrExp ::= BoolednExp orl BooleanRxp
NotExp ::= Inot l BooleanExp
ConsLant ::= Itrue- j Ifalse l
Var 1 ab leE xp ::::: - A · I B I _... I · X I t Y til Z I
A lCJgikai kife)ezésekre két művelelell1atározu 1k meg. Az első, az Evaluate (Éltékel), egy
logikai kifcjCLést éI1ékell<i., egy olyan l(örnyezetben amely minden \'áltozóllOZ igaz vagy
llamis (lrue-false) értéket rendel. A második, a Replace (Cserél), egy válto7ó l<ifejezésre
való felcserélésévei új logl1{ai l<ifejezést állít elő. A Replace egyben azt is mutatja, 110gy az
,
Ertclmező Inintát neOl csak kifejezések kiértékelésére l1asználl1atjuk; ebben az esetlJen pél-
d.ául m.agánal{ a kifejezésnek a kezelésére.
Ilt c,;ak a BooleanExp, d Var iableExp és az AndExp (logikaiKif, VáltozóKif, ÉsKil) osz-
tályokat mutatjuk lJe részletesen. Az OrExp LS a NotExp (VagyKif, NemKiD hasonlóa 7 az
...
AndExp-lle7, a Cons tant CAllandó) ()sztály a logika' állandókat ábrá701ja.
A BoolednExp 11atározza. rncg minden }()gikai kifejezést m.egllatározéJ osztály felületét:
class BooleanExp {
public:
BooleanEvp{);
virtual BooleanExp()i
vjrtual boal Evaluate(Context&) = O;
virtual BooleanExp* Replace(const char*, BooleanExp&) O;
virtual BooleanExp* Copy() const = O;
} ;
A ConLext (Körl1ye7et) osztály a változók logikai érté]<ek]<é a1akításálllatároZ7a meg, amely
értél{eket a C++ lrue és false álJal1d.óival áb +ázoljuk. A Context felülete a következő:
1 Az egyszerűség l{edvéért eltckintünk a nlűveletek kiértékelési sorrcndíétől} Cs feltélelezzül{ 110gy ez a szintdxis-
fát felépítő olJjcktum_ feleh3ssége.
258 5 fejezet · Viselkedé.si minták
class Context {
public:
boal Lookup(const char*) const;
void Assign(VariableExp*, baal);
} ;
A VariableExp egy nevesített válto7ót á.brázol:
class VariableExp = public BooleanExp {
public:
Var"ableExp(const char*);
virtual VariableExp();
virtual boal Evaluate{Context&);
vlrtual BooleanExpw Replace(const char*, BooleanExp&)j
virtuaJ BooleanExp* Copy() const;
private:
char* _name;
} ;
A konstrulztor argumentum.ként a változó nevét várja:
VariableExp: :VariablcExp (const char* name) {
name = strdup(narne);
}
Egy adolt változó kiérlékeléséI1Ck eredménye a változé) értéke az aktuáJis !{örnyezetllen+
boal VarjableExp::Evaluate (Context& aContext) {
return aContext-Lookup(_name);
}
A \Táltozó lnásolása egy új VariabJ_eExp-et eredn1én}7cz:
BooleanExp* VariableExp;:Copy () const {
return new VariableLxp(_name)i
}
Ahhoz, hogy egy változót egy kifejezésre cserélhessünk, ellenőrizzük, hogy a Vált07Ó neve
megegyezik-e az a.rgumentumként l(apott né\rvel"
BooleanExp* VariableExp: :Replace (
const char* name, Booleanhxp& exp
) {
,
ErteI mezó 259
if (strcmp(name, _name) == O) {
return exp.CoPY()i
} else {
return new VariableExp(_name);
}
}
Az AndExp egy olyan kifeje7ést jelöl, amelyet l(ét logikai kifeje7és AND-del való összel({p-
csol:ásával állJtun.l( elóI
I
c]ass AndExp : public BooleanExp {
pU.blic:
AndExp(BooleanExp*, BooleanExp*)i
virtual AndExp()i
virtual boal Evaluate (Conte;Tt&) ;
virtual BooleanExp* Replace(const char*, BooleanExp&);
virtual BooleanExp* Copy{) const;
private:
BooleanExp* _operandl;
BooleanExp* _operand?;
} ;
AndExp: :AndExp (BooJeanExp* opl, BooleanExp* op2) {
_operandl - api;
_operand2 = op2;
}
(
I-la kiértél(elünl{ egy AndExp-el J a ténye7őket értékeljük, 3. visszakapott ered.nlény I)edig
(1 logikai "és'J lesz.
baal AndExp::Evaluute (Context& aContext) {
return
operandl->Evaluatc(aContext) &&
operand2->Evdluate(aContext) ;
}
Az AndExp a Copy (Másol) és Replace műveleteket a tényezőin ismételten végrellajtott
l1Ívásokl{al valósítja meg:
BooleanExp* AndExp::Copy () const {
rcturn
new AndExp{_operandl->Copy{), _opcrand2->CoPY()j
}
BooleanExp* AndExp: :Replace (const char* name I BooleanExp& eyp) {
return
'-60
5. feje z et · Viselkedési minták
,
1
new AndExp(
_operandl->Replace(name, exp),
_operand7 >Replace (name t c"':p)
,
) ;
}
Most már megllatáro7hatjuk a követkeLő lc)gi]<ai ](ifejczésl...
(true and x) or (yand (not x))
.és kiértékel11etjük aL x és y változóldloz rendelt true és false értékel{ eg)r adott esetében:
BooleanExp* cxpressionj
Context con text;
VariableExp* x new VariableExp(ItX Ir );
VariableExp* y - new Var. ableExp ( nY 1i ) ;
\
expression == new OrExp(
new AndExp{new Constant (true) , x),
new AndExp(YJ new NotExp(x))
} ;
context.Assign(x, false);
context.Assign(y, tue);
boo} result = expression->Evaluate(context);
A kifejezés értéle aL és y ezen esetében true lesz+ A változ{)l< más értékeinél is J{jértékcl-
Iletjük a }{ifejezést; e]1]1ez egysLeruen csal( lneg kell vált()7tatnunk 3 környezetet.
Vége7etül, a.2 y változót egy új kifejezésre cserélhctjük, majd új a (iértéke]h.etjül{
"
I
VariableExp* z = new VariableExp(tlZU);
NCJtExp not_Z(L;);
Bool eanExp* rep] accment - expressj on->Replace (.IY11 I not_z);
context.Assign{7/ true);
result = replacement->bvaluate(contcxt);
,
Ez a példa rámutat egy fontos d.ologra az Ertelmező ill.intával kapcs()latban, mégped.ig arra,
110gy egy mondatoL tölJhféle mű\Telet értelmezl1et. A BooleanExp esetében meghatározott
l1á o TI művelet közül a.2 Eval uate felel meg leginkább az arról alkotott ell(épzeléseinl{-
nek, hogy egy értelmezőnek n11t kell tennie - értelmeznie egy programot vagy kifejezést,
Inajd visszaadni egy egyszerű eredményt.
Értelmezo 261
Ugyanakkor a Replace is tekinthct6 értelmezőnek t mégpedig olyannakt ame ynek kö -
nyezLle a cserélendő változó neve, illetve a helyére lépő kifejezés, eredménye pedig egy új
kifejezés, Még a Copy-ra is gondolhatunk úgy) mint egy üres környezetű értelmezőre. Fur-
csán-.k tűnhet persze, hogye (ét műveletet értelmezőnek tekintjük) hiszen tulajdonképpen
nem mások, mint fákon végzett alapműveletek. A Látogató terve7ési In'nta példáinál majd
betllutatjuk, miként lehet a három műveJetet (jraépítve önállÓ "értelmező látogat8 t -ba he-
lyezni, alni bizo.nyítja l1asonlóságllk nagy fokát.
... ..
Az Ertelme7ő minta nem csupán ehry művelet, amelyet "szétosztunk,t egyt az Oss7.etétel
mintát használó osztályhierarchiában. Az Evaluale-et azért tekintjük értelme7Őnc. (, mert
a BooleanExp osztályllierarc11iára úbry gondollInk, mint alni egy nyelvet ábrázol
H3 adoll egy hasonló oS7.tályhicrarchia, amely alkatrészeket ábrázol, nem valószínű, hogy
az olyan művdeteket t Inint a Weight vagy a Copy értelmezőnek tekintjük - bár ugyanúgy
egy, az ÖS7etétel mintát alkalmazó osztály 1ierdrchiáhan kapnak helyLl-, egyszcrlíen mert
az alkatrésze (fl. ne TI. gondolunk n}relvkénl. Min.dez persze nézőpont kérdése: J1.a kÖLZL-
tennék nyelvtanuk2t, a velük dolgozó műveletekre is úgy nézhetnén (, mint a nyelv értel-
mezésén ek n1ódszereire +
Ismert f Ih s n 'Iás
A7 Értelmez6 mintát sz(Jes körben alkalmazzák a7 objektumkÖ7pontú nye vek fordítóprog-
ramjaibaD t amilyen a Smalltalk is, A SPECTaik a minta segítségével a bemeneti fájlfonllátu-
mok leírását értelmezi [Sza92], a QOCA mcgszorításfeloldó elemkészlet kötéseket vizsgál
vele lIIJIMV92].
Ha legegyszerubb formájára gondulunk Cvagyis n1int egy, az Összetétel mintán alapuló
os7tályhiererchiában eloztott Inűvdetre), azt mondhatjuk, h0 6 7 az Összetétel minta szmte
,..
valarnennyi alkalmazása tartallna7 a az Ertelllle7Ő mintát is, de lasználatát azokra az ese-
tekre célszerű kc)rJátozni, amikor az oszlályhierarcllia egy nyelvet ábrázol
Kapcsolódó minták
Összetétel: az elvont szintaxisfa az Összetétel tn" 1ta egy példája
Pellclysúlyll: lllcgmutatja, logy-ln ()s7tl1atók meg az elvont s7intaxisfa terminálszimbóJllmai.
Bejáró: az érte]l11ező a szerkezet bejárásá110z fcl11asználllalja a Bejáró mintát.
Látogató: arra használhatÓ, hogy eby osztályban tartsuk az elvont szintaxisfa egyes csonó-
po n tj ainal{ vise lk edését.
262 5. fejezet · Viselkedési minták
.
:-J r.
Viselkedési obje]{tumminta.
Cél
Az összetett objekltlmok elerneinel( soros elérését a l1áttérben megbúvó ábráz()1ás felfedése
nélkül biztosÍtó módszer 1{i3.lal{ítása.
Egyeb n V
Itcratof, Iterálar, Cursor (Kurzor, Sormulaló)
el da
Az összesÍlő ()bjekll1010kn.al( (aggregátuln()knak), például a listá.knak, módot kell adniuk
arra, tl()gy eleme"l{et a belső szerke7et feJ fedése nél (lil ér11essük el. A listát elnellett lU(i.-
n.un.k kell különtJözé5 rnód.okon bejá,rni1 altáj függően, hogy mit sL:eretnénk végl1ezvinni.
A Lista (List) felületet azonban valós7fnűleg nem akarjuk felduzzasztani különféle bejár{)
mű\reletekkcl, még akkor sern, h.a pontosln tudjuk, milyen műveletekre lesz s7i1kségünk.
Arra i szükség le11et, 110gy ugyanazt a Iistát egyszerre több módon járjuk 11e.
A Bejáró tervezési minta n1inderre mód.ot ad" A minta ](ulcsa t hogy a elérés és bejárás fele-
lősségi kc)rét a lista objcklumb()1 egy bejáró (iterátor) objektumba l1el)Tezzül{ A lisla eleme -
nek elérésére szolgáló felületet a Bejáró (lteralor) osztály 11atároLza meg; az el)]Je az osz
lályba tartozó objektumok tartják szám.on, melyik az aktuális elem t vagyis 110gy mely ele-
meket jártuk már be.
Egy L"sta osztály például a ListaBejárót (Listlterator) llÍvja meg t és az alábbi kapcsolatol{ áll
l1ak fenn köztük:
Lista listzI ListaBejár6
.......
--
Számlál() Els6( )
Hozzáfúz(Elem] Kövatkezőn
E távolft( Elem) Kész( )
..:0 AktuálisEle m()
index
Bejáró 63
Mie16tt a L'staBejárót példányosítha "nánk, meg kell adnunk a bejárandó listát Ha már ren-
de ]{ezün .staBejáró é dánnyal, a lista elemeit sorban érhet'ü el Az AktuálisElelll (Cur-
rent lern) múvelet a lis a a {tuális e emé adja visb7a, az Első (First) az e s6 elemel eszi aktu-
dlis elemmé, a Követke ő (Next) pedig a következőt; a Kész (IsDone) feladata annak el en-
ór ése, ] ogy túljutottunk-e már az utolsó elemen, vagyis hogy befeje tük-e a bc'árást.
A bejárás elvalasztása a Lista objektum ó le 1etővé tes7i, hogya különböző bejárási módok
ho anélkül hatá ozhassunk meg ülön-külön bejáró (at, hogy fel kelle e sorolnUl k azoka"
a Lista felüle ben, A SzűrőListaBejá ó CFilteringListIterator) például csak a on elemekhez
bi tosítana 110. záférést J ame ye {elege tesznek b.zonyos S7U ési fel ételeknek.
Me,figyelhetjük, hogy a be 'árá és a lista összekd csalódik, az ügyfé 1 e pedig tudnia ke 1,
hogy egy listát, és nem más öss esítő s erkezetet Caggregátumot) já be, Ebből következik,
hogy az ügyfél egy bizonyos típusú aggregá um 10Z kötődik. Jobb lenne, ha az aggregátum
osztályát az ügyfél kódjának megvaltoztatása nélkül módosíthatnánk - ebben segí a bejá-
rok általánosítía a többalaku bejárás ámogatás '.1102.
Peldaként együk fe , hogy rendelke ünk egy UgráL'sta CSkipList) lista-megvalósí ássa is
(az ugrálista [Pug90] olyan valószínűségi dda .szerke et, ami lasonYt a kiegyensúlyozott
fákhoz), és mi olyan kódot szeretnénk ír " 4mi m'nd a Lista, lind az UgróLista objektu-
mok esetében muködik.
E őször meghatározunk egy Elvontlista (Abstractlist) neVŰ osztályt, ami a listák 7ezelésL-
hez kö ös felületet b'ztosí , S ükség'ink lesz egy elvont Bejáró (Iterator) osztályra is, ami
ugyar gy közö bejárási felületet ad, E után a kü önböző lita-lnegva ósításokho7 etrehoz
hatjuk d konkré Bejáró alos tályokat, Mi dennek eredlnenye a konkrét összesítő osztá-
lyoktó ugge len bejárás lesz.
IvontLis -- lill -- 8 J6r6
gyfél
- -
L6trehozBej r60 Efs6()
Száml ff) Köve ()
HozzM11z( Ism) Kész{)
E/távolft(Efem} Aktu lisE/amO
-
/\ /\
Lista r--------....-.......... ----....... t-
listaB jár
..........
........
t-....---.......___....____ .....................t-__....................___-..._ 1IiIIIII_____ - .... - - ... gr6ListaBejá 6
gró ista
-- - . .
-
6 5a fejezet Viselkedési minták
A kérdés azonban továbbra is aL, logyan hozzuk létre a bejárót. Mivel olyan kódot akarunk
írni, ami független a konkrét Lita alosztályoktól, nem példányosít11atunk egyszeruen egy
bizonyos osztályt. E11elyett a lista objek urnak felelősségi körébe utaJjuk, hogy létrehozzák
a nekik meg .elelő bejárót. Ehl1ez egy Létreho7Bejá ó (Createlte ata ) vagy hasonló művelet
szül<séges, amelyen keresztül az ügyfe ek egy bejáró objektuma igényelletnek.
A Létreho7 Bejáró a Gyártófüggvény mintára mutat példát; itt arra használju {, hogy a7 ügy-
el a J.sta objektumtói a megfelelő bejárót kérhese6 A Gyártó uggvény alka mazása ]{ét osz
tályll'c arc11+át eredményez; egyel a listá r, egyet a bejárák számára. A Lét ehozBejáró gyár-
tófüggvény ezeket "Jöti össze"
Alka m ha óság
A Bejáró inta az alább. esetekben alka mazllató:
El sze etnénk érni egy összesító (aggregát) objektum artalmát, anéll(ül, 10gy ann.ak
belső á.brázolását fe ednénk.
"löbb bejárás módot szeretnénl{ b'ztosítani ÖSSZLSÍto objektumokhoz.
· Egységes felületet szeretnénk adni a külc)nbö ő összesítő szerl{ezetek bejárásához
(vagyis támogatni szeretnénk a többalakú bejárást).
S erk
".
Osszesft6
r ._. -._....._u....._....
....
. . \. ". ..,.
.'.L':W'" .W,.. ....., .,.......,...... ..,..... .".A.,..,.... .WW .... .".. J»"'f ..... ..... ......... ....-.... ..-.. .........-....- ._....,._.._.W.I.'"
t. .u._.. . ._._.... .. _..-.J
88Jár6
LétrshozBejár6{}
Els6(}
Következ6{}
Kész(}
AktuálisBsm()
KonkrétOsszesft6
... ... .... ... ...
Konk t jár6
létrehozBe jár6()
o
I
rerum new Kon;Blthis} ,
B járó 265
--
I es ok
Bejáró
- Felü etet 11atá oz neg elemek elérésére és bejárására.
· KonkrétBejaró
- Megvalósítja a Bejáró (Iterator) felületet.
- Számon tartja, melyik e emnél tartunk az összesítő objektum bejárása orán.
..
Osszesítő
- Felületet 11atároz Jlleg a Bejáró obje {tumol( Jétrehozására.
· KonkrétÖsszesítő
- Megvalósí ja a Be+áró-lé re110' Ó felületet a megfelelő Kan ré -Bejáró (Concrete-
lte ator) pL dány visszaadásához.
yü múködes
A Konk étBejáró számon tartja, me yik e emnél tartunl{ az összesÍtő o11jek um bejárá-
sa során, és képes kiszámítani, me yik a l{övetkező bejárandó obje <tum.
K..v k m'nyek
A Beáró m.1tának három lényeges előnye van:
1. Ta1n.ogatja az összesíto objektulnok bejárásának külön.bözo 1Jáltozatait. Az összetett
aggregátumok általában többféle módon is bejá haták A kód-előállítás vagy a jelentés-
tan. elenőrzés például elemzőfák bejárását igény + 6 Az e ső esetében a bejárás előrefelé
vagy balról jobbra (inord.er) is történ 1et A bejárák segítségével a bejárási algoritmus
l{önnyen mód.Qsítható, csak l{i kel] cserél.nünk a bejárópéldányt egy másikra; új bcjárási
módszere { tárn.ogatásához pedig elég, 11a új Bejáró alosztályo {at 11atározunl{ meg.
2. A bejárók egyszerűbbé teszik az Összesítő felületet. A Bejár? bejárási felülete szük
ségtelenné teszi hasonló ÖsszesítéS fe ü et étre110zásá , így az összes/tő fe ü ete egy-
szerűsödik.
3 Az összesít6n egyszerre több bejárás lehet foljJatnatban A bejá ók számon. tartják sajál
dl1apotukat Cvagyis a bejárás á apolát), így egysze .re több bejárás is folyamatban le11et.
Me valosí ' s
A Bejáró minta megvalósításá a számos lellet6ség k ná kozik; ezek közül az alábbiakban
sorolun.k fe néhányat. E ónyeil< és hátrányaik többnyire az adott nyelv által biztosított ve-
zérlés + szerkezetektől függnek egyes nyelvek (például a ClU [LG86]) azonban kö vetlenül
támogatják ezt a tervezési mintát.
266 5 fejezet · ViseJkedési minták
1 Ki vezéT-[l a bejarást? Ala )vető kérdés annak eldöntése, melyik fél veLérelje a bejá-
ást: a bejáró vagy az azt hasLnáló ügyfél? Amikor a7 ügyfél a vezér o, a bejárót külső
bejárónak hívjuk, amikor a bejáró, belső bejárónak l . A külső bejá ót alkalmazó ügyfe-
le]{nek maguknak kell .éptetniük a bejárást, és k+ .eje7etten kérniük kell a következo
elemet a bejárótól A belső bejárónak ezzel szemben az ügyfél egy végrehajtdndó
műveletet ad át, amit az az összes....tő mind.en elemére alkalmaz
A külső bejárák rugalmasa11ba]{ a belsőknél. Két gYŰjtemény egyenlőségét példá-
ull<öl1nyen fficgvi7sgál]1.atjuk egy külső lJejáróval, míg e7 belső bejáróval gyakor-
latlla.g lellelellen. A be ső bejárák különösen az olyan nye .vekben gyengék ame
lyek nem rend.elkeznek névtelen függvényekkel, zárad.ékolckal (closure, .lyen
a C++), vagy "folytat[ sokkal" (cont.nuations, ilyen a Smalltalk vagy a CLOS). Más-
r[szré51 viszont a belső bejárák 11asználata egyszerűbb, mert meghatározzák a lJe-
Járás logikáját.
2. Ki határozza lneg a bjárási algoritnltlSt? A bejáró nem aL egyel]en hely, allal a bejárá-
si algoritmus megl1atározhaló Az összesítő meghatározJlatja maga is, és a bejárót csu
l)án lrra l1as znál11alja , hogy bejárás ál ap()tát tárolja. A bejáró}\: eme típusát kurzo nak
vagy sormutaté}nak ]1ívjuk, m.uun fe adata csak annyi, 11C)hry az összesÍto aktuális .1elyé-
re mutasson Az ügyfél meghívja a Következő (Next) műveletet az összesítőre a kurzor-
ral mint argumentummal, a Kövelke7ő pedig negváltoztatja a kurzor állapotát 3 .
Ha. a bejárási a]goritmus[rt a l)ejáró felel, könnyű 11gyanazon az összesítőn l<ülönbö-
70 bejárási algoritmusokat alkalmazni, és ugyanannak az algoritmusnak a 11as7nálata
különböző összesítől{ön is egyszerűbb. Más részrc)l a bejárási algoritmusnal{ szüksé
ge lehet arra, 1 0b'Y eJ érje az összesílŐ privát változó+t, mely esetben az algoritmusnak
a bejáróba 11eIyezése megsérti a7 összestő egységbe zárását.
3. Mennyire ellenálló a hqjá1-Ó? Az összesílŐ módosítása a bejárás ki)7ben veszélyes lellet.
Ha ekkor elemeket adunk 110zzá vagy veszünk el belőle, előfordul11at, hogy egy ele
mct kéts7er érünk el, va&:ry te jesen 1{il1agyjuk. A legegyszerúob megoldás, lIa más()Ia-
tot készítünk 37 összesítöről J és a másolatot járjuk be, de ez általaban lúl kö]tséges.
Egy ellenálló bejáró biLtosítja t hogy a hozzáadás és eltávolítás nem befolyásolja a bejá-
rá.st, és ezt anélkül érj el, 110gy lnásolatot ](észítene az összesÍtő ál. Az ilyen hejá.ók
megvalósításá.3 számos mód kín.á.l (üzik. A legtöbbnek az az alapja, hogyabejáréJt
bejegyeztetjük az ijss7esítő számára. Elem beszúrásakor vagy eltávolításakor az
ÖSSZcsÍlŐ módosítja az állala aJI{almazott bejárák belső á la.patál, vagy a l1elyes bejá-
rás bi7tOStásállOZ belső]eg tárolja a zükséges információt.
Kofler [1(of93J k.t(Ínó leírást ad a7 ellenálló (robuszlut» beáró ( lnegvalósításáról az
E1"++-11an, lníg Murray [Mur93J a mcgvalósítást a DSL StandardComponents List OS7-
tályávall(apcsolatlJan tárgyalja.
1. Boocl1 aktív é passzív l)cjárÓ](ént llivatkozik rájuk [Boo941 Ezek a fogalmak aL ügyfél szerepére, és DCln a bejá-
ró al{tivításának f(}kára ,,'"onatkoznak.
3 A kllfzorok. az .FtnlékezteLő Illi11tára adnak eg)rszerű példát J és mebrvalósításuk is sok S/colponLbólllasonló.
Bejáró 267
4. További bejáró r luveletek. A lehetsége egkisebb Bejáró felület a7 E]ső, Követ (ező
Kész és AktuálisElcm (First, Next, IsDone, CurrenlItem) műve]etel{ből á11 4 . Emellett
azon11an továbbj műveletek is hasznosak lehetnek A rende elt aggregátumok pél
dáu rendel (ezhetnek egy Előző (Previaus) művelettel, ami a bejárót a megel(57(5
elemre á lí ja. Egy Ug áslde (Sl{ipTo) művelet a rendezett vagy sors7ámozott (inde-
xe t) gyűjtemények esetében jöhet jó]. Egy ilyen művelettel a bejá. ót egy olyan ob-
jektumra állíthatjuk, amely megfelel bizonyos követel 1ényeknek.
5 Többalakú heJárók használata a C++-han A többalakú bejáróknak megvan a ma-
guk ára. Azt génylik1 hogy d bejáró objektumot egy gyártófüggvénnyel dinamikusan
10zzuk étre. En1iatt 11asználatukal cé szerű azokra aL eselekre J{orlátozni amikor
tényleg szükség van a többa akúság a. Más esetekben a l{al lazzunk inkább konkrét
bejárókat, amelyeket a verembe l1elyez.l1etünk.
A többa akú bejáróknak van egy mas_k hátulüt6jü '"" is: törlésükért az ügyfél fe e-
lős. Az ilyen esetekben nagy a llibalehetőség, 11iszen könnyen 1egfe edkezhe-
tünk a kupaera helyezett bejáró objektu TI megsemmjsítéséről, lla már nincs rá
szükség. Ez különösen al{kor valószínű ha egy műveletben több '""ilépési pont
van; ha valahol kivétel ép :el, a bejáró objektum állal elfoglalt hely felszabadítá-
sára solla nem kerü sor.
Gyógyírt a Helyettes tervezé&i minta ]{/nál Ekkor a tény eg es bejáró helyett egy
veremfoglalású 11elyettest használunk, amely d.estruktorában törli a bejárót, így
amkor a 11elyettes kikerül a 11atól{örbő., ve e együtt a7 ,igazj bejáró is ll1egsem-
misül A helyettes megfelelő ta arJtást biztosít, még kivételek fellé Jése esetén is
A megoldás nem más, mint a jól ismert C++-elv, taz erőforrás-fog]alás egyben elő-
készítés (nicializá á))' [ES90] alkalmazása. lováb Ji részleteket a lJéldak{)d rész-
ben lát11alunk.
6 A bejárák kivételezett hozz4f é réssel re.ndelkezhetnek A bejáról("a úgy is tekntlle-
tönk, mint az őket étre110zó össLesÍtők bővítéseire A bejáró és a7 ÖSS7eSJtő szoros
csatolásban á Inak egymássa]; ezt a {apcso atot a C++-lJan éldául úgy feje7hetjilk
ki ha abejárót összesítője "barátjává" (friend) tesszük. Ekkor az ()s7esítőben nem
kell olyan lűve eteket megllatároznun]<, amelyek egyetlen célja, hogy lehet6vé te-
gyék a bejárák számára a bejárás hatél{ony megvalósítását
Mind.a oná]tal az ilyen kivéte ezel h07záférés az új bcjárási módok llegadását meg-
nehezíti, mert az új barát 110zzáadása az öSS7esítő felületének módos'tását igényli.
Enne'"" elkerülésére a Bejáró oszlály védett (protected) műve eteJ{et tartalmazhat,
melye {en keresztül az összesÍtő fontos, de nyilvánosan nem elé l1ctő agjaill()Z fér-
hetünk hozzá. A Bejáró alosztályai Cé kizárólag azok) ezekkel a védett művclctek
kel nyer11etnek kivételezett110zzáférést az összesítő übjektuml1.oz
4 A felületet még kisebbé leheLjijl{) .ha a Következőt Kész és AktuálísElem műveleteket egyetlen műveletl)en eg)1"C-
sítjilk amely a követkettő objeklumra lép és viss7aadja azt. lia a bejárás befejeződött a művelet egy különleges
értékkel tér vissza (például O-val) ami a bejJrás vég(.t jelzi.
2 8 5. fejezet · Viselkedési minták
7. BeJ-árók osszetételek számára. A külső bejárák megvalósítása az o yan önhvó össze-
s"'tő szerkezetek (rekurzív aggregátumok) esetében, mint amilyeneket az Összetétel
mintában talá hatunk, nehéz lehet, mert a szerkezet egy adott pozc'ója a be.ágyazot
aggregátumok számos szintjét átfogllatja. Ekkor d külső bejárónak tárolnia --ell az
összetételen keres7ti.] vezető úlvonalat 110gy megállapít lassa, melyik az aktuáli
()lljektuln Ennél sol<szor egyszerűbb egy belső bejáró 11asználata, ami az aktuá is he-
lyet egys7eruen önmaga ismételt meghívásával képes rögzíteni, s így egyben tárolni
az útvonalat a hívásj veremben.
lia az adott összetétel csomópontjai rendelkeznek egy felülettel, ami 3 testvérekre,
szü őkre vagy gyermekekre ugrást szolgálja, egy (urzor alapú bejáró jobb rnegoldás
lel1et A l(ur7orna { csak a7 aktuá is csomópontot kel s7ámon tartana, az öss7etétel
bejárásál1.oz támaszkodh.at az említett fe ületre
Az összetételeket gyakran többféleképpen szül{séges bejárni. A leggyakoribb az elő-
re haladó, a visszafelé haladó, a bal ól Jobbra haladó Cnorder) és a szélességi bejárás
(horizontális bejárás, breadth-first). Ezeket külön bejáró osztálya -al támogathatju y.
84 Null bejárák. A NuUBejáró olyan csökevényes bejá ó, amely a ko látfeltte]e]{ ]{eze}[-
sénél jöhet jól. Meghatározáa szerínt a Nu Iterator mindig végzet abejárással, va-
gyis !«(sz (150one) művelete InindOg true-ra Lftékelőd"l{ ki.
A Nul Bejáró a fas7e kezetű aggregátumok (amilyenek a7 Össze ételek is) bejárását
teheti könnyebbé. A bejárás mínden pontján elkérjü { az aktuális elem gyermekeit;
az összesít6 eleme]{ a SLokott ill.ódon egy konkrét bejárót adnak vssza, a levélele-
mek azonban egy NullBejáró példányt. EZ7e a megoldással a teljes szerkezete egy-
ségesen jár 1atjuk be.
Pél kó
Egy egyszeru Lista osztály (List) mcgvalósítását fogjuk megnézni, amely fésze az alap-
könYVlárunknak (lásd a C függeléket). Ké Bejá ó-megvalósítást mutatunk be: egyet a Jista
el6re haladó bejárásához, eh'Yet pedig a visszafelé halac áshoz, (Az alap yönyvtár csak az el-
sőt támogatja,) Ezután megmutat juk, hogyan kell használni ezeket abejárókatt és 10gyan
kerülhetjük cI, hogy egy adott illegvalósításhoz kötődjünk. Ezt követően némi módosítást
hajtun{ véh re , hogy gondoskodhassunk a bejárók megfelelo törléséről. Az utolsó példa egy
belső bejárót mutat be, és összehason ítja azt külső meg elelő'éve .
1. A list és Iterator felü letek r Először tekintsük meg a List felületnek azt a részét, ame-
lyik a bejárák megva ós"tása szempontjából lényeges, A teljes felületet a C függelék-
ben talál11atjuk meg.
template <class Ttem>
class List {
pub ic:
List(long size = DEFAULT_LIST_CAPACITY);
long Count() const;
(
Bejár 69
I
Item& Get (long index) consti
/ / . . .
} ;
A List osztály nyi vános felületén keresztü megle 1etósen hatékony módot ad a bejá-
fás tá . ogatására; mindkét tlPUSU be.árás megvalós tásához megfelel. Igy nincs s üb..-
ség arra hogy abejároknak kivételezett hozzáférést ad'unk a l1atté +bcn_ leglJúvó adat-
s erkeze hez, vagyis a bejáró osztá yol{ nem baratjai (friend) a List osztálynak.
A különbözo bejdrások eSLrevellen }1ds7nálatát úgy támogat juk, 110gy é reho unk. egy
elvont Iterator os tá yt, amely megI atározza a bejáró felületet.
template <class Item>
class Iterator {
public:
virtual
virtual
virtual
virtual
protected:
Iterator() ;
void
void
baal
Item
First() = O;
Next() = O;
IsDone() const = O.
CurrentItem() const = O;
} ,
2. Az Iterator a/osztályainak megv .lósítást " A ListIteraLor (ListaBejá -ó) a7 Ite
rator alos tálya
template <class Item>
class ListIterator : public Iterator<Item> {
public:
Listlterator{const List<Itern>* aList) ;
virtual void First().
virtual void Next() ·
v ir tual baal IsDone() const;
virtual Item Currentltem() const;
private:
const List<Itern>* _listA
long current.
} ;
A ListILerator megv'alósltása egyszerű. A Listet a current indexszel együt
tárolja:
template <class Item>
Listlterator<Item>:: ListIterator (
const List<Item>* aList
) : list(aList)1 _current (O) {
}
A First (Első) az e ső e e lre állí ja a be.áró
template <class Item>
void ListIterator<Item>: :Flrst () {
current = O;
}
2 O 5. fejezet · Viselkedési minták
A Next (Következő) a következő elemre léptet:
template <class Item>
void ListIterator<Item>::Next () {
_current++;
"'
}
Az IsDone (Kész) ellcnőr7i, hogy al: ind,ex a listán belü i elemre hivatkozik-e:
template <class Item>
vajd Listlterator<Item>: : IsDone () const {
return _current >= _list->Count();
}
Végül a CurrentItem (AktuálisElem) az aktuális index által jelzett helyen levő ele-
mel adja vissza. lia a bejárás már bcfejeződött, IleratorOutOfBounds kivételt
váltunk kj:
template <class Item>
Item Listlterator<Item>: :CurrentItem () const {
i f (I sDone ( )) {
throw IteratorOutOfBounds;
}
return list->Get(current);
}
A visszafelé haladó ReverseListIterator megva ós"'tása ugyanilyen, de annak
First műve,.ete a _current +ndexet a lista végére állítja, a Next ped>g az első elem
irányába csökkenti a current é tékét.
3. A bejárák ha.ználata Tételezzük e , hogy van egy listánk:, ame.y Employee (Alkal-
ffidzott) objektumokat tartallnaz, és az összes alkalmazottat l{i szeretnénk íratni. Ez az
Employee osztálya Print (Kiír) múvelettel támogatja. A lista kiírásához a PrinL-
Employees (KiírA kalmazottak) műveletet határozzuk meg, amelynek argumentuma
egy bejáró, a 11ellyel a művelet bejárja és kiírja a listát
vo .,d PrintEmployees (Iterator<Employee*>& i) {
for (i..First()i !i.IsDone{); i.Next()) {
i.CurrentItem()->Print();
}
}
Mive] mind el(5re l1a adó) mind visszafelé haladó bejáróval endelkezünk a fenti mű-
velet újrdt)aS7nosítdsávaJ mindkét sorrendlJen kiírathatjuk az alkalmazottakat
List<Employee*>* employees;
/ / . . .
List.Jterato '""<Employee*> forward (employees) ;
ReverseListIterator<Employee*> backward(employees) ;
PrintEmployees(forward);
PrintEmployees(backward);
ejáró 271
4. Egv adott lista-nzegvalósításhoz vató kötődés elkerülése. Vizsgálju]( n1eg, l10gyan érinte-
né bejáró kódunkat, ha a Lisl-et ugrólistaként valósítanánk neg. A List SkipList
alosztályána ( b 9 ztosítania ]{ell egy SkipList Iterator-t CUgróListalejáró), ame]y
megvalósítja az Iterator felületet. A SkipListIterator-nal( a }Jejárás hatékol1Y
vég ehajtásá lOZ nem elég csupán egy indexet fenntartania, (le mi\rel a7 ()shtály megfe-
lel az 1 t er a tor [clületnek, aPr in t Emp 1 oyee s művelet a .llior is l1asználh.ató, 113 az
alkaln1a7ottakat ehry SkipLi s l objeklumban lároljuk.
SkipList<Employee*>* empJoyees;
/ / + . .
S]'ipListl terator<Ernployee*> i terator (ernployees) ;
PrintEmployees (i tera.tor) ;
Bár ez a megközelílét, működik, jobb lenne, lla nern kötódnén!( egy bizonyos Lis t-
megvalósításhoz (ebben az esetllen konkrétaJl a SkipList-]lez). Beve7etlletnénk
egy AbsLractLisl (Elvontlisla) ncvű elvont osztályt amcllyel szabványosít11atjul(
a listafelületet a különböző lista-illegva}{)sftáso]<:hoz. Ekkor a Li s t és a SkipLi s l
az AbstractList alosztályai lennének.
A tölJbalakú bejárás lelletővé lételél1ez az AbslractList a CreaLelteralor
(Létrcho.lBejáró) gyártófüggvényt l1atározllatja meg, al11.it az alosztályok feliilírnal<,
l10gy visszaadják a megfelelő bejáról:
template<class Item>
class AbstractList {
public:
virtual lterator<Item>* CreateIterator{) const - O;
/ / . . .
} ;
Igy lnásik lehetőség, hogy egy á talános mixin oS7tályt J1atározunk Dleg Traver-
sable (BejárlIaló) néven, ami a bejárák lélrcllozásának fclülctét írja Ic. Az ÖSSZLSÍtó
osztályok így a Traversable ,l)ekeverésével' tdm()gatl1atjál< a lc)lJba]akú lJejárást.
A List a CreateIterator felülbírálásával egy ListIterator objektulTIot ad
VIssza:
tcmplate<class Item>
Iterator<ltem>* List<Item>::Createlterator() const {
return new ListIterator<Item>(this) ;
}
Most már a1Jban a helyzetben vagYIJnk, 110gy ]{onkrét l11egvalósítástól függet]en kó-
dOL írlldtunk az alkalmazottak listájának kiíratására
1/ csak azt tudjuk, hogy van egy AbstractListünk
AbstractList<Employee*>* employeesi
II · · ·
Iterator<Employee*>* iterator -
PrintEmployees(*iterator) ;
deJete jterator;
employees->Credtelterator() ·
. -
272
5. fejezet · Viselkedési mintak
5. A bejárák lörlésének biztosítása. Figyeljük meg, hogy a CreateILerator egy úJon
nan létrellc)7ott bejáró olJjcktLlffiOt ad vissza., lnelynek törléséért mi felelünk. fIa elfe-
lejtjük t il1emóriaszivárgást idézhetünk elő, Az ügyfelek dolgát megkönnyítcndő hiz-
tosítunk egy IteratorPtr (BejáróMutató) nevű rnutatÓt, ami bejáróhclyettesként
viselkedik, és gondoskodik az Iterator objektum megsemmistésérőlt ha arra
nincs többé szükség.
Az IleratorPtr-nek mindig 3. veremben foglalunk 11elyet. 5 A C++ aut() natikllsan
nleghívja majd a d<:struktorát, amely törli magát abejárót. A7 IteratorPtr túlter-
heli mind az operator->, mmd az operator* műveleteket, így pontosdn egy be-
járót címző mutatóként kezdhető, AL IteratorPtr tagjainak meg"alósítása hely-
lJen }(ifcjtett Cinline), így nem okoznal( többlelterh.et+
tcmplaLe<class Ttem>
class IteratorPtr {
public:
IteratorPtr(ILerator<Item>* i) = i(j) { }
IteratorPtr () { delete _l; }
Iterator<Item>* operator->() { return _li }
lterator<Item>& operator*() { return *_ii }
private:
/1 a másolás és hozzárendelés tiltasa , hogy
II elkerüljük az l többs7öri törlését
\
I
f
,
lteratorptr(const IteratorPtr&),
lteratorPtr& operator(const IteratorPtr&);
pri va.te:
Iterator<Item>* _j;
} ;
\
A7 ILeratorPLr lel1etővé teszi 110gy egyszerusítl1cssük a l{iíró kódot:
AbstractLisl<Employee*>* employees;
/ / . . -
IteratorPtr<Employee*> iteralor(employees->createIterator());
PrintRmployees(*iterator);
6. 4f!.Y belső listabejáró. Utolsó példaként nézzük meg egy belső vagy passzív T,isL-
Jterator osztály egy lehetséges megvalÓsítását. Itt a bejárÓ vezérli a bejárást) és
min (i.e n. clemen végrellajt egy mtívelctcl.
A kérdés ebben az esetben az, hogyan adjuk át a bejárónak paraméterként az cleme-
ken végrehajtandó műveleteket. A C++ nem támogatja a névtelen függvényeket vagy
záradél{okat (closure), arnelyek más nye]vel{ben e feladatra rend.el1(ezésre áJlnak.
Legalább két lehetőségünk azért akad: (n egy füghJVényre hivatkozÓ (globális vagy
statikus) mutatóban átadni a7 információt) vagy (2) alosztályokra támaszkodni.
S Ezt fordítjskor egyszeruen biztosíthatjuk, ha privát new (ÚP 6s de 1 ete (tÖröl) műveleteket vezclÜnk be. Meg-
val()sítás ncn1 szül<ségcs ll()zzájuk_
Bejáró 273
Az első esetben a bejáró minden elemnél megh'vja a számára átaclott l11.úve etet,
a másod 6 .kban egyetlen műve]etel 1ÍV meg, amelyet a megfe elő viselledés b+ztosítá-
sa érdekében az alosztályok fe ü bírálnak
Egyik megoldás sem tökéletes A bejárás közben gyal<fan szükség ehet az állapot nyo-
mon köve ésére, a függvények ped+g nem igazán alkalmasal{ erre; az állapotot statikus
változókkal ke ene számon tartanunk. Egy Iterator alos7tályban l{ényelmesen e -
helyzl1etjük az állapotinfofl11ációt, mondjuk egy példányvá tozóban, de a kü önböző
bejárások1107 külön-külön alosztályt létrehozni rengeteg munkát igényel.
Ime a második, alosztályokat használó megoldás vázlata. A belséS1Jejáró neve itt List-
Traverser.
template<class Item>
class ListTraverser {
public:
ListTraverser(List<Item>* aList)j
bool Traverse();
protecced:
virtual baal Processltem(const Item&) - O;
private:
ListIterator<Item> _iteratori
} ;
A ListTraverser paraméte ként egy List példány kap, és egy külső List-
Iteralor segítségéve lajt ja végre a bejárást. A Traverse elke7di a bejárást, [s
minden elemre megllÍv>a a Process It em (Feido gozElem) műve] etet. A belső bejá-
ró a bejárást aZ7al fejezheti be, llogy false értéket ad vissza a ProcessItem-ből.
A Traverse tájékoztat, ha a bejárás idő előtt befejeződöt.
template<cJass Item>
ListTraverser<Item>: :Listraverser (
List<Item>* aLi st
) : _i terator (aList) { }
template<class Item>
baal ListTraverser<Item>: : Traverse () (
boal result = false;
for (
iterator.First() ;
!_iterator.IsDone() ;
_i terator.. Next ( )
) (
result = Processltem(iterator.Currentltern());
if (resu] t ::::= false) {
breaJ.c;
}
}
returrl result;
}
274 5. fejezet · Viselkedési minták
A ListTraverser segítségével írassuk ki az e s6 tíz alkaln1azottot a listából. El111ez
alosztályokat kell s7árm.aztatnunk a ListTraverser-böl, és felül kell bírálnuk
a Processltem műveletet. A k.írt alkalmazotta{ számát a _count példáoyv-áltozó-
ban számláljul{ meg.
class PrintNEmployees : public ListTraverser<Employee*> {
public:
PrintNEmployees(List<Employee*>* aList J int n) :
ListTraverser<Employee*> (aLi st) ,
_total(n), _count{ü) ( }
protected:
boal Processltem(Employee* const&)i
private:
int total;
int _cQunt;
} ;
baal PrintNEmployees: :Processltem (Employee* const& e) {
count.++ ·
- ,
e->Prlnt() ;
return count < total.
,
I
}
A PrintNEmployees az dlábbi módon írja ki az első tíz alkalmazott nevét:
List<Employee*>* employees;
I / · · ·
PrintNEmployees pa (employees, 10)i
pa.Traverse();
Megfigyelhetjük, hogy az ügyfél nem 1atározza meg a bejárási ciklust; a teljes bejárá-
si logika újrahasznosítható. Ez a belső bejáró { lehfontosabb 11as7oa. Kicsit tóbb
munkát igényel ugyan, l11int a külső bejáról{ Ilas7nálata mert meg kel111atároznunk
egy (lj osztályt Vessük össze ezt egy külső bejáró alkalma7ásával
ListIterator<Employee*> i(employees);
int count = O;
l
,
for (i. First (); ! i. IsDone (); l. Next ( )) {
count++;
i.Currentltem()->Print() i
if (count >::: 10) {
brea]( ;
}
}
A belső bejáról{ többféle bejá .ást zárhatna r egységbe. Fi 1 tering'ListTraverser
(Szűré5L'staBejáró) néven pé dául egy olyan bejdrást adhatunk meg t amely csak a7Q-
kat az elemeket do gozza fel, amelyek megfe e nek bizonyos követelmé.nyeknek:
Bejár625
template<class Item>
class FilteringListTraverser {
public:
FilteringListTraverser{List<Item>* aLi st) ;
baül Traverse();
protected:
virtual baal Processltem(const Item&) = O;
virtual boal Testltem(const Item&) = O;
private:
Listlterator<Item> _iterator;
} i
Ez a felület megegyezik a ListTraverser-ével, azza a különbséggel, hogy hozzá-
adtuk a követelményeket ellenőrző TestItem (Teszte E em) tagfüggvényt. Az al-
osztálya;r ennek felülbírálásával 1ajlják végre az e lenőrzést
A Traverse az ellenő zés eredményéne .7 függvényében dönti e , hogy folytatja e
a bejárást:
temp ate<class Item>
void FilteringListTraverser<Item>::Traverse() {
baal result = falsei
for (
_iterator_First();
! iterator_IsDone{);
_iterator.Next()
) {
if (TestItem(_iterator.CurrentItem())) {
result = Processltem(_iteratorCurrentltem())j
if (result == false) {
break;
}
}
}
return result;
}
A fent' osztá y egy mábi r változatában úgy is meghatározhatnánk a Traverse mű-
veletet, hogy már akkor is eredményt adjon, ha legalabb egy e em teljesíti a köve-
telményeket. 6
6 A Traverse művelet ezekben a példákban SablonfüggvénYt melynek aJapmtiveletci a TestItern és
a ProcessItem.
276 5. fejezet · Viselkedesi mjnták
sme
Ih s nálaso
A Jejárók 1étköznapinak s7ámítanak az objektum 7özpontú rendszerekben; a legtöbb gyűj-
teményosztály-könyvtár kínál bejárókat valami yen formá.ban.
.......
Íme ei:,'Y példa erre a Booch komponensek közül [Boo94 , amely egy néps7eru gyű"temény-
osztály- {önyvtár. A könyvtárban megtalálható a sor (queue) rögzítet méretű (ror átos) és
dinamikusan növekvő (nem korlátos) megvalósítása is. FelületÜ az elvont Queue osztá y
írja e. A különböző megvalósításokhoz a könyvtár úgy biztosí 'a a többalakú be'ár.1s , hogy
a sorbejárót az elvont Queue osztály elület"e alapozva valósít"a meg. Ennek az az előnye,
hogy nincs szükség gyáItófüggvényre, a n' a sor-megva ósításoktól e kéri a megfelelő bejá-
rót. Termés etesen az elvont Queue osztály felü etének elegendő szolgáltatást (e J biztosí-
tania al1hoz, 10gy a bejárótl1atékonyan megvalósítl1assuk.
A Smalltalk nem igény i a bejá ók kifejezett meghatározását, A s7abványos gyűjteményosz-
tályok (Bag, Set, Dictionary, OrderedCollection, String stb.) mind meghatároznak egy belső
bejáró metódust (do'), amely argumenlumként egy bakkal (vagyis záradékot) kap,
A gyűjtemény minden eleme kapcsolódik a blokkban levő he yi változóhoz, majd a blokk
végrehajtódik. A Smal talk emellett Stream (Fo yam) oS7tályokat is tarta maz J amelyek tá-
mogatnak egy, a bejá 'ókhoz hasonló felü etet. A ReadStream (OlvasFolyam) lényegében
véve egy bejáró, és minden soros eé ésű gyűjtemény külső bcjárójaként alka Jnazható.
A nem soros elérésű gYŰjtemények (pl Set, Dictionary) számára nem á.l rende kezésre
szabványos külső bejáró.
A ko ábban leírt takarító helyettest és többalakú bejárókat az ET++ tároló osztályai biztosí -
ják rWGM88J. A Unidraw grafikus szer {esztő 7eretrendszeri osztályai '(urzor a apú bejáró-
kat l1asználnak [Vl90]
A ObjectW'ndows 2.0 [Bor941 bejárák egész osztályhierarchiáját kínálja a tárolókhoz; se-
gítségükkel a különbö7ő tárolótípusok ugyanúgy járhatók be. A bejá ás itt az utótagos nö-
velő múvelet C++) túlterhelésén alapul, amely előre léptet" abejárót.
K p solódó mi ák
Összetétel: Bejárókat gyakran alkalmazunk az olyan önhÍvó szerke7etek esetében, mint az
Összetételek.
Gyártófüggvény: A többalakú bejárák a megfeleló Bejáró alosztályok példányoításához
gyártófüggvényekre támaszkodnak.
Emlékeztető: Gyakran alkal.lazzák együtt a Bejáró mintával. A bejárók belsőleg tárait "eIn-
lékeztelől<u segítségével rögzíthetJ{ a bejárás állapotát.
Kö etftó 277
I
.
I
Viselkedési obj ektumminta
Egybnvk
Mediator
Cél
A cé meg11atározn egy objektumot, amely objektllmok egy 11almazának együttműködését
irányítja. (Vagyis ezeket egyetlen objektumba tokoz-lu be.) A módszerrella.za csatolást 110-
zunk létre, amelyben az egyes objek urnak közvet enül nem 1ivatko halna ( egy111ásra,
a köztük levő kapcolatok edig egymástól független -il módosít]l.atók
Fiad t
Az objektumközpontúság arra ösztönöz, .logy a kívánt vise kedést obJektumo,k {özött
osszuk szét. A visel {edés e osztása vszont olyan objel{tumszerkezetet eredményezilet,
amelyben az objekturnok között számta an kapcsolat létezik a legross7abh esetben min-
elen objektu tud li ag minden objektumról. Bár egy rendszer több objektumra való fe]-
osztása általában növeli az újra11asznosíthatóságot, a kapcsolatok szövevénye csökkenti
azt. Ha egy o'bjektu 1 szárnos másikka ál bonyolult kapcsoJatban, valószínubb, 110 b Y azok
segítsége nélkül nem képes ellálni a feladatát, így a rendszer "lömoszerűen" visell{edik. Sőt,
a rendszer működéséne jelentősebb megváltoztatása i nehe7ebbé válik, l1iszen a viselke-
dést számos objektum között osztoltuk szét, így arra {ényszerül11etünk, hogya rendszer
működésének testreszabásához sok-sok alosztályt kelljen létrell07nu 1k
Példaként vegyü { a párbes édablakok megva ósítását ehY gra ikus fe llasználói felü cten.
A párbes7éd.ablak az alább ábrán bemuta ott110Z hasonló n1ódon egy ablak segítségével kí-
nál fel számos grafikus ve7érlőe]emet, például gombokat, menüket vagy bev+te i mezőket:
r". .......,.." .L. . .........,............."...................... ............. ....... .....- ..,.... .".. ... .".,. ...... ... .' ''":;3'' '-'. .,..
... '::Rx:J.f,: .rrr:. ,U .:.1. ...;; .'. .... ....; 1,-,.. .. ,. ; .'-.. ........., ,.- .... .1'1-.1.
.- ..........,.........,...,..................................................... ...............,.....,.I,orI...I..,.......L-r...I"I'1I.t1.............. ...,..t{J..
/: . .. .. . . . -. ...... ... - . . . - . . (
The quick brown fox... 1
"L .
.
Fund ly __.!'Y...___QQ _
.
avartt garde
. hicngo \
ouricr
helvetica
1 ew ren b.11 hool bOG k \
pulfttino
'. li ro1113J \
ld Ir dillll,bU I
'. \V gbt o !ncdium ff) bel dit (:.: f.) .,. .:.i i
'. S]ant O rom RU (i'itdir- ,)j::J.;',iC
':
S[ZC 1 34 ])t lU! Ocondens..ed
i
( Cd hec] J ( OK] t
.
,
.
1.......................... .................... .1. .......1 .............................'I.....L.....L ..... ............. .......... . .,.... ...................'I........Io"n............. ..'1....,
278 5. fejezet · Viselkedési mintak
Az ablak vezérlői között gyakran függőségek állnak fennt például valamelyik gombot le kell
tiltanunk, ha egy adott beviteli mező üres t V3h7 meg kell változtatnunk a mező tartaimát, ha
a fc1has7náló kiválaszt egy elemet egy listamezőbőL Ezek fordítottja is el6fordulhat, vagy's
a mezőbe írás is automatikusan kiválthatja a megfelelő elem vagy elemek kijelölését a lista-
mezó1Jen, illetve eb'Yes gombok elér11etővé válhatnak, hogy 3. felhasználó számá a lelletővé
tegyék t hogy felhasználhassa a beírt szöveget t mondjuk módosítsa vagy tÖrölje azt a dolgot,
amire a szcJveg hivatk()7ik+
A különböző párbesLédablakokban a vezérlők között különfée kapcso atok állhatnak fenn.
Így bár ezek az ablakok általában hasonló elemeket taJtalmaznak t neIn használhatják fel au-
tomatikusan a vezérlőos7tályokat; előbb azok testreszabására van szükség, hob:lJ' tükrözzék
az adcJlt párbeszéd.ablal{ban fennálló függőségekel. Az alosztályok létrehc)zásával l()rténő
egyedi testres7abás mindazonáltal kimerítő lehet, hlszcn rengeteg osztályról van szó.
Mindernc problémákat úgy kerülhetjük el, ha a közös viselkedést eb'Y önálló közvetítő objek-
tumba záfJuk. A közvetítő feladatat hOh7 vezérelje és összehango ja objektumok egy cso-
portjának együttműködését. A közvetítő olyan kÖztes rétegként szo gál, andy megakadá-
lyozza, hogya csoport objektumai közvetlenÜl hivatko7zanak egymásra. Az objektumok
csak a közvetítőt ismerik, í&ry a keresztkapcsolatok száma jelentősen lecsökken.
Példáullétrehozunk egy kÖ7vetítőt BetűtípusPárbeszédablaklrányító (FontDialogDirector) né-
ven, amely egy betűtípus-váh
sztó párheszédablak veLérlőit hangolja össze. A FontDialog-
Dit celor ismeri valamennyi velérlőt, így konlffiunikációs eloszté)ként viselkedil{ a ve7érlől{
"., -'
szamara:
egyÜgyfél
ol' ,1 t'
Iranyrto
egylistaMez6
., "
,ranyrto
egyBetútfpusPárbeszédabtald rányft6
egyGomb
iranyitó
egyBeviteliMez6
. s ,
IranYIto
KözvetJtó 279
A7 alábbi egyi1ttműködési diagram azt illusztrá ja, 10gyan működnek együtt dZ objeklu-
mok
ha a listamezőben kijelöl elem mód.osul:
,özvetftó K l1égák
egyÜgyfél egyBetiitfpusPárbeszédablak[rányrt6 egyL. staMez6 egyBeviteliMezii
MutatPárbeszédab[ak()
Vezér16Megvá1tozott()
SzerazKijeJölésO
BeáUftSzöveg()
Íme az események sorrendje, melyek során a listame7őben kije ölt e em átadódik a beviteli
mezőne](:
1. A listamező közl
az irányítóval (d.rector), 110gy megváltozott.
2
Az irányító elk[r
a kijelölt elemet a Jistától+
3
Az irányító átadja a kijc 'ölt elemet a bevitel. me7őne]{.
4
Most, hogy a bCV+lcli mező s7öveget tartal.1 az, az irányító elérlletővé teszi a művele-
tek kezd.eményezésére (nfélkövér)', ))dőlt") S oigá Ó goml1okat+
Fii:,'1 Jel jük meg, llogyan közvetít az irányító a lista és a bevite i me7ő l<özött. A vezér Ő-k egy
mással nem társa ognak kÖlvetlenül} csak közvetetten, az
rányítón keres71ül. Nem ]<e]]
tudniuk egymásról, csak az irányítót kell ismerniük. Továbbá, m
vel a viselkedést egyetlen
osztály tarta mazza, az eme ebyetlen oS7tá y l")ővítésével vagy kicserélésével mód.os"'tható.
Az alábbi áb .án azt látllatju (, 110gyan építllctő be a BetűtípusPárbeszédablaklrányító elvont
szerkezete egy oS7tálykönyvtárba:
PárbeszédablakJrányft6 irányít6 Vezér/6
--
.........
Ma gv.áltozott() 0- ------
M utatP érbeszédablak()
LétrehozVezérl6k{)
Vezérl6MegváltolDtt(Vezérl6)
/\
UstaMez6 Bevite liMez6
BetútfpusPárb.ablaklrányft6 lista
......... SzerezKijelölás( ) BeáHrtSzöv. ()
.... .....
LétrehozVezér16k( ) mal6
Vezérlő Megvéttozott(Vezéri6)
irányrt6->Vemrt6Megválrozott(this)
80 5. fejezet Viselkedési minták
A PárbeszédablakJránytó (DalogDjrector) egy elvont osztály, amely a párbeszédablakok
á talános vise kedését írja e. Az ügyfelek a MutatPárbeszédablak (ShowDia og) művele
meghívásával megjeleníthetik az ablakot a képernyőn. A Lét"ehozVezérlők CCreateW"dgets)
elvont művelet az ablak vezérlőine {létrehozására szolgál. A VezérlőMegváltozott (Widgel-
Changed) egy másik e]vont műve et, amelyet a vezérlők akkor hívnak meg, amikor lájékoz
tatn' akarják a7 irányítót, lOgy áJlapotuk mef,JVá]tozott. A })árbeszédablaklrányító alosztl-
lya. a étre 10zVezérlők felü]rásávallloz7á ;r létre a megfelelő vezér őket, a változások ke-
7elésé11ez pedig a Vezérl6Megválto7ott nűve etet bíráljá. felül
J
II
Al alma h tós
,
I
I
A KC)7vetÍtő ffi'nta alka mazása a következő esetekben célszerű:
· Objektumok egy halmaza jó meghatározott J de bonyolult módon kommuniká egy-
mással. Az előál ó kölcsönös függ6ségek szerkezete eset eges és nellezen át átllató.
Egy o Jjel{tum újrahasznosítása nehéz, mert SZdffiOS más objektumra hivatko ik, · let-
ve számo más objel{tummal tart kapcso atol.
· Tc)l)l) osztály h.ö7Ött elosztott viselkedést kellene a osztályok sokasága nélkül
testreszabnunk
S rkezet
Kozvetft6 ózvet Kolléga
--
-
/\
KonkrétKözvetf ó KonkrétKor é a1 .... Konkré Kali ga2
-
k. ft6
Egy jellegzetes objektumszerkezet gy nézhet ki:
egyKolléga
egyKolléga
közvetítő
közvetítő
közvetrtö
egyKonkr tKözvetft6
egyKolléga
egy 011 ga
egyKolléga
közv etítő
közvetítő
Közvetftó 281
sztvevók
· Közvetltő (Pá beszédablakIrányító)
- Felületet l1atár() meg a Kolléga CCol]eague) objektummal va ó kapcso attartás 10Z
· Ko nkrétKözvetító (Betűtí pusl)árbeszéda b lakIrá n y-' tó)
- A Kolléga objektumok összehangolásával {ialakítja az együttműködést.
- Ismeri kollégáit és gondoskodik róluk.
Kol ega osztályok (ListaMe7é5, BeviteliMez6)
- Minden Kolléga osztály ismeri a Közvetítő (Mediator) objektumál.
A kollégák ITI -.nden olyan esetllen a közvetítéShöz fordulnak, amikor egy másik
kollégával szeretnének kommunikáln.i
I Ü mu adás
A kollégák l{érelmeket küldene '( a Közvetítő objektumokna. r és l{érelmeket fogad-
nak onnan. A7 egyiittműködést a közvetítő alakítja k- azzal, lObY továbbítja a kéreI-
meket a megfelelő kollégá( :r)na {4
Köv tk meny
A Közvetítő tervezési mi Ita előnyei és hátrányai a ,,-övetkezo {:
1. Csökkenti az a/osztályok számát. A közvetítő egy helyre gyújt egy olyan viselkedést,
al it más {épp több obektum között kellene elosztani. A viselkedés megvá toztatá-
sához így csak a Közvetítő osztályból kell alos7tályokat származtatnunk, a Kolléga
osztályok eredeti formájukban újra11asznosít 1atók.
2. Elválasztja a kollégákat. A közvetítő aza csa olást baz létre {olIégák között. A Kol-
léga és Közvetítő osztá yak egymástól függetlenül variál11até)k és (jra.llasznosthatók.
3. Egysze17Isíti az objektumprotokollokat A közvetítő a sol{-sok kapcsolatokat a köz-
vetítő és ko légái egy-sok :rapcsolataival helyettesíti Az egy-sok kapcsolatok
könnyebben átláthaté)k, illetve könnyeb 1 fenntartdni é bővíteni azokat.
4. Az objektumok együttműködését elvonttá teszi. A közvetítés mint külön foga am
öná ló objektumba zárása lehetőv( teszi, hogy figyelmünket az objektumok együtt-
működésének módjára összpontosíthassuk, é ne kelljen fOhlalkoznunlc egyedi vi-
"
elkedésükkel. Igy a rendszer objekturnainak együttműködése tisztábban át]át 1ató
5 Központosítja a vezérlést. A Közvetítő minta az együtlm,úKödés egyszerűsítéséért a köz-
vet'" ő összetettségéveI fizet Miután a közve ftő tarta mazza a protokollokat, ]-Jonyo ul
tabb lel1et, mint bármelyik {olléga, és nehezen l{ezel11etővé, tömbszerűvé válllat
282 5. fejezet · Viselkedési minták
Megvalósít s
A !(özvetíté5 Dlinta fficgvdlós"'tása során a következ6kre ]{ell l.gyclni:
1. Az eltJo11t Közvetítéf osztály kih,agyása. Ha. a kollégá]{ csak egyetlen közvet/tóvcl áll-
n2.l{ kaj)csc)lat11an, nincs szükség elvo11t Közvetítő osztály létrehozására. A KÖ7vetítő
által11iztosÍtott elvont csat()lás le11elővé teszi a kc)IIégá](nak, 110gy kül()nllÖZŐ Közve-
títő alosztály()kka] m(í].;;ödjenck együtt, és ez lnegfordí va is igaz.
2. Kapcs(Jlattal1ás a [(otléga és KÖZIJetít6 osztáyok között. A kollégáknak ]{apcsola.tba
ke]] IélJnitik közvetllé5jii]{]{el ha. valamilyen számul(ra fontos esemény történik.
A k()zvetítőt m.cgvalósílllaljuk péIdáullnegfigyelc)ként, a Meg 19yelő tervezési minta
alkaJm.3.zásával. A kc)llégák eb}Jcn a.2 esetben Alanya ( (Subjecl), amelyek állapoluk
mcg\7áll()zása](or értesítést küld.enel< a közvetítőnek, az pedig a változás hatásána (
a kollégá.k kÖZ()lti elterjesztésével válaszol.
Egy másik lnegl{özelítés lC]1el, lla a Közvetítő oztályban külön élteSÍtéS felületet 113-
tározunl( meg, melyne]{ segítségével a kollégák (özvetlcnebbü l{om .11unikáltlalnak.
A S111alltalk/V for Wndows a képvise]et egy formáját alkalmazza: a kollégál< a ]<öz-
vetít{5vel való társalgás f()lyanlán saját ma.gukal paraméterként adják át, gy a közvc
títő 3Lonosílllatja a kü dőt. Példak{)dunk is erre 3. megközelítésre épül, a Smalltalk/V
nlegvaJósítást pedig az Ismert fell1asználások részlJe 1 részletesebben is belTIutatju!{.
t.
Pé ako
A Fcladat rész11en bemutatott l)elíítípus-választó párbes7éd.ahlakot egy 1)ár11eszédablal{-
IrányÍlé) segítségé\Jel \ralóítjll]{ Jl1eg. A DialogDirector CPárbcszédablaklrányító) elvont
osztály az irányítól< fe]ületét llatározza meg
class DialogDirector {
public' ;
virtual DialogDirector();
virLul void ShowDialog();
virtual void WidgetChanged(Widget*) - o.
protectcll:
DialngDirector() ;
virtual void CreateWjdgets() - O,
} ;
A Widget (Vezérlő) a grafi]{us vezérl61( elvont alaposztálya, amely ismeri az irányílójál.
el a,ss Widget {
public:
Widget(DialogDircctor*) ;
virtual void Changed{);
Közvetítő 283
vjrtual void HandleMouse(MouseEvenL& event) i
/ / . . .
prlvate:
DialogDirector* _director;
} ;
A Changed (Megváltozoll) az irányító WidgetChanged (VezérlőMegyáltozott) ll1űveletét
hívja meg. A vCLérlé5k e művelet meghívásáva] tájékoztatják az irányítót, hogy valamilyen
.....
esemeny tortent.
void Widget: :Changed () {
_dlrector->WidgetChanged(this) ;
}
A DialogDirector alosztályai a WidgetChanged felülbírálásával irányítják a megfelelő
vezérlőket. A vezérlő átad. egy önmagára rl1ulató hivatkozást argumentumként a Widget-
Changed nűveletne!<t így a7 irány"'tó aZOl10sítllatja a rnc b változott \lezérlőt. A Dia_log-
Director al()sztályol( a CreateWldgets (Létre110zVczérJől<) l11űveJetet tiszlán virtllális-
ként feliÍ]írJál{, íg)l 110Z7ák lélre a vezérlőket a J3.rueszédablal{lJan.
A ListBov, az EntryField és a Button (TjstaMező, 1evtcl.Me7ő, G.omI1) a Widget 21-
osztályai a felhasználói felület elemei s7ámára. A ListBox a hstában kije]öh elem kiolvasá-
sához a GetSelection (5zerezKijelölés) mCveletet bIztosítja, míg az EntryField
SetText (BeállítS7öveg) művelete új szöveget hel}/ez a rne7()l1e+
class ListBox : publjc Widget {
public:
JistBox(DialogDlrector*);
virtual const char* CetSelection() i
virtual void SetList(List<char*>* listItems);
virtual void HandJeMouse(Mousevent& event)i
/ / . . .
} ;
cldss EntryField: public Widget {
public:
EntryField{DialogDirector*) ;
virtual void SetText(const chdr* teKt);
virtual const char* GetText();
virtual void HandleMouse(MouseEvenl& evenL);
I / · · ·
} ;
.....
84 5. fejezet · Viselkedési minták
A Button egyr egys ern vezérlő, ame y a gomb megnyomásakor negl1ívja a Changed
(Mehvá tozott) mííveletet. Ez a HandleMouse (Keze Egér) megvalósításában történik:
class Button: public Widget {
.public:
Button(DjaJogDirector*);
virtual void SetText(const char* text);
virtual void HandleMouse(MouseEvent& event);
/ / . . .
} j
,
void Button::HandleMouse(MouseEvent& event) {
/ I - . .
Changed() ;
}
A párbeszédablak ve7érlői kÖ7ött a FontDialogDirector (Be iItpusPárbeszédablak
Irány/tó) közver'"t, .amely a DialogDlrecLor aloszlálya:
class FontDialogDirector : public DialogDirector {
publ. c:
FontDialogDirector();
virtual FontDialogDirector();
virtual void WidgetChanged(Widget*) -
protected:
virtual void CreateWidgets()i
private:
Button* ok-
- ,
Button* _cancel;
ListBox* fontList.
I
EntryField* _fontNamei
} ;
A FontDialogDirector számon tartja a álla a megjelenített vezérlő{et A Create-
Wldgets felü írásáva létre lozza azo {at és előkészíti a rájuk mutató l1ivatkoLásokat:
void FontDialogDirector: :CreateWidgets () {
ok = new Button(thls) ;
_cane el = new Button(this);
fontList - new ListBox(this);
fontName = new Entryrleld(this);
II a listame6 feltöltése az elérhet 6 betütipus-nevekkel
II a párbeszedablak vezér16inek elkészitése
}
Kazve ó 285
A vezérlők 11e yes együttműködésérő a WidgetChanged (Vezér őMegváltozott) gon-
d.oskod..k:
void FontDialogDlrector::WidgetChanged (
Widget *theChangedWidget
) {
if (theChangedWidget == _fontList) {
fontName->SetText(_fontList->GetSelection()) ;
} else if (theChangedWidget == _ok) {
II a betűlípus megváltoztatása és az ablak bezárása.
I I . .
} else if (theChangedWidget = _canceJ) {
II a párbeszédablak bezárása
}
}
A WldgetChanged bonyolul.sága a párbeszédabla (. összetettségévei egyenesen arányo-
san nő A nagy párbeszédablakok te mészetesen egyé) okokból k ülyólag sem kván3to-
sak, de a közvetítő bonya ultsága 11áttérbe s7orít11atja a ervezés minta elonyeit.
Ism felhaszn I 'sok
Vezérlők között. közvetítől{ént mind az ET++ [WGM88J, mind a TI-IINK C osztálykönyvtára
[Sym93b] Irányító-szerű objektumokat 1asznál a párbeszédablakokban.
A Sma ltalk/V for Windows a kalmazások szerl{ezete is a KÖ7vetítő lnintán a apullLa 941.
Ebben a környezetben a7 alka mazásol{ egy Window CAblal{) objek umból állna]{r am,ely
nablaktáblál{at" (Pane) tartalmaz. A ki)nyvtár szátnos előre elkészített Pane objektumot
(TextPane, ListBox, Button stb.) bocsát rendelkezésre; ezel{ alosztályok létre l()zása nélkül
felhas70álható 7. A progra.mfejlcszt6nek csa?" a ViewManager (Né7etKeze Ő) osztálybó kell
alosztályokat származtatnia; e7 a7 osztály felel a táblák ()ss e 1ango ásáért. Tellát a View-
Manager a közvetítő, a táL11á]{ pedig csak saját né7etkezelőjü {et isme ik, amely az adott táb-
la utu]ajdonosának" számít. A táblák közvetlenül nem llivatkc)znak egYll1ásra. Az alál1bi ob-
jel{tumdiagram egy a kalmazás futásidejű pillanatfelvételét mutatja.
aListBox
tulajdenos .
aTextPane
aViewManager
textPane
listBox.
buUon
tulajdcnc8
aButton
tulajdanDE
8 5. jezet Vis Ikedési minták
A p, ne és ViewManager objektumok közötti kapcso attartáshoz a Smal1talk/V ese lényeket
haznál A táblák eseményt váJtanak ki, 1 a információt a {arna.;: nyerni a kÖ7Ve(tőtől, vagy
Tözölni kívánják vc e, hogy valami fo ltos dolog történL Az események egy szimbólumm-l
(pl. tselect) azonos-:tják a7 eeményL Az ese nLny kezeléséhez a nézetke7elő bejegye- -
tel egy metódusválas tót a táblával; ez a váldS tó esz a esemény kezelője, és meghívásá -a
11linden e<;etben sor kerül, 113- vdlam.ilYLn eernény lörtél1i (
Az al(bbi kádrész et azt mUL.llja be, hogyan jön lé re egy L'sane objek um egy View-
Manag->r alosztályon belül, és a nézetke7e]ő lagyn jegvezet' be a #select esenény ese-
ménykezelőjé:
self addSubPane: (LjstPane new
paneName: -myListPane T .
owner: self;
when: #select perform: # istSelect:) .
A KözvetítéS minta egy nási { a kalmazása a- összetet - frissítesek lebonyolítása Erre a Meg-
fgyel6 - 'nt.ánál belllu atoll Vá]tozasKeze ő (ChangeManager) osztá y ad 1eldát. A Válto-
ásKezelő alanyok és 1 egtlgyelők között kÖ7vetít, hogy el rerüllessük a elesleges több-
szöri -rissítést, Am.ikor egy objektlilll megválto ik, értesíti a Vá tozásKezelőt, amely az ob-
JektumLól függő lnás objektUlnok értesítésL ve] összehangolp a rissí ést.
Eh 1ez hason]ó alkalma st lathatunk a Unidraw gra lkai ke etrends erben [VL90], ahol
a CSolver neVŰ oS7lály az úgynevezet ,tkonnektorok'J kö7ötti ka csolati kötése :Tet l{ezeli.
A grafikus szerkesztők objek li nai különböző mÓdokon össze rapcso va je enhetnek meg.
A kanne rtorok (öss ekötők) d70kban a programo ,ban lehetnek hasznosak, amelyekben
a kapcsola o. fenntartása automliklis (ilyenek pé]dául a diagrams e kesztők vagy az
áramkörtervezó rendszerek), A CSolver a kon lekto'o - közötti kö vetító, ame ynek felada-
ta a kapcso ati kCJlések feloldása. és a ()nnektorok helyének frissítése a ötések vá tozásá-
nak megfele ően.
apcs
mint k
Hom]o {zat: A Homlokzat tervezé' rninta anny.ban különbÖ7ik a Közve í őtól, hOh'Yobjek-
tuma { elvont alrends7ere révén kényelmesebb felületet bi7tos-:t. Prolokollja egyirányú, va-
gyb a Ho nlokzat objektumok intézhetnek kérelrneket az alrendszer osztá yaihoz, de ez
vissz felé nem lnűködik. A Kö venő minta e 7e szemben olyan együttműködési ehetősL-
geket biztos-:t, amiket a kolléga objektumo { neln képesek biz 'Osítani, a protokal pedig
többirányú.
Megfigyelé: A kollégák a közvetítővel a Megfigyelő minta segítségéve! tarthatnak fenn
kapcsolalot
Emlékeztetó 287
I
-ti
Viselkedési objcl(lUmminta
Cél
Az egységbe zárás (bLlokozás, enkapszuládó) tnegsértése nélkül rögzítcni és felfedni egy
objektum. belső állapotát, l0gy az később ebbe az állapotba visszaállíthatÓ legyen
Egyeb nevek
Memento) I)illanatfelvélel, Tol{en
Flt
Időnként s7ükséges lehet egy objektum be]ső állapotának rög7tése. Ez külÖnösen akkor
fontos, amikor ellenőrző pontokat vagy mLíve1et-visszavonási lehetősége {ct valÓsÍtunk
meg, melyek seg''tségével a felhasználÓ "kihátrálhat" egyes műveletekből, vagy a program
lib.l utá li helyreállítást végezhet. Ah laZ, hogy objektumokat eg} korábbi állapotba állít-
hassunk visS7a, valahová álla 1otinformációkat {cll mentenÜnk. Az objektumok azonban
általál1an el +ejtik állapotukat; más obje {turnak nem férllelnek 110zzá lellát a külső nle11tés
sem lehetséges. Ezen állapot fe fedése az egységbe zárás megsértése lenne, aminek a prog
ram Ineg11Jzl1atósága és bővítl1ctősége látná l\..árát.
Vegyünk példaképpen egy grafikus szerkesztőt, amely támogAtja az objektull1ok össze-
kapcsolását. A felhasználó összeköt let két téglalapot egy vonallal, és a téglalapok összc-
kötve maradnak akkor is, ha a felhasználó valamelyiküket dmonHtja. A sLerkesztő gondos-
kod.ik róla., 110gy a ]<apcso at fenntaJ1ásállOZ a vona.! megnYÚJjon.
,.
::.
\.:::::\::i:::.:
'j:;'.:\\.Íii.'::;:=:\
....,
.I'-
L
Az objektumok kÖzötti kapcsolÓdások fenntartásának egy jól ismert módja ct megs7orítás-
felo dó rends7erek hasLnálata. Ezt a slolgáltatást egy Megsza 'ításFeloldó (ConstraintSolver)
objektumlla zár11atjuk, amely rög7ítj a létrLllo7ott l(apcsolatokat, és 17()kat ]círó mateJ1l3.
tikai egyenleteket állít elő Amikor a felhasználó létrehoz egy kapcsolatot vabry más .nóu.on
288 5. fejezet · Vjserk dési minták
megváltoz 'alja a diagramat, elZ objektum eZeket az egyenleteke old'a meg (salve), majd
7.ámításainak L -eményét felhasználva újrarendezi a grafi .;:us elemeket, hogya kapcsola-
tok megfeleléSen mebma . adjanak.
Egy ilyen típusú xogramban a múvelet-visszavonás támogatása egyáltalán nLm olyan
könnyű, mint amilyennek tűni {. Egy l110zgató művelet visszavonására kézenfekvőne {
Játszhat a meglett távolság tárolása, és ugyana 7 kora távolság megtéte e visszafelé, ez azon-
ban nem garantálja, hogy minden objektum ugyanott fog megjelenni, ahol eredetileg volt.
Ha a kapcsolatról nem gondoskodunk .negfelelően, a téglalap egyszeru visszafele mozga-
tása az erede i helyére nem fe tétlenü 'ár a 7ívánt eredménnyel.
I
.
&..
.L
.\':.:.t.:l'
{I..:\::.,\,\\:,::
.'..:.,\'.:.::;.'
..,
\..
I
...
::.
.::
..: ...o..
.". ."".
A MegszorításFeloldó nyi vános felülete általában nem e égséges a ponto.':. visszavonáshoz.
A visszavonó műve eteknek szorosa ban kell együt működniük a MegszorításFeloldóval
a korábbi állapot viss aá !ításához, de az objektum belső szerkezetét nem szabad felfed-
nünk előttük
A problémát az Emlékeztető tervezési mintával oldhatjuk meg. Az emlékeztető olyan objek-
tun, ame y egy más' { objektum, a kezdemenyező (originator) belső állapotáról készít piHa-
natfe]vételL A visszavonó művelet '. kezdeményező ől emlékeztetőt ker, amikor ellenőriz-
nie kell annak állapotát. Az e lléke71ető ke deti értéke az ak 'uárs á lapotot jellemző infor-
D1áció lesz. A emlékeztetóoen csak a kezdeményező tárolhat, illetve csak ő nyerhet ki on-
nan információt) más objeklu.mok számá a az emlékeztető "átlátszatlan'.
A grafikus szerkesztő imént tárgyalt példájában a MegszorításFeloldó a kezdeményező.
A visszavonás folyamata az események követ]{ező láncola ából áll:
1, A s7erkeszlő mozgató művele "me ékhatásaként" emlékeztetőt kér a Megszorítás-
Fe .oldótól.
2. A Megs7orításFeloldó létrel10zza és á radja az eJ 'é {eztető , ami ebben az esetl)en
,
a FeloldóAllapot (SolverState) osztá y példánya. A FeloldóAl apot emJékeztetÓ olyan
adats7e kezete ret tartal - az, amelyek leírják a Megszor"tásFeloldó belső egyenlete'-
ne]{ és változóinak jelenlegi állapotál
3. Később, amikor a felhasználó visszavonja a mozható műveletet, a sze-kLsztő vissza-
adja a Felo dóÁllapotot a MegszortásFeloldó objektumnak.
mlékeztet 289
4 A FeloldóAllapotban tárolt adatok alapján a MegszorításFeloldó megváltoztatja első
szerke" eteit, 110gy az egyenleteket és változókat pontosan visszaállíthassa korábbi
allapotukba.
A ent lépések ehetővé teszik a Megs" orításFeloldó számára, hogy más objektumokra bíz
za a korábbi állapot visszaállításá110z szükséges információkat, anélkül, 110gy belső szerke-
zetét felfedné elő tük.
A Im h os g
Az Em él{e teta min á az alábbi esetekben célszerű alkalmazni:
Egy objek um (vagy objek umrész) állapotáról pillanatfelvétel kell készíteni hogy
később ebbe az álla )otba visszaállítllató legyen, és
. a dllapotot közvetlenül lekérdező felület fel -'edné a ll1egvalósítls reszleteit, és ll1eg-
sértené a objektum egységbe árását.
S ezet
Kezd ménye
1-
BeállrtEmlékeztet6(Emlékeztet6 m) 9
Létreho mlékeztet6U )' .
I
állapot I
. I
I I
I I
Emlékeztet6
em ékeztet6
Intéz6
----..... .........
SzarezÁllapo O
Beál[[tÁJlapo O
áUapot
.
t
retum new Emlékeztet (állapot)
állapot = m-> SzerezÁllapotO
Res v"'k
· Emlékeztető (FeloldóAllapot)
- A Kezdeményező (Originator) obektum belső állapotát tárolja. Csak annyi infor-
mációt aktáro el, amennyit szükséges.
- Megakadá yozza, hogy a kezdeményezőn kívül más objek UIllOk is hozzáférl1esse-
ne { az adatokhoz Az emléke7tetőknek két fe ületük van. Az Intéző (Caretaker)
csak egy keskeny felületet lát, ezért mást nem tehet, csak továbbadhatja az emlé-
keztetőt más objektumoknak, a Ke deményező ez el s" emben széles felületet] így
minden adathoz hozzáférl1et, amire szüksege van korábbi állapotának v.sszaált'tá-
sáho deális esetben csak dZ emlékezte őt készí ő kezdeményező számára enge
délyeze t, 110gy az emlékeztelő )elő állapotá110z hozza. ;érjen
290 5. ejezet Viselkedési minták
· Kezdeményező (MegszorításFeloldó)
- r:: nlékeztetőt {észít, ami az aktuális belső állapotának pi! anatfelvételét t.1rtalmaz7a.
A7 emlékezteté5 segítségéve! visszaállítja korábbi belső álapotát.
· Intéző (visszav()nó rendszer)
- Az e 11lékezteté5 b '_ztonságáért felel.
- Az elnlékeLtető tartaimát soha nem vizsgálja, azon múveleteket nem vége7.
gyüttmúko és
· A7 intéző emlékeztetőt <:ér a kezden1ényezőtől, tárolja egy ideig, 11ajcl visszaadja an-
nak, amint azt a követke7ő együttműködési djagram is ábrá7oljd:
e Intéző
egyKezdeményezo
egyEmlékeztető
new Emlékeztető
I
t
LétrehozEmfékeztető()
--- ....---..........---............---.........-=
Beáll£tAnapot( )
BeállftEmlé ..eztetó(egyEmlékeztet6)
SzerezÁflapot( )
Az intéző abban az esetben nem adja vissza a7 emlékeztetőt a {ezdel'nényezőnek, ha
annak nincs szüksége rá a ko ábbi ál apOL viss aá !ításához.
Az emlékeztetők passzívak, állapotukat csak az őket létrehozó kezdeményező kér-
(lez 1eti le vagy válto7tatl1atja me!:,.
Követk m yek
Az Emlékeztető mi l.ta előnyei és hátránya' a következők:
1. Megőrzi az egységbe zárás határai!. Az Emlékeztető minta segítségével e kerülhet-
jük azon információk felfedését, amelyeket csak a <:ezde nényezőnek szabad 'smer-
me, de a tárolás ettől függetlenül az objek umon kívül történik. A minta eIszigeteli
a ke7deményező esetleg bonyolult belső s7erke7etét a többi objektumtóI, így rneg-
őrzi az egyégbe zárás 1atá ait.
m ékezteto 29
r
2. Egyszeríibbé teszi a kezdeményezó objektur lot. Az egységbe zárás megőrző más
serkezetekben a kezdeményező számon tartja az ügyfelek ál al kért belső állapoto '""
változatait, ami a táro]ás kezelésének minden terl ét a ke defi1ényező vá lá a 11elyezi.
A 110gy az ügyfelek maguk kezelik a kért állapotot, egyzerűbbé teszi a kezdelllé-
lye7éS felépltésé , és azt is szükségtelenné teszi, 110gy az ügyfeleknek értesíteniük
kelljen a kezd.eményezőt, ha lunkájukkal végeztek.
3. Az emlekeztetők használata költséges lehet. Az em ékeztetők jelentős több etterhet
róh.atnak d programra, ha a kezdcményezőne { nagy mennyiségű adatot kell az em
ekeztetőbe maso n+a, vagy 1a a7 übyfelek gyal{ran :rér ek, · lelve adnak viSS7a em-
léke7let(5kcl. A tef'\Tezés. n.nta alkalmazása csak akkor (r+ meg, ha a Ke dem[nyező
egységbe zárása és V sszaállitásd "olcsó)'. (Lásd ég a fokozatosságról / rottakat
a Megvalosítás részben.)
4 A keskeny és széles.felületek meghatározása 1lem 111indig könnyu. Egyes nyelvekben
nel1éz bi tos/tanl, hogy az emléJeztető állapotahoz csa {a {ezdeménye __ő fér 1essen
hozzá.
5. Az e11zlékeztetók kezelésének rejtett költségei vannak. Az Intéző felel az emlékeztetők
tör éséért, csakIlogy arról nár nincs foga l11a, mennyi adat tárolódik az eOlléke eta
ben, így az egyébkénl egyszeru +n éz6 a emlékeztető ( tárolásd110z jelentős tárhe-
lyet eméS7l1et fel
M l' sí s
Az Emlé]{e tető minta megvalósí .ása során többe]{ kö7ört ké do ogra kell figyelnünk:
1. Nyelvi tálnogatás. Az emlékeztetők ké felületle rendelkeznek: egy s7élesse a l{ez-
deményező, és egy kesJennyel a tö bi ob.ektu.m szá lára. Id.eális esetben a megvd-
lósílára 11asznált nyelv a st,.tikus véde em két szintjét támogatja. A C++ éldáu az-
zal, 110gy a kezdeményezőt az e 11ékeztetó barátjává, a7 em ékeztet6 széles felületé
pedig priváttá te letjük Csak a keskeny fe ülelet kell nyilvánoskénl meghatároz-
nun :r Lássun { egy példát:
class State;
class Originator {
publlc:
Memento* CreateMemento()i
void SelMemento(const Memento*);
/ / . - -
private:
State* _state; /1 belsó adatszerkezetek
/ / . - -
} ;
class Memento {
public:
II keskeny nYllvanos felület
51 fejez t · Viselkedési mintak
virtual Memento();
private:
II csak a Kezdeményezo számára elérhető privat tagok
friend class Originator;
Memento() ;
void SetState(State*)i
State* GetState(};
/ / . .
private:
State* state,
/ I . . .
} ;
2. A változások fokoza os tárolása, Ha az emlékezte ő{ létrehozdsa és visszaadása
a ke demenyezőnek előre látható módon zajlik, legtehet'ük, hogya eml keztető-
ben csak az e 'edeti állapothoz képes' beállt változásokat rögzít'ük.
Egy elő menyl'stábdll találhato visszavon la o parancsok pelddul emlékeztetők se-
gítsegével biztosIthatják, hogy visszavonáskor pon osan helyreálljon a korábbi ál a-
pot (asd a Parancs tervezesi m'ntá ), Az előzménylista eghatarozza, milyen sor
rendben lehet a Pdrancsokat viss avonn' és ujbó] végrehajtani, így az emlékeztetők-
nek elég csak a parancsok által előidéze . változasokat tárolni, a érintett objektu
mok teljes .1l1apo'át nem szükséges, A Felada' részben feljebb bemuta ott példaban
a Megszor'tásFeloldó csak azokat a belső szerkezeteket tároJja, amelyek egvaltoz
nak, hogy a glalapo <at összekötő vonala at megtartsá 'T, nem edig az objektumok
abszolút helyze et.
ld ' d
Az 'tt szerepio c++ kod a {orabban lárgyalt Megszor'tasFelo]dó (ConstraintSolver) )Cldá-
hoz tartozik. A grafikus o 'ek tum ok egyik helyró a ma sik ra mO" ga tás ára, "Hetve ezen mú
ve et visszavonásara MoveCommand (Mo7gatPa an cs) obje \::tumokat használun {(lásd a Pa-
rancs tervezési ro'nta). A grafikus eJemek mozgatásához a szerkesztő a parancs Execute
(Végreha't) múveleté hlvja ,eg, a visszavonáshoz ped'g az Unexecute o (Visszavon).
A parancs tárolja a cé ob'ektumot, a megtett távolsago , és a ConstraintSol ve Memento
(Megszor'tásFe oldóEmlekeztetó) nevű emJekezlető egy peldányát, amely a megs orítas-
feloldó állapo at rög7Íti.
class Graphicj
II a szerkesztő grafikus objektumainak alaposztalya
class MoveCommand {
public:
MoveCommand{Graphic* target const Point& delta) ·
void Execute();
void Unexecute();
private:
Emlékezt to 293
ConstraintSolverMemento* state;
Point _delta;
Graphic* _target;
} i
A kapcsolatokat a ConstraintSolver osztály hozza létre. Kulcsfüggvénye a Sülve (Fel-
o d), amely az AddConstraint (HozzáadKöl(s) művelettel bejegyzett kapcsolatoka oldja
fe. A v.sszavonás támogatásá110z a ConstraintSolver állapota a CreateMemento
(LélrehozE nlékeztető) művelettel tehe "O "küls6vé", amely az állapotot egy Constraint-
SolverMementa példányba helyezi. A megszorításfelo dó a SetMemento (Beá lílEmlé-
keztető) hívásával á Iítható v.ssza korábbi á la potába A Cons t ra int Sol ve r Egyke.
class ConstraintSolver {
public:
static ConstraintSolver* Instance();
void Solve();
void AddConstraint(
Graphic* startConnection l Graphic* endConnection
) ;
void RemoveConstraint(
Graphic* startConnection, Graphic* endConnection
) j
ConstraintSolverMemento* CreateMemento{);
void SetMemento(ConstraintSolverMemento*) ;
private:
II nem triviális állapot és műveletek
/1 a kapcsolat létrehozásához
} ;
class ConstraintSolverMemento {
public:
virtual ConstraintSolverMemento();
private:
friend class ConstraintSolver;
ConstraintSolverMemento() ;
II privat megszorításfeloldo-állapot
} j
A fenti felülelekkel a követke ő módon valós/that juk meg a MoveCormnand Execu te és
Unexecute tagja.t:
void MoveCommand::Execute () {
ConstraintSolver* solver = ConstraintSolver: : Instance () ,
_state = solver->CreateMemento()i II emlékeztető létrehozása.
target->Move(_delta);
solver->Solve() ;
}
94 5 fejezet Viselkedési minták
void MoveCommand: :Unexecute () {
ConstraintSolver* solver = ConstralntSolver::lnstance()1
_target->Move{-_delta);
solver->SetMemento(_state); /1 az állapot visszaállítása
solver->Solve() ;
}
Az EvecuLe a grafka mozgatása előtt kér eh.7 ConstraintSol verMemento emlékezte-
tőt; aZ Unexecute vissza lelyezi a gafikát, viss7aállítja a megszo +ításfe'oldÓ korábbi álla-
potát, végül pedig arra utasítja dzt, hogy számítsa ki a kapcsolatot.
Ism rt Ih s na ások
Az előző példa cód a Unid aw kapcsolatoka' támogató CSolver osztályán lVL90] alapult.
A Dybn [App92] f,'YŰjtcményei egy olyan bejáró felületet biztosítanak, ami szintén az Emlé-
ke7tető mi 1tára épül. E gyű'temények ismer' { az "állapotobjektum" fogalmát, ami egy
o yan emlékeztető, amely a be'árás állapotát je öli. A gyű'temények a bejárás állapotána {
ábrázolására bármilyen módszert választhatnak, az ügyfelek elől az tökéletesen rejtve ma-
rad. A Dy an bejárái megkö7elítése C++ nyelven valahogy így festene:
template<class Item>
class Collection {
public:
Collection();
IterationState* CreatelnitialState();
void Next (IterationState*) j
bool IsDone(const IterationState*) const;
Item CurrentItem(const IterationState*} const;
IterationState* Copy(const IterationState*) consl;
void Append(const Item&);
void Remove(const Item&);
I / . A
} i
...
A CreateInitialSlate (LétrehozKc.zdetiAllapot) eb'Y kezdőértékkel ellátott Itera-
tionState (BejárásÁlIapot) objektumot ad viSS7a a gyűjteménynek. A Next (KÖvetkező)
az ál apotobJektumot a bejárás következő poz ciójára állt ja, ezzel növelve .. bejárási inde
xet. Az IsDone (Kés7) értéke true lesz, ha a Next túllépett a gyűjtemény utolsó elem(n.
A Currentltem (A \tu ális elem) követi az ál apotobje{tum hivakozását J és a gyűjtemény
hivatlcO" ott elemét adja vissza, a Copy (Másol) pedig az adott állapotobjektulll másolatát.
Ezzel a bejárás egy adott pontját je Ö letjü.c meg.
ITa adott egy ItemType (ElemTípus) neVŰ os7tály, példányainak gyűjteményét a kövel-
l<ező módon járllatju.\: be:
mlé ,eztető 295
class TtemType {
public:
void process();
/ / . . .
} ;
Collection<ItemType*> aCollection;
IterationState* state;
state = aCollectjon.CreatelnltlalSlate();
while (!aCollection.IsDone(state)) {
aCollection.Currentltem(state)->Process() ;
aCollection.Next{state) ·
}
delete state;7
Az emlé]{eztető alapú bejárási felütelnek két ércjekes előnye van:
1. Egy gyűjtemény11ez egynél több állapot is tartozl13t. (Uf,J]'anez igaz d Bejáró mintára is.)
2. A bcjá ás tálllogatásá.hoz nincs szükség a gyűjtelnény egységbe 7árásánalc rnegsérté-
sérer Az emlékeztetőt csa.k maga a byűjtemény értelmeLi, más nem "ér11et 110zzá.
A bejárás más lnegl{özelítésein.él előfo _duIllat, ]10gy az egységbe 7árást fell{ell tör-
nünk, például11a a bejáró osztályol{at gyűjteményosztályaik ba ">átjává kel tennünl{
(lásd a Bejáró n1intát) Az emléke7tető alapú megvalósításban ennek éppen a ford.Í-
totlja a llelyzet: a Collection (Gyűjtemény) az IteratorState barátja.
A QOCA l11egszorításfeloldó e emkészlet az e nlé (eztetőkben csak d. külöbségeJet tá alja
r -Il Il\1V92]. Itt az ügyfelek eh7 emlékeztetőt kapnak, Gtmelya kötések egy bizonyos rend-
szerére aclott aktuális megoldás je elllzőit tart3.lmazza Az elnlékeztető csa ( azokat a válto-
zókat tárc)l.ja, amelyek a7 utc)ls() megoldás óta megváltoztak, ami általában csak a változók
egy (is részh.a.lmaza E rész]1alma7 elegendő a]11107, ]lOgy a feloldó viss7atérhessen a meg-
elt)ző n1eg() dásll()7. A QOCA az előzményekre támaszkodik; a ko "ábbi megoldások a köz
benső m.egoldások 1elyreáll"'tott emléke7Let(5ibé51 állítllalók viss7a, Íh'Y az emléke7tet(5k sor-
rendje nem módosÍt11ató.
Kapcsolodo m "nt k
Parancs: A parancs()k emléke7tetéjket alkalmazhatnak a visszJ.vonllató műveletek állapotá-
nak rögzítésére.
Bejáró Az emlékeztetől, a korál11)an.leírt módon bejárás támogatására is h.aszndlhalók
7 Mcgfigyclhctjük, 110gy a példáhan az állapotol)jel{tun10t a bejárás végén töröljül{. A delele (töröl) azonban
nem 11í'/ódik meg 11a a ProcessItcm (FeldolgozElem) kivélelt váll ki, így zenlél keletl{ezik. Ez a C++-szal
szemhel1 a sL:emétgyűjtéssel rendelkc ő Dylan-l)cn nC01 01(07 gondol. A problémlra a Bejáró lnintánl1látllat-
tunk egy tnegoldist.
296 5 fejezet · Viselkedési minták
M -fi ·
Viselked ési obj ektumminta
Cél
o jektumok között egy-so {: függőségi kapcsolatot létrehozni, így amikor az egyik objektum
á apola megváltozik, mind.en tőle 1igg6 objektum értesül erről és automatikusan frissül.
Egy'b nevek
Observer, Figyelo, Dependenl (Függőségek), Publ.sh-Subscribe (Közzététel-Előfizetés)
el t
Gyakori probléma, hogy amikor egy rendszert együttműködő osztályokra bontunk, gon-
doskodnunk ke 1 a kapcso atban ál ó objektumok követke etességének fenntar ásáról is.
Ezt többny're nem szoros csatolással szeretnénk elérni, hiszen ez csökkentené az osztályok
újrahaszn osítI1at()ságá t.
Számos, grafikus felhasználó' felületekhez <észített elemkészlet példáu különválaszt ja
a megjelenítés a mögötte megbuvó a kalmazásadatoktól [KP88, LVC89, P+88, WGM88], gy
az eket őt eghatározó osztályok egymástól függetlenü újrahasznosítha 'ók, bár természe
tesen együtt 's működhetnek. Különböző megjelenítési módszereket használva ugyanab-
ban az alkalmazási adatobjektumban egy tábláza objektum és egy oszlopd'agram objek-
tum is egjeleníthet információt. A táblázat és az oszlopdiagram nem tudnak egymásról
(bár úgy viselkednek, mintha tudnának)1 így elég csak a <;zámunkra szükséges objektum új-
rahasznosítása, Amikor a fe használó módosít egy adatot a táblázatban, az os opdiagr.lm
azonnal tükrözi a változtatásokat, és ugyanez igaz megfordítva is.
megfigyel6k
... .......... . .......... ..... .......,....,.........- -.. ................. ........'i..,..,..... ","". . ......... \..
. ...:., ..-..-. .- ":,' . . ...... ........ : .. q lj.'
i .: '.: :.:.: :==- ""'f....._..,..':.._-:.. ::' .:: o;-;... r
r............L.. . .1".- . ..... .................... 1.'(1 ...".......,:.........
,
......,.p. ........................... ...............:.-........,1..'1.......,...,....,......, IU.......... ............... II..... 1. ...
. 'I . K " ", ........ - . .. .' 1. :.
'r ,:o:: . . ...,:.:;-..., - L ,-. .7'. ......
lj' ",-: .- - -- - - - - . .
...... . .......;" ...... ...... IJ.' . ....of(LV"i'''' }"........ Q.: .
"tI - ...... .......... ..........-1....,11.11-1.........1-..-1...1-.... ru .. .... .1. ......1 ......"1 ...........
J ""'.: .. t ':" .... ..,.. '';1,. .-'-. m . :
) . .;o "L..__... .-- .",,,,;':1. , .
. ....... "":...I II .1 ..::::u..........,........................rt..IIiI......I/..... .....i. :......:-.=.:. .
............ L-I---I. I .
a b c
x 60 30 10
'.' 50 30 20
z 80 O 10
\
í ':'
.. "W
:i' , '., 'L_
. ' . . \.\\ ..'
. "... m . \!tI:'í
..L\' . L'I'1. . . J.'
.. .. . "
. . .,
a c
b
a
"ff
", .
{".
,.
,
"
,
,
"-
"
"'
"
"
/"
/
,/
,/
./
./
.. vál zási rtes tés
---
ké Imek, módosftások
a any
Megfigy ló 29
Ez a vise kedés maga után vonja, 110gy a 'áblázat és az oszlopdiagram az adatobjektumtó]
függ, így az annak állapotában bekövetkező bármilyen változás ezek értesítését igényli.
A függ6 ol)jektumok szán1át persze nem SZÜkSLhes kettőre korlátozni; ugyanazt az adatot
korlátlan számú felhasználói felületi elemme megjeleruthet+ük
A Megfigye ő minta azt írja le, 110gyan alakítllatjuk ki ezeket a kapcsolatokat. A minta kulcs-
ob.ektumai az alany (subject) és a megfigyelő (obselVer) Az alanynak bármennyi, tőle függő
megfigye éje ehet, a 1elyek az alany ál apotában beálló minden változásról értesülnek. Ez-
után a megfigyelők kérelmet intéznek J.Z a anyhoz, hogy összehangolhassák állapotu :rat az
alanyévdl.
Ezt a fa.'ta együttműködést (özzététel-előfizetés néven is ismerik Az alany az értesítések
"közzétevője" , amely az értesí éseket anélkül kü dheti e , hogy tudná, kik a ll1egfigyelői,
a megfigye ok amelyekből bármennyi el1et pedig "előfi7ethetn.ek n ezen értesítésekre.
lk Im
a os
A Megfigyelő telvezési mintát a következő helyzetekben célszerű a)kalm.azni:
· Egy foga .omhoz két ábrázolás ka csalódik, és egyi a másik ó függ. Lzen ábrázolá-
sok külön objektumba zárása lehetővL. tes7i, 110gy egymástól függet enül módosít-
hassuk vagy újral1asznosíthassuk eSket.
Egy adott objektum módosítása más objektumok módos/tását igényli és nem tudjuk,
hány obje {tuma kell megválto7talnunk.
· Egy adott obektumnak képesnek kell lennie arra, 110gy ané }{ül értesítsen más ob-
jektumokat, hogy feltételezésekkel élne azok kilétéről. Más szavakkal, az emltett
objektumok között nem szeretnénk szoros csata ás létrehozni.
Sze ezet
lany
Csatol (Megfigyelő]
Leválaszt(MogfigyeI6)
rtosftO o - - - - -
meg6gyt! ftk
M gfigyel
for al[ o in megfigyel6k {
0-> Frissrt(]
}
Frissft(}
Konkr tMegfigye 6
K nkrétA any
alany
F rissftO
megfigyel6Á1lapot
0- - -
megftgyel6ÁI1apot =
alany- > SZBrezÁllapot()
SzerezÁUapot() O - - -
Beál I ftÁJ I apot()
retum a1anyÁllapot
al a nyÁl I apot
298 5. fejezet Vjselkedési minták
R sztv vők
· Arany
- Isme 1 a megfigyelőit. A2. Alanyt (Subject) korlátlan szá.1 Ú Megf'gyelő (Observer)
objektun1 figyellleli meg.
- Felületet biztosít a Megfgyelő objektumok csatolására és leválasztásárd
· Megfigyelő
FnssÍté5 felületcl határo? 11eg az alanyban bekövetkező válto7ásokról értesÍtendő
obje]<tumo]( s7ámára
KonkrétArany
- A KonkrétMegfgyelé5 (ConcreteObserver) objektumok számára érdekes állapotot
tárolja.
- Értes'tést küld megfigyelőine (, ha állapota megvá .tozik.
Kon krétMegfi gye ló
- Hivatkozást tart fenn egy Kan ___rétAlny (Concreteubject) objektumra.
- Tárolja azt az állapotot, amelynek összhangban kell maradn'a az alany állapotáva.
Mcgvalósílja a megfigyelőt frissÍtő felületet, így állapotát összehangolhatja a7
a 311yéval.
.. muködes
· A KonkréLAlany értesíti lllegfigyelőit, ha olyan vállozás történik, amelynek eredmé-
nyeképpen azok állapota eltérne a sajátjától,
· Miután értesült a konk ét ..Janyban bekövetkezett válto7ásról, a KonkrÜMegfigyelé5
infor .11ációt kérhet a7 alanytói, majd ezen infOlmáció segítségével öss7e .1angallatja
állapotát az a anyéval.
Az alábbi együtt.l űködési diagram ch'Y aldny és két megfigyelő együtlműködését il-
l usztr.lja:
egyKon ...rétAlany
egyKonkrétMegfigyeló
másI onkrétM e gfi gye ló
BeállftÁUa p ot()
rtestO
Frissft( )
SzerezÁUapot()
Fri ss tO
S2erezÁlJapot{)
Megfigyelo 299
MegfigYLlhetjük, 110gyan 11alasztja Ll a módosítást kezdeménye7ő Megfigye16 objektlll11 sa-
ját frissítését, amíg értesítést nem kap az alany tóI. Az Ertest (Notify) múve ctct nem mind+g
az allny 11vja meg; meglf'v latja egy megfigyelő vagy eh'Y teljesen más tfPUSlI objel<lulll is.
A Mehtyalósítás rés7ben erre is megné7ünk néjlány ]e11etőséget
övetke
,
ny
A Megfigyelő lninta lellct6vé lesz + , 110 bY az alanyokat és megfigye ó1<et egyt11ástó] függetJenül
módosítsuk Az alanyok megfigyelőik fell1aszná]ása néll<ül is ú. allasznosíthatól{, és viSLont.
""
Igy az alany vagy más mcgfigyc16k fficb>változtatása nélkül 110zhatunk létre új megfigyelől{et.
A Megfigyelő minta előnyei és llátránya + többek közölt a követke7ől<:
1. Elvont csatatás az alany és a megfigJJeló között. Az alany csupán annyit tud, 110gy
megfigyelcJi vannak, amelyek mindegyike lnegfele az elvont Megfibyelő osztály
egyszeru felületénel{t konkrét osztályukat e b YJ1 dlán nem iSD1eri. Így az alanyol{ és
fficgfigyclők csaloláa laza és elvont
Miután az Alany és a Megfigyelő nem szoros csatolással rendelke7ik, a rend.s7er más-
más elvont fogalmi s.lintjéllez tarto7]1atnak. Al alsóbb szintű a any társalogllat a ma-
gasal)l) sz.ntű 11legfigyelővel, így a rendsze" retegezetlsége 6rinletlen Inarad. lIa a7
alany Cs a megflgyelő összekapcsolód.na, a7 előálló objektulnnak vagy {ét réteget
l<ell.en_e átfogJlja (amivel megsértené a étegezettséget), vagy válasLlania kellene,
melyik rétegben kíván "élni" (atni a fogalmi rétege!\:et tenné tönk e).
2. Az üzenetszórás tátn.ogatása A szol{Ványos (érellnektől elté "ően az alany által kiklll-
dött értesítésnel{ nem kell meg11atároznia fogadóját. Az értesítés auton1atil{usa 1, üze-
netsz()rással (broadcdst) jut el minden érd.ekelt előfizető objel{tumllOZ. Ezel< száma az
aJan.y szám.ára é . dektelen; az ő feladata. csup[ n annyi, hogy értesítse megfig1lelőit. Így
bármikor új megfih'Yel(5kel adJlatunk a rendsze .11ez J vagy velletünk el onnan; az érte-
sítések kezelése vagy 19yellnen l{íVÜl hagyása a meg 19yel(5k felel(5ssége.
3. Váratlan frissítések. Miután a me'gfih'Yelc)k nem tudnak egyJTI3.s jele 11étéről, az alany
mód,osításán.a]{ végső költségéről sincs fogalmuk. Egy látszólag je enté]{lelen ill.lfvelet
az alanyon frissítések láncolatát indítllatja el a megfih7elő]{ és az azoktó] függő objek-
tumok {Ö7ött EJTI.ellett a ne .11 pontosan. meghatározot vagy fennlartott függé5ségi fel-
tételek Z3.V3.fOS rissítésckllez vczelI-letnek, an1e yek oka nehe7en felde ít]1ető+
A gondoL súlyoslJítja az a lény, 110gy egy egyszerű rissítés protokoll nem árul el
részletel{et a.r ó , mi változott meg az alanyban, íb'Y 11a más prolokol o]{ n.eJll segítil{
a mcöfigyelőket, a vált()zás()k ()kának felderítése kenlény dió le11et SZ21TIukra..
1
,
300 5. fejezet · Viselkedési mintak
-
M V ásíts
Ebben a részben számos, a függőségi rends er megvalósltá<;ával kapcsolatos ké déssel fog-
lalkozunk:
· Az alanyok hozzáre 1delése a megfigyelokhöz. Az alanyok legegyszerubben úgy kö-
vetllet'lc nyomon az értesí "endő megfigye őket, 1a kifejezett 11ivatkozdsokat tárolnak
-ájuk. Ez azonban túl kö tséges lehet, ha sok ala yunk,de kevés megfigyelőnk van.
Mego dást jelenthet, ] a a kbebb tárhe yért idővel tlzetünk, és valam' yen társításos
(ass ociatív) keresést, )éldául egy hasÍló- vagy lcvol attáblát (hash) alkalmazunl{ az
a anyok és megfigyelől{ egymáshoz rendelésére, így a megfgyelőve nem rende .ke
ő alanyok ne 1 jelen enek társzüksCglet-többletet Másfe ő azonban e a megkö e-
lítés növeli a lnegfigyelők elérésén.ek l<ö tsCgét
2. Egynél több alany megfigyelése. Egyes le yzetekben célszerű lehe, ha a megfigyelő
egynél több alanytói függ, pé dául ha egy táblá7at több adatforrásh07 kapcsolódik.
Ilyen esetekben a Friss"'t (Update) fe ületet ki kell bővítenünk, hogya megfigyelő tud-
ja, melyik a nytól kapta az értesítést. Az a any egyszeruen átadja magát a Frissít mű-
velet paramétereként, így a megfigyelő tudni fogja, melyik alanyt Tell megvizsgá nia.
3 Ki indítja el a frissítést? Az alany és megfigyelói a értesítése segítségével maradnak
összhangban De vajon lnely.k objektum 11ívja meg a Értest műveletet a frissítés
Ile7 1 Két le11etőség ál rend.e kezésre:'
(a) A a any állapot-beállító műveleteivel hívatju { meg az Értesít művelete, niután
megváltoztatták az alany állapotát_ E megközelítés előnye, 1 ogy nem az ügy e-
.J
eknek kell e 1 ékezniük az Ertesít meghívására, hátránya pedig, hogy öbb egy-
mást követő műve et több egymást követő f-issítést von maga után, am' esetleg
nem túl Jlatékony.
Cb) Az ügyfelek elelősségévé tesszük, 1 ühya megfelelő idő Jen legh"'vják az Értes't
műveletet. Ennek e őnye, hogy az ügyfél több á la o változást is megvárhat, mi-
re elindítja a frissítés, így el Terulhetők a felesleges köztes f issítések. A meg ,,-ö-
zelltés 11átulütoje, 110gy az ügyfelek elelőssége a frissllés elindításat ami azok
"fe edékenysége U miatt valósz nűbbé tes j a 11ibál{ bekövetkeztét
· Törölt alanyokra mutató árva hivatkozások. Az alanyok tör ése nem s ab d, hogy
e árvul I ivatl{ozásokat eredményezzen megfOgyelőikben. Az árva 11ivatko ásol{ el
keru ésének egyik mód'a, ha az a any értes"'U a megfigyelőket törléséről, így azok
megszüntethetik a rá mutató 1iv dlkozást. Pus tán meg igye161{ törlése ál "al( an
nem lehetséges, 1 ert más objektumok hivatkoz 1atnak ájuk, illetve ők maguk több
a anyt is megfigyel1etnek
5 Az állapot következetességének biztosítása az alanyban az értesítés előtt. Fontos,
ho!:,Y)' az Értes't megh"'vás.l e őtt ellenőriz7űk, hogy az Alany állapota következetes-e,
me t a megfigyelők saját fr'ssítésü -höz lekérdezik az alany aktuális állapotát
E s abályt akaratlanul is könnyen áthághatju {, ha a Alany a osztá yainak műve ete'
öröl{ölL műveleteket 11ívna {l11eg Az alábbi kódban szerep ő értesítés útnak indtásá
ra éldául akkor keru sor, amikor az alany állapota nem megfelelő:
Megfigyel'" 301
void MySubject::Operation (int newValue) {
BaseClassSubject::Operation(newValueJ i
Ilértesítés elindltása
_mylnstVar += newValue;
//az alosztály allapotának frissitése (tól kés6!)
}
Ezt a bukta ót úgy kerülhetjül{ el, 1a sablonf-üggvényel{ből küldünk [r1estést az elvont
Aldny osztá yokban. CA SablonfüghY\lény m"ntát a fejeze ben késóob tárgyaljuk) Hatá-
rozzun (meg egy egyszerű m(íveletet, amelyet az alos7tályok .la t d felülírnak) az Értes"'t-
el ped.g tegyük a sablonfüggvény uto só műveletévé; ez el biztos"'tju {, hogy az objek-
tum állapota megfeleléS les7, amiko az alosztályok fe ü bírá ják az Alany műveleteit
void Text: :Cut (TextRange r) {
ReplaceChange(r) ; /1 az alosztályok felülirják
Notify() ;
}
Mindig jó ötlet rögzíteni, 110gy az Alany mely műveletei indítják el az értestése {et.
6 A megfigyelőfüggő frissítési protokollok elkerülése: a húzó és toló modell. A Megfi-
gyelő minta különbö7ő megvalósításaibdn a7 alany gyakran k+egészít.ő információ
kat is me lékel a változás jelző értesítésJ1ez, amelyel<et a Friss't művelet argumentu-
maként ad át Az információ mennyisége megvalósításonként jelentősen eltérhet.
Az egyik véglet, 11a az alany részletes jnformációkka láta el a JJ1.egfigye őket, akár
l{érik azok, aJcár nem. Ezt hívjuk to ó mod Ilnek (push model). A másik véglet a húzó
modell (pulI model); ekkor az alany emmi. nenl küld az érLesílésen kívi..il, és a megfi-
gyelőknek ke 1 kifejezetten érde dődniük a részletek felől.
A 11ÚZÓ modellben az alany nem törőd+k a megfigyelőkkel, míg a to ó mode 1 feltéte-
lezi, hogy az alanyok legalábl1 részben ismerik mehfigyelőik igényeit. Az ulé)l)biban
a megfigyelők úrahasznosítása nehezebb, mert az Alany osztályok ()lyan fe]tételezé-
sekkel élnek a Megfigyelő osztályokról, amelyek nem minden esetben bizonytJ nak
igaznak. Más rés rő viszont a 11úzó modell kevésbé l1atékony, hiszen a megfigye
lőknek az alany segítsége nélkül kell megál apítaniuk, mi vá lozott lneg
7. Az "érdekes" módosítá..c;ok kifejezett lneghatározása. Növel11etjük a frissítés 11até
konyságát t ha az alany bejegyző felületét úgy bővítjü ( ki, hOh7 megengedje olyan
megfigyelők bejegyzését is, ame yek csak bizonyos eseményel{et figyelnek. .Amikor
egy esemény bekövetkezik az alany csak azo (at a mcgfigye16kel értesíti, a.melyek
bejegyzés szerint az adott esemény iránt térdek16dnek". E megoJdás támoga ásának
egyik módja az aspektusok (szempontt rulajd.onság) használa a a Subject objektuma (-
ban. A meg -igyelők e {{or a következő módon kapcso ódnak az alanyll0z és jelentik
be, 110gy egy bizonyos esemény ér ekli őke:
void Subject::Attach(Observer*, Aspect& interest) ;
,
A fenti kódban az interes t határozza meg az "é de]{es" eseményt" Ertesfléskor az
alanya Frissít (Update) művelet paramétereként a.dja meg a megfigyelőknek, mely
aspektusa változott meg:
void Observer: :Update(Sub]ect*, Aspect& lnteresl) i
302 5. fejezet · Viselkedési minták
8. Az összetett jhssítések egységbe zárása. Ha az alanyok és megfígyelők közÖtti függő-
ségi kapcsolaL kÜlönös<.:n ÖSs7etett, külön objektumra lehet szÜkség, amely gondos-
kodik e k3pcsolatrÓI. Az ilyen objektumokaL nevezzük Változás Kezelőnek (Change-
Manager). A VáltozásKezel(5 céJja, 110gy mlnim.álisra cscJk]<entJ1.cssük alt a munkát,
ami ahho7 szükséges. hogy az alanyban beállt válto7ást tÜkrÖzhessük a megfigye-
lőkben. TIa egy m(ívelet például számos, egymástÓl fÜggő alany megváIL()7ását vonja
nlaga tltán, sZll]{ség lel let arra, l10g)T biZlc)sítSll1(, 3. lnegfigyelők értesftésére cS;'lk a7U-
tán kerül sor, hogy n1inden alany módosítása megtörtént, így elkerülhetjük a lnegfi-
gye]{5]( többsz()ri értesítét,él.
A vált()zás]{ezelőnek llárom fcla(iata va.il:
Ca) Az alany Összekapcsolása a negllgyel6kkel, és f'elület biztosítása e kapcsolat
fcnntartásához. Ez megszi.intetí annak szükségességét 1 hObY)' 3.7 alanyoknak hi-
vat1(ozásokat 1(el]jen fenntartanluk a megfig)lelőkre, és viszont.
(lJ) Egy a(lott frissítési stratégia megllatározása+
(c) Az alany kérésére az ÖSS7es fLiggő l11egfigyelő frissítése.
A kövcLke7ő diagram a Megfigyelé5 minta egy egyszerű, változáske7eJő alapú megv;3-
lósítását 111utatja. Ilt két egyedi célú változáskezelőt találunk. Al Eh'Y S 7.erlNá1-
t()zásKezelé5 CS i mplcCllangeManager) "naiv', lnindig frissíti az alanyll07 tal10Zó 'Tala-
mennyi megilgye16t. pzzcl szemben a DAGVjltozásKeLdő (DAGChange1\1anagcr)
az alanyok és megfigyelőik függőségeinek irányított körmentes grátJait kezeli.
H;'l egy !11egfig)lelé5 töb1) ala.n)ll is 111egfig'yel II ])AGVáltozásKezelő a. jol)l) vála.sztásr
Ekk()f 3- l(Cll(S vagy több llln)ll)an bel(()vetkező változás()k felesleges frissítéseket
okuzhatnak, a DACVáltozásKezelő viszont gondoskodik róla, hogy a megfigyelő
i'rissítése csak egyszer történjen meg. Ha a tÖbbszöri frissítés veszélye nem merül fel J
az Eg)lszeru\1áltozásKezeIő js megfelel.
Alany
1- __
...
VáltozásKezelo
..
Megfigye Ő
Csatol(M egflgye ló o)
Leválaszt( Megfigyelő)
rtesrt() o
L
I
I
o
I
I
I
I
I
I
I
,
.
i
i
.
vkelel6
alanye k
Bsjsgyez(AJan}f, Msgfigye/o)
:. MegSZÜnt8t(AJany, Megfigye/6}
Értesft(}
megfigyel6k
Frissft(AJany)
Alany-Megfigyeló hozzárendelés
lS:
vkezeló- > Érte srt()
1\
vkem ló-> Be iegyoz(thi s, o)
K
Egysze rúVá Itozá s Keze ló
DAGVáltozás ezeló
Bejegyez{AJany r Megfigyelő)
Megszüntet(Alany, Megfigye1ó)
rtesft(} «
!
Bejegyez(Alany, Megfigyeló)
Megszüntet(Ara nY:r Megfigyelo)
rtesftn 9
I
forall s in alanva k
fomll o in s.megfigyerfi
0-> Frissf (s)
m in den frissrten dő megfigye16
megjelö lése
m [n den megjelölt me gfigyel6 frissrtése
Megfigyelő 303
,..
A Válto7ásKe7e16 a Közvetítő mintára mutat példát. Altalában csak eby van belőle, és
3. progra nban glolJálisan "ismert'J. F]lhez az Egyke n1inta nyújtl1at segítséget.
9 Az Ala1)) és Megfi{!J/eli5 osztályok egJ'esítése. A többszörös öröklést nem tartalmaLó
programnyelvel{en (ilyen példáu] a Sma]]talk) írt oS7tálykönyvtárak általállan nem ha-
tárCJ7nak meg külön Alany és Megfigyelő osztályokat, 11anc TI azol\: fclületét cg)lctlen
osztályban egyesítil<. Így ()lyan o11jektum{)kat J1C)7}lalunl< létre, amelyel{ ehryszerre
alanyként és rTIcgfFgyelőként is visell<ed 1etnek, többszörös öröklés n.élki.il.
A Smallta k nyelvl1en például az AJany (Stlbjecl) és MegfIgyelő (Observer) felüle le ket
az Object gyökérosztály ]latározza D1eg, így valanlennyi oS7tály számára elér11et(5k
Péld kód
A Megfigyelő (Obse1\Ter) felületet egy elvont osztály ]1atározza neg:
class Subject;
class Observer {
public:
vIrtual Observer()i
virtual void Update (Subject* theChangedSubject) - Oi
protected:
Observer() ;
} ;
tZ a megvalósítás minden megfigyelő esetében több ala.nyt CSulJject) tálllogat. Az Update
CFrjssít) műveletnek átadotl alany le11etővé teszi a megfigyelő számára, 110gy amennyiben
több alanyt is megfigyel, l11egállapítllassa, mel)lik változott lneg.
Ellllez llasonlóan az Alany (Subject) felületét is egy elvont osztály Jlatározza ITleg:
ela.ss Subj ect {
public:
virtual Subject();
vlrtual void Attach(Observer*) ;
virtual void Detach(Observer*) ;
virtual void Notify();
protected:
Subject();
private:
List<Observer*> *_observers;
} ;
void Subjecl: :Attach (Observer* o) {
observers->Append(o)i
}
304 5. fejezet Viselkedési minták
void Subject::Detach (Observer* o) {
_observers->Remove(o);
}
void Subject: :Notify () {
Listlterator<Observer*> i(_observers};
for (i..First{); i.IsDone(); i.Next()) {
i Currentltem()->Update{this);
}
}
A ClockTimer (Óraldő7ítój egy konkrét alany, amely az aktuális időt áro ja, és a megfi-
gyelőket másodpercenként értesíti az idő vá tozásáról. Az egyes "dőegységek - óra, perc,
másodperc -leké dezésére a ClackTimer felü et szolgál.
class ClockTimer : public Subject {
public:
ClockTimer() ;
virtual int GetHour();
virtual int GetMinute()j
virtual int GetSecond{)j
void Tick();
} j
A Tick (Kety eg) műve etet egy belső időztő hív'a meg szabályos időközönként. A Tick
f.iss'Y a ClockTimer be ső állapotát, és meghív'a a Nati fy CErtesít) műveletet, hogy érte-
sítse a megf.gyelőket a változásról;
void ClockTimer: :Tick () {
/1 a belső idő frissítése
/ / . . .
Not i fy ( ) ;
}
Most meghatározhatunk egy DigitalClock (DigitálisÓra) neVŰ osztályt, amely megje e-
nti az időt. Az. osztály a grafikus megjelenítéshez a Widget (Vezérlő) os tálytói örököl,
amelyet a felhasználói e1ü et elemkészlete biztosít. A megfigyelő felületet az Observer
osztálytóI való örökléssei a DigitalClock felületbe "keverjük",
class DigitalClock: public Widget, public Observer {
public:
DigitalClock(ClockTimer*);
virtual DigitalClock();
egfigyelo 305
vlrtual void Update(Sub]ect*);
II a Observer műveletének felülírása
virtual void Draw();
II a Widget múveletének felülírásai
II a digitális óra kirajzolását határozza meg
private:
ClockTimer* _subject
} i
DigitalClock: :DigitalClock (ClockTlmer* s) {
_subject = s;
subject->Attach(this) ;
}
DigitalClock: .DlgitalClock () {
_subJect>Detach(this) ;
}
Mielőtt az Update művelet megrajzolja az óra számlapját, ellenőrzi, l10gy az értesítő alany
a ora a anya-e
void DigitalClock::Update (Subject* theChangedSubject) {
if (theChangedSubject = _subject) {
Draw ( ) ;
}
}
void DigitalClock: : Draw () {
II az új értékek lekérése az alanytó
int hour - _subject->GetHour() ;
int minute = _subject->GetMinute();
II stb..
1/ a digitális óra megraJzolása
}
Egy analóg óra (AnalagClock osztá y) eh11ez hasonlóan határozl1ató meg:
class AnalogClock : public Widget, public Observer {
public:
AnalogClock(ClockTimer*);
virtual void Update(Subject*)j
virtual void Draw() ;
/ /
} .
306 5. fejezet Viserkedési minták
A2 alábbi kód egy analóg és egy digitális ór{t hoz létre, arnelyek mindig ugyanazt az id6t
mutatjáJ<:
ClockTimer* timer = new Clockrimer;
AnalugClock* analogClock = new AnalogCJock(timer);
DigitalClock* d.gitalClock = new DigitalClock{timer);
A két óra a timer minden "ütésénél" frissül, és újra kirajzolja magát.
Ismert f Ihasználasok
A Megfigyelő minta első és talán legisrnerlebb alkalma?ása a Smalltall{ fellla.szná ói felületi
keretrendszere, a modell-nézet-vezér ő (Mode]JView/Contro ler, MVC) megoldás [KP88].
Itt az IvfVC Mc)del osztálya a7 alany! lllíg a View a l11egfigyelők alapc)sztálya. A Srnalltalk, az
ET++ lWGM88] és a "JIINK osztálykönyvtár [Sym93b] egy általános fübgőségkezelő megol-
dást tartalmaznak: az Alany és Megfigyelő fe ületcket a rendszer va amennyi os7tályának
szü 60sztdlyába 11elyezték.
UgY3nezt a 111"ntát alkalmazza az TnterV'cws [LVC89J, az Andrew ToolkOt rp+88], és
a Unidraw VL90] felhasználói felületi clemkés7.]et is. Az InterViews kifejezett Observer
ÜnegfigyeI6) és Observab e (megHgyelhető, vahtyis a any) oS7.tá]yokat határoz mLg, a7
Andrew"nézeteket" és l1adatobjektumokat"; a Unidraw a grafikus szerkes tói objektumokat
View (megfigyelői) és Subject (alany) rés7el(re bontja
Ka csolo o mint k
KÖ7vetítő: Az Öss7etett risítésel{ egységbe 7á ásával a VáltozásKezelő közvetítőké 1t mű-
ködik a7 alanyok és t11egfigyel6k között.
Fgyke: A VáltozásKcze16 az Egyke minta segítségéve] egyedivé és globálisan elérhetővé
tellelő.
Áll pot 307
1. I
Vselkedési objektun minta
el
Egy adotl objck um számára engedélyezn+, hogy belso állapotának n1L b változlsával mcg-
vá toztathassa visel]{edését is. Az o11jeklLlrn ekkor Iáts7ó ag m.ó<... osítja az oS7tályát.
Egy b nev k
State, OlJJects for Stales CÁllapolobjektumok)
eladat
Vegyünk ehry 1'1CI)Kapcso al (l-'CPConnection) nevű OSL.lályl, amely egy 11áló7ati ka )c")olatot
áb ázol. A TCPKapcsolat objektum a követ]<ező á]lapoto]{ va]amelyi]{ében lehet: Kapcsolód-
Vd (Established), FigyLlő (Listen+ng), LeL árva (Closed) Amikor az objektum kéreImeket fo-
gad más ob.'e]lU.1 aktáI, aktuális állapotátó függően lnás-más váJaszokat al.. ]1at Egy Meg-
nyit (Open) kérelem 11atása például attól függhet, 110gy a kapcsolat éppen lezárva vagy'
Kapcsolódva állalJotban van-e. Az Allapot tervezési minta ]eírja, llogyan mutath.at a TCP-
Kdpcsolat az egyes állapotokba.n különbözo viselkedéseket
A minta kulcsa egy TCPAllapot (TCPState) new elvont osztály beveze -ése, ami a 11álózati
kapcsolat állapotait ábrázolja. A CI)Állapot a különböző működési álla otok110Z tartozó
oSLtá yok közös felületét r'a e, alosztályai pedig az á lapottói függő viselkedést A TCP-
Kapcsolódva ( C )Eslablis led) és a TCPLezárva (TCI)Closed) példáu a CPkapcsolalI(ap-
csolódva és Lezárva ál apotaira .'ellemző lnűködést valósítják lTIeg.
TCP apcs [at <> áHapct -- TCPÁllap t
11"""'"
MegnVitn 0- - - - - - I Megnyit()
.
Lezár{} . lOZÉr( )
I Nyugtáz()
Nyugtáz() .
,
/\
l
I I
. .
állapot-> Megnyitn TCPKapcsol6dv TCP · elo
TCP ezárva
Megnyrt() Megnyit() M egnyl1:{)
Lezár(} lezár() Lezárt)
Nyugtáz(} Nyugtáz() Nyugtáz(}
08 5. fejezet · Viselkedési minták
....
A TCPKapcsolat osztály egy állapotobjektumot tart fenn (3 TCPAl apot va amelyik alo$ztá-
lyának egy pé dányát), ami a TCP kapcsola aktuális állapotát je öli, Az osztály minden ál a-
potfüggő kére met ehhez az objektu . lhoz továbbít, a7 pedig végrehajtja a kapcso at állapo-
tának meg elelő műve eteket.
Amikor a kapcso at á lapota megváltozik, a TCPKapcsalat a megfelelő állapotob'ek umfa
cse éli az éppen haszná tat; ha a kapcso atat példáullezárjuk, a TCPKapcsolódva példányt
egy TCPLezárva példánnyall1elyettesíti.
I am ha oság
"
Az Allapot minta a {öve "ke76 esetekben a kalmaz}1ató:
· Egy objektum vse kedése az áJ!apo"álÓl függ, és ezen viselked.ést futásid6ben az á_-
lapotnak negfelelően kel] válto7tatnia.
· A műveletekben hosszú, több részből álló feltéte es utasítások ta álhatók, amelyek az
objektum á lapotától függnek A2 á lapotot általában egy vagy több :elsoroló állandó
..,
'e öli. Számos műve e ugyana7t a fel ételes szerkezetet használ'a. Az Allapot minta
a feltétel minden ágát külön osztá yba he yezi, így az objektum állapotát is önálló ab
jektum 7ént keze hetjük, amely a többi objektumtói függetlenü módosítható.
S rke t
Környez t <> [apot Állapot
.....
II"""'""
Kéralmez( ) o K6zs/()
I
l_
I
I
I 1\
I
- --
"'"
0-. ".0
álr ap ot- > Keze I ()
KonkrétÁll p tA KonkrétÁllap tB
KezeJ() KezeIU
.... -
sztv VO
· Környezet (TCPKapcsolat)
- Megl1atá azza a ügyfelek számára é. dekes felü elet
- Egy KonkrétÁ apot (ConcreteState) példányt tart fenn, amely mehhata 'OZ7a az ak-
tuá]is állapotot
II pot 309
· Állapot (TCPAllapot)
- Pelliletet határoz meg a Környe7et (Con ext) egy adott á lapotá110z kötődő visel
kedés egységbe záráához.
,.
· KonkretAllapot alosztályok (TCPKapcso ódva, TCI)Figyelő, TCl) ezárva)
- A Környezet egy-egy állapotához kapcsolódó viselkedést valósítják meg.
gyüttmúkö s
· A Környezet az állapotfüggő kérelmek kczelését átruházza az 3.ktuális Konkrét-
".
AllapoL ohjektumra.
· A Környezet argumentumként dtadhatja magá a kérell11et kezelő állapotobjektum-
nak, így az tudomást szerezhet a kö nyezetről, ha szü.kséges.
· A Kő nyezet az ügyfelek elsodleges fe ülete. Az ügyfe .el{ Allapot obje {tumokkal be
állíthat'ák a környezetet, ezu "án nem kell közvetlenü 'oglalkozníu {az állapotobjek-
tumokkal.
Az állapotok ')orrendjét, illetve az azt befolyásoló körülményeket a Környezet, ílletve
a KonkrétÁllapot alosztályok ís meglatá oz 1atják.
K""vetke m nye
Az Allapot tervezési minta előnye. és hátrányai a következ6k:
"
1. Meghatározza és elkülöníti az egyes állapotokhoz tartozó viselkedéseket. Az Allapot
míntában az egy adott állapot 102 tartozó valamennyi művelet egyetlen objektumba
keru!. Miután minden állapotfüggő kód egy Állapo alosztályban található, új alosz-
tályo készítésével ()onyen ve11etünk fel új állapoto rat és átmeneteket.
Egy másil{ mega dás, ha a belső állapotok egllatározására adatértékeket haszná-
lunk, amelyeket a Környezet műveletei ellenőriznek. Ekkor J.7onban több egyforma
feltételes vahY eJágazó li asítást kapunk} am.elye { a Környezet ll1egva ósításában
szétszórva helyzel{ednek el, így egy új állapot hozzáadása számos művelet Inód.osÍ-
tását igényelhet, ami megnehezíti a kód karban artását.
/
Az Allapot mintával az említett probléma elkerülhető, víszont éppen a minta ro'att
be eütkö21etünk egy máskba. A7, ]10gya minta a különböző állapotokhoz tartozó
,.
víselkedéseket több AllJ.pot a osztályba oS7tja el, növelí az osztályok számát, Íh'Y
a kód kevésbé lesz tömör, mintha egyetlen osztályt llasználnánk. Az elosztás akkor
hasznos, ha ok-sok állapotunk van, amelyek másképp nagy mére ű feltételes utasÍ-
tásokat ennének szükségessé
A 110sszú eljárát,okhoz hasonlódll a ] asszú feltételes li asítások sem kívánatosak.
Tömbszerűek, rontják a ród átláthatóságát, így nehe7En módosítható <: vagy bővÍthe-
,;'
to Az AllalJO minta jobb megoldást nyúj az á lapotfüggő kód szervezésére. Az ál
lapotátmeneteket vezérlő logika ebben a míntában nem roonolitikus if vagy
swi tch utasításokban találl1ató hanem e oszlik az Allapot aIosztályok közö t. Azzal,
31 O 5 fejezet · Viselkedési minták
l10gy mind.en állapotátmen.etet és műveletet egy osztályba takozunk, a muköd.ési ál-
apotot egy te jes é tékű objektum szintjére elneljük, ami világossá teszi a kód sze +-
(Lzetét és célját.
2 1Illágossá teszi az állapotát1neneteketr Ha egy objektum az aktuális állapotát l{izáró-
lag lJelső adatértékekkel fejezi k-, állapot"tmenetcinek nem lesz l<ifejezett ábráz(Jlá-
sa; azok csupán egyes változók értékadásaiban jelennek meg. Azzal, 110&7 az egyes
állapotoklloz önálló objektumokat vezetünk be, egyértelmű11bé tesszük az átmene-
tekel.
/'
Emel]ett az AJ.la!Jot objektumok véd.el et nyújtanak a környezetnek a követl{ezetlen
bLJ6 állalJotok ellen, hiszen a Környezet szems7ögéből az állapotátmenetek atonl.-
".
ak - neJTI tölJb, 11anem egyetlen válto7ó Ca Kör 1yezet Allapot objektumváltozója) ér-
tékének módosításáva] mennel< végbe [dCLF93J.
3. Az állapotobjekt141110k meg oszthatók. lIa az ál a.potobjektumoknak n "ncsenek Jél=
dányváltozói (vagyis az általuk á11rázolt állapotat teljes mértékben a típusuk kódo -
ja), a környezetek közösen i l1asználhatjá -< őket. Az álldpotok "lyen lnegosztott
l1asLnálata lényegében a Pe11elysúlYÚ minta (lásd az előző fejezetben) a kalmazása,
a110l belső állapot n.incs, csak viselkedés.
e al' SI S
,..
AL AJlapollerve7ési minta megvalósításáva kapcsolatban a következőkre kell figyelni:
1 Ki határozza 11zeg az állapotátrrteneteket? A minta nem ad útmutatást arra nézve,
hc)gy me]yik résztvevőnek kell meg11atároznja az állalJotátmenetek követelményeit.
Ha a követelmények kötötteJ(, megvalós"'tásuk teljes egés7él1en történilet a Környe-
zet objektum.ban. Mindazonáltal álta álJall 11Jgallnasabb és l1elyese}1h megoldás, 1a
az Állapot aloztályokra bíZ7Uk, hogy maguk határozzák meg, melyik állapot követ-
11eti ő](et, és milyen köriilm[nyek között. L]1hez a I(örnyczetet ki l{ell bővítenünk
egy elülettel, amely lehelővé teszi az állapotobjLktumok s7ámára J 110gy 3. Környe el
állapotát kÖ7vetlenül ől{ állítsák be.
/'
Az átn1enetct vCLérlő logika eme felosztása egyszerűbbé tezi a log.J{a új AllalJOl al-
osztályokkal l()rténő bővítését vagy módosítását, 11átránya viszont t 110gy az állapot-
objektulllok legalább e;y társukat iSJll.e ni fogjá.k t ami mef,tyal()sftási függős(ge {et
ol{oz az alosztályok között.
2. hgy táblázat alapú alternatlva A C++ Programllling Style [Car92] című kÖll.yvben
Cargill az á lapotfüggé5 kód szervezéséncl( egy lnásik módját írja le: táblázatokat
l1as nál a bemenetel{ és állapotátmenetek egymás]lo7 rendelésére. Az egyes állapo-
tokl10Z tartozó tábláLa.tok minden lelletséges bemenetet egy következő állapot lDL
rende nek, amelyne (révén a feltételes kódot (és az ÁJlapot 11linta esetében a virtuá-
lis függvényeket) egy táblázatban való kereséssé alal{ítjuk.
Á lapot 311
A tá111ázatok lL b f611b előnye a s7ahályossá b ; a7 átmenet kcjvetelménycit ad.atol{, és
nen1 progrdmkód 11lódosításával váltoLtatllatjuk meg A megoldá.snak természetesen
vanna]\: J1átrányai is:
A tábláLatban való (erLS(S általában kevésbé hatékony! mint egy (virtuális) függ-
vényhívás.
· Az átmcnetlogil(ájának egységes, táb á7alos fo. nába rendezése ll()mályossá., ne-
llLzen átlát11atóvá teszi az átlnenetk()vetelményeket
Többnyire nehéz műveletLket adni az állapotátmenetckhe7. A táblázatos megköze-
lítés megl1.3tározz3. az álldpotok::lt és átmeneteil(ct, de ahl10z, 110gy a7 átJl1.encteknél
külön ele számítási ill.űveleteket "\régezllessünk, a mcgold.ást ]{i ]<el11JővÍtenünl{.
A táblázolt alapú álapotautomaták és az Állapot tervezési m.i.nta közÖtti legfontosabb
különbség a következőképpen foglalható össze: az Állapot minta az állapotfüggő v'-
sekedésl modellezi, míg a táblázatos megközelítés az állapotátmenetek meghatáro-
, o. -'
zasara osszpontoslt..
3. Az Állapot objektumok létrehozása és megsemmisítése. A megvalósÍlás során gyako-
ri, hO,gy választás e é kerülünk: csak akkor hoz7uk létre az á ]apotobjektumokat,
am.i]{or szükség ,'an rájuk, és utána semmisítsü 7 11eg 6lcet (1), vagy készÍtsü]{ el őket
előre, és SO]1a ne pusztítsuk el (2)?
Az elsó IchLlőséget akkor célszerű választani, ha a futásidőben beállÓ ál1apotokal
nem ismerjük előre, és a környezet állapota nem Vá]to7ik gyakr.ln. Így e kerülhetjÜk
o]yan objcktumo].c létrehozását, anlelycket késó1Jb nem is J1asználunk, a ni fontos,
ha az állapotobjektumok sok információt tárolnak. A második lehetőség l1ellett ak-
kor célszerű dönteni, ha az állapotváJtozások gyorsan követik egYInásl. JIyenkor
ny'lván el s7eretnénk kerülni az á lapotok megsemmisítését, hiszen rövidesen újra
szükség lehet rájuk. lIa ezt a megoldást válaszljuk, a példányosítás {öltségeit egy-
szer, előre kell csak l11Cg 'izetnÜnk, a TIcgsemm.sítés pedig egyáltalán nem jár költsé-
gLkkel. Mindazonálta] e7 a megközelítés kényelmetlen lehct, Inert a környe7etnek
lninden leI-lelséges állapotra Jlivatl(ozást kell fenntartania.
4. Dinamikus öröklés ha-,,>ználata. Egyadott kérelemhez tartozó v'selkedést elv'leg
módosíthatnánk úgy, hogy az objektu TI osztályát futásidőben megváltozlatjuk t de ez
a legtöbb objektumközpontú pIogramozási nyelvben nem lehetséges. A kivételt
a Se f [US87] és Inás átruházás aJapú nyelvek jelentI {, amelyek biztosítanak ilyen le-
,
hetőséget, és ezáltal kÖ7vetlenül támogatják az Allapot tervezési mintát. A Self objek-
tumai a dinam o klls öröklés egy formáját azzal éril{ el, 110gy álruházllalnak művelete-
ket Il1ás objektumokra. A megbízott futásidejű megváltoztatása módosítja az örökléi
szerke7etet; e megoldással az objektu1110k módosíthatják viselkedésüket, és vég-
eredm.ényben o sztályuJ(at.
3 2 5. feezet · Viselkedesi minták
P '1 kód
A következő példa a Feladat rét>zben leírt TCP kapcsolat C++ kódja; egyben a TCP proto-
koll egys efŰsítetl válozata. (Egyszerűsített, melt nem íra le a teljes protokoll, illetve
a TCP kapcsolatok valafi1ennyi állapotát. 8)
Elős ör is, meghatározzul{ a TCPConnection (TCPKapcsolat) osztályt, amely az adatátvi-
tel fe]ületét biztosítja, illetve a ;il apotváltoztatási l{érelmeket kezeli.
class TCPOctetStream;
class TCPState;
class TCPConnection {
pu"blic:
TCPConnection() ,
void ActiveOpen(}i
void PassiveOpen() ;
void Close() ;
void Send() ..
void Acknowledge() i
void Synchronlze();
void ProcessOctet (TCPOctetStream*);
private:
friend class TCPState;
void ChangeState(TCPState*);
private.
TCPState* _state;
} ;
,
A TCPConnection a TCPState (TCP Alla pot) osztály egy példányát a state tagváltozó-
ban táro .a A TCPState osztály lemásolja a TCPConnection állapotmódosító felületét.
Művele ei pardmé erként egy TCPConnect.ion pé dányt kapnak, így az osztály hozzáfér
11et a TCPConnection adatail10z, és megváltoztathatja a {apcsolat állapotát
class TCPState {
public:
virtual
virtual
virtual
virtual
virtual
virtual
virtual
protected:
void ChangeState(TCPConnection*1 TCPState*)j
void
void
void
void
voi.d
vOld
void
Transmit(TCPConnection*, TCPOctetStream*};
ActiveOpen(TCPConnectlon*) i
PasslveOpen(TCPConnection*) ;
Close(TCPConnection*);
Synchronize(TCPConnection*}i
Acknowledge(TCPConnection*};
Send(TCPConnection*);
} ;
8 A példa a Lyne11 és Rose [LR931 által le írt TCP kapcsolati protokollon alapul.
Állapot 313
A TCPConnection minden állapotfüggő kerel et _state TCPState példányára nJház
áto A TCPConnection egy más.k műveletet is biztosí} ame y e t a változó! egy új TCP-
State- e ál1"'tja. A TCPConnectlan konstruk"ora az o +ektumnak a (később meghatáro-
o t) TCPClosed (TCP Le zárva) állapoto adja kezdőértékül.
TCPConnection: : TCPConnection () {
_state = TCPClosed: : Instance() ·
}
vOld TCPConnection::ChangeState (TCPState* s) {
_state - s;
}
void TCPConnection::ActiveOpen () {
_state->Act i veOpen(thls);
}
void TCPConnection::PassiveOpen () {
_state->PassiveOpen{this)i
}
void TCPConnection::Close () {
_state>Close(this)i
}
void TCPConnection: :Acknowledge () {
_state->Acknowledge(this);
}
void TCPConnection: :Synchronize () {
_state->Synchronlze(this) ;
}
A TCPState tartalmazza a rá ruházott valamenny. kérelem teljesítéséhe s ükséges alapér
telmezett viselkedés megvalósltasát. Emellett a TCPConnection állapotát is képes megvál-
...
toz atni, a ChangeState (VáltoztaWlapot) múvelettel A TCPStateet a TCPConnection
barátjaként vezetjük be, Igy klvételezett llozzáférest kap ehhe a művelethez.
void TCPState::Transmit (TCPConnection*, TCPOctetStrearn*) {}
void TCPState: :ActiveOpen (TCPConnection*) {}
void TCPState: :PassiveOpen (TCPConnectlon*) {}
void TCPState::Close (TCPConnection*) {}
void TCPState::Synchronize (TCPConnectl0n*) {}
void TCPState::ChangeState (TCPConnection* t, TCPState* s) {
_t->ChangeState(s) I
}
,
31 5 fejezet · Viselkedési minták
A TCPStale alosztályai állapotfüggő viselkedést valósítanak meg. A TCP kapcsolat számos
állapotot vehet fel - Kapcsolódva, Figyelő, Lezárva stb. -, és mindegyikhez egy-egy
TCPState alos tály tartozik E7ek közül 11drmat tárgyalunk részletesen: a TCPEstab-
lished (TCPKapcsolódva), a TCPListen (TCPFigyelő), illetv"e a TCPClosed (TCPLe-
zárva) osztályokat
class TCPEstablished : public TCPState {
publje:
static TCPState* Instance();
virtual void Transmit(TCPConnection*, TCPOctetStream*);
virtual void Close{TCPConnection*);
} ;
class TCPListen : public TCPState {
public:
static TCPState* Instance();
virtual void Send(TCPConnectlon*) ·
/ / -
} ;
class TCPClosed : public TCPState {
public:
static TCPState* Instance();
virtual void ActiveOpen(TCPConnection*)j
virtual void Passi.veOpen{TCPConnection*);
/ / . . .
} ;
A TCPState aloszlályok helyi állapotinformációt nem tartanak fenn, így ll1egoszthatók, és
mindegyikből csak egy példányra van szükség. Az egyedi példányokat a statikus Instance
(Példány) művelettel szerezzük meg. 9
Az egyes TCPState alosztályok az állapot110Z artozó érvényes kérelmek állapotfüggő vi-
se l{edésé va ós"'tják meg:
void TCPClosed: :ActiveOpen (TCPConnection* t) {
II SYN küldése SYN, ACK stb. fogadása
ChangeState(t, TCPEstablished: :Instance());
}
void TCPClosed::PassiveOpen (TCPConnection* t) {
ChangeState(t, TCPListen::Instance());
}
9 Ennek révén a TCPState alosztályok az Egyke tervezési mintát követik. (La sd az előző fejezetet.)
Állapot 315
void TCPEstablished::Close (TCPConnection* t) {
II FIN küldése a FIN nyugtázásának (ACK) fogadása
ChangeState{t, TCPListen: :Instance();
}
void TCPEstablished: : Transmlt (
TCPConnection* ti TCPOctetStream* o
) {
t>ProcessOctet(o) ;
}
void TCPListen::Send (TCPConnection* t) {
JI SYN küldése, SYN, ACK stb. fogadása
ChangeState(t l TCPEstabllshed::lnstance()).
}
Az állapothoz kapcsolódó munka elvégzése után ezek a muveletek a ChangeState meg-
hívásával megválto tatják a TCPConnection állapotát. Maga a TCPConnection semmit
sem tud a TCP kapcsolati protokollról; az állapotátmeneteket és TCP ITIúveleteket
a TCPState alosztály6k 1 atározzák meg
Ismert I s n I sok
,.
Az Allapot mintát és alkalmazását a TCP {apcsolati protokollokraJollnson és weig írták le
[JZ91].
A legtöbb néps7erű interaktív rajzolóprogram "eszközöket' biztosít a közvetlen művelet
végzéshez, például ebY vonalrajzoló eszköz segítségével a vonal pusztán kattintással éc; hú-
zással megraj olhaló, egy kijelölő eszközzel pedig ugyanígy alakzatokat jelölhetünl{ ki
Az es kÖZök általában egy palettán kapnak helyet, a1101 vlla.s thatunl{ közülük. A felhasz-
náló úgy gondo rá, mintha felvenne egy es közt és használatba venné, pedig a valóság az,
hogya szerkeszt6program viselkedése változik meg a ki+elölt eszköznek megfelelően.
Ha egy rajzoló eszköz al<tív, alakzatokat hozhatunk létre, la egy kijelölő, akkor l{ijelölhe
tünk, és gy tovább A viselkedés megváltoztatása a választott eszl{öznek megfelelően az
Állapot minta segílségévellehetséges.
Meghatározhatunk egy elvont Eszköz (Tool) osztályt, amelyből a .OS2 ályoka származtatva
megvalósítl1atjuk az egyes eszközökne { megfelelő viselkedéseket. A program nyomon l{öve
ti, melyik az aktuális Eszköz objektum, és a kéreimeket hozzá rányítja Ha a felhasználó má-
sik eszközt választ, az objektum kicserélódik, és így a program viselkedése is n1egváltozik.
Ezt a megoldás alkalmazza mind a HotDraw Uoh92] mind a Unidraw [VL90] rajzoló keret
rendszer, és lehe ővé teszik a fel11asználónak, hogy könnyedén készítsen uj eszközöket.
31 5. fejezet Viselkedési minták
A HotDraw-ban a DrawingCont o er (RajzVezérlő) osztály továbbítja a kére meket a aktu-
á is Tool objektumnak, míg a Unidraw megfelelő oS7tályai a Viewer (P.gyelój és a Tool
Az alábbi osztálydiagram a Tool és a DrawinhCont aller elü ete. vázlatát mutatja:
Drawin Control er currentTool Tool
O .........
Ill"""
MouseP essed() HandleMousePress()
ProcessKeyboard () HandleMouseRelea se ()
[ nitiaHze() HandleCharacter()
GetCursor()
Activate()
J\
. .
CreationTool S lectionToo TextTool
Coplien [Cop92] Envelope-Le ter (bor''ték-Ievél) megoldása is hasonló az Állapot mintához,
"
és azt eszi lehetővé, hogy egy objektum osztályát futásidőben megváltoztathassuk. Az Alla
pot minta ennél rögzíte tebb, és arra összpontosít, hogyan kezelhetünk egy objektumot,
amelynek viselkedése az állapotától függ.
pcso adó min á
A pehelysú yú min a megmutatja, miko - és hogyan oszthatók meg az állapotobjektumok.
Az állapotobjektumok gyakran az Egyke mintát köve "ik
,
Stratégia 317
r-
.
.
II-
Viselkedési objektum l°nta
Crl
Algoritmus-csa ád meghatározása, melyben az algoritmusokat egyenként egységbe 7árjuk
és egyn ással felcserélhetővé tesszük. E módszer révén az algoritmus az ügy eltől függetle-
nül módosítható.
'b n V
St ategy, Po icy
Fe d t
S övegfo yamok sorokra tördelésére számos a gorjtmus létezik, de ezek "bedrótozása H
azon os tályokba, amelyeknek szükségük van rájuk, több okbó sem k"'vánatos:
· A sortörést · génylő ügyfe ek tú naggyá, bonyolulttá és ne 1ezen karbantartl1atóvá
válhatnak, 1a tartalmazzák a sortörő kódot is, különösen ha több sortörő algoritmust
is támogatnak.
A különböző algoritmusokra különböző 11elY7ete (ben lehet szükség. Több sortörő
algoritmust nem célszerű támogatni, 11a nem használjuk mindegyl(et.
Nehéz új algoritmusol{at felvenni, il etve a meglevőket módosítani, ha a sorLörő l{ód
az ügyfé szerves része.
A fenti gondokat úgy orvosolhatjuk, ha az egyes sortörő algoritmusa <at egységbe záró OS2-
tályoka' 113 ározunk meg Az így egységbe zárt alga .itmusokat nevezzük strat' giáknak.
.. 6sszetíl [ft6 ."
Osszat tel <> - Osszeál/f 6
--
...
Bej rO DSSl8 fI{t()
Javft( ) «
. 1\
I
.
. . ... ...
Egysze raOsszeál Ift6 eXOss eáUft6 Törn.bOss á rt6
..
összetillft6-> Osszsállft() Össze állrtn
Összeállft( ) II
Osszeá1lft( )
. .
318 5 fejezet · Viselkedési minták
Tegyük fel, hogy egy Összetétel (Composition) nevű osztály felelős egy szövegnézőben meg-
.elenített szöveg sortöréseinek kezeléséér és frissítéséért. A sortörő stratégiákat nem ez az
osztály va ósítja meg, hanem külön-külön az elvont Összeállí ó (Compositor) osztály alosztá-
yai. Tehát az Összeállító alosztályokban különböző stratégiák megvalósításai találhatók:
..
· Az Egys ze rűOsszeállító CSimpleComposi .or) egy egyszeru stratégiát nyújt, amely egy-
szerre eg)' sortörést határoz meg.
."
· A TeXOsszeállító CTeXCompositor) a TeX dlgoritmust valósítja meg a sortörések meg-
keresése céljából Ez a stratégia általános teljesítményfokozásra törekszik, így egy-
szerre mindig több sort, egy bekezdést vizsgál.
..
· A TömbOsszeállító CArrayCompositor) olyan stratégiát valósít meg, ami úgy töri meg
a sorokat, hogy azokban egyenlő számú elem legyen. Ez például egy ikongyűjte-
mény sorokra tördelésénélle11et hasznos
Az Összetétel objektumok hivatkozás tárol nak az Öszeállító objektumokra. A ikor egy
Összetéte újraformázza a szöveget, ezt a felada "OL Összeállító objektumának továbbítja.
Az Összetétel ügyfele úgy határozza meg, melyik objektumo' kell használni, hogy a kívánt
Összeállítót az Összeté elbe telepíti.
A a m h ósá
A Strdtégia tervezési minta használata a alábbi esetekben célszerű:
· Számos kapcsola ban álló osztály csak a viselkedésében különbözik egymástól.
A stratégiák lehet6vé teszik, hogy egy osztályhoz több közül egy adott viselkedést
rendeljünk.
· Egy algoritmus több változatára van szükségünk, például különböző algoritmusokat
határozunk meg aszerint, hogy az idő vagy a árhely a fontosabb. A stratégiák jó
szolgálato tehe nek, ha a különböző változatok megvalósításai az algoritmusok 052-
tályhiera c 1iá.'át alkotják [H087]
· Egy a goritmus olyan adatokat 11asznál, amelyekről az ügyfeleknek nem szabad tud-
niuk. A Stratégia minta alkalmazásával elkerülhető az összetett, algoritmusfüggő
adatszerkezetek felfedése.
· Egy osztá y többféle viselkedést llatároz meg, és ezek műveleteiben többágú feltéte-
es utasításoJ {ént je entkeznek. A. eltételágal{ 11elye l használjunk önálló stratégia-
osztályoka l.
Stratégia 319
S rk
Környeze stratgia Stratégia
. .............. -
--
Kömy9Z8tFelület() AJgoritmusf fü!etf}
1\
KonkrétStratégiaA KonkrétStratég- aB Kankr tS
- .
AlgoritmusFe1ülotn AlgoritmusF 1ülot(} Algoritmus elü
tratégiaC
latO
Résztvev k
· Stratégia (Összeállító)
- Közös felüle "et h áraz meg a támogatott algori musok számára. A Környezet
(Context) ezt a felületet használja a KonkrétStratégia (ConcreteStrategy) által meg-
határozott algoritmus megllívJ.sára.
· KonkrétStratégia (Egyszerű Összeállító, TeXÖsszeállító, TömbÖsszeállító)
Megvalósítják az algoritmust a Stratégia felület segítségével
· Környezet (Összetétel)
Egy KonkrétStratégia ob:ektum allítja be.
- Iiivatkozást tart fenn egy Stratégia objektumra.
..- Megllatározllat egy felületet, amelyen keresz ül a Stratégia 110zzáférhet a művele
teihez+
gyü mu ödes
A Stratégia és a Környezet objektumok együtt va ósítják meg a választott algoritmut.
A környezet minden, a7 a goritmus által igényelt adatot átad11at a stratégiának t an1i-
kor aL algoritmus meghívására sor kerül, de önmagát is átacl-Iatja argumentumként
a Slratég + a műveleteinek, így a st atégia szül{ség esetén viss zal1.Jvh at ja a ]{örnyezetet.
· A környeze az ügyfe eitől érkező kéreImeket a hozzá tartozó stratégiához továbbít-
ja. Az ügyfelek általában létrehoznak egy KonkrétStratég+_a objektumot, amelyet át-
adnak a környezetnek; ezt követően l{izárólag a kÖlnyezettel tartanak kapcsolatot.
Az ügy el számára többnyire KonkrétStratégia osztályok egés7 család.a áll rende]ke-
zésre, amelyből választhat.
320 5. fejezet · Viselkedésj minták
"öv tkezm r nyek
A Stratégia minta előnyei és llátrányai a következők:
· A rokon algoritmusokból családok alkothatók. A Stratégia osztá yok 1ierarchiája a go-
ritmusok, illetve viselkedések családját alkotja, amelyet a környezetek újrahasznosít-
.latnak. A minden algoritmusban je en levő szolgá tatásokat örökléssel biztosíthatjuk.
2. Alternatívát nYúlt az alosztályok létrehozásával szemben. Több algoritmust, illetve
viselkedést öröklésseI is támogathatunk, ha egy környezetosztályból közvetlenül
származtatunk különböző viselkedéseket megvalósító a osztályokat Ez azonban
"bedrólozza" a viselkedést a Környezetbe, az algoritmus megvalós"'tásának keverése
a környezetével pedig nehezít' a Környezet kódjának megértését, karbantartását, il-
letve bővítését. Emellett az algoritmus így dinamikusan nem változtatható, ráadásul
számos rokon osztály jön létre, amelyeket csa az általuk alkalmazott algoritmus
vagy viselkedés különböztet meg. Ha az algoritmust önál ó St. atégia osztályokba
zárjuk, a környezettel függetlenül cserélgethetjük azokat, ami megkönnyíti a módo-
sítást és a bővtést.
3. A stratégiák szükségtelenné teszik a feltételes utasításokat. A Stratégia mintával k-
váIthatjuk a kivánt visel '""edés kiválasztására szolgáló feltételes utasításokat Ha kü-
lönböző viselkedése (et egyetlen osztályba tuszkolunk, nehezen kerülhetjük el
d megfele 6 kiválasztását célzó feltéte]es utasítások 1asználatát. A vise kedés önálló
Stratégia osztályokba zárása ezt .s szükségte enné tesz'.
Stratégiák nélkül például aszöveget sorokra törde ő (ód valahogy így nézne ki:
void Composition: :Repair() {
switch (_breakingStrategy) {
case SimpleStrategy:
ComposeWithSimpleCompositor() ;
break;
case TeXStrategy:
ComposeWithTeXCompositor();
break;
/ I · - .
}
1/ a7 eredmenyek összeolvasztása a meglevő
II összetétellel, ha szükséges
}
A Stratégia mintában a case utasításra nincs szükség, mert a sortörés feladatát egy
Stratégia objektumra ruházzuk át:
void Composition::Repair () {
compositor->Compose() ;
II az eredmények összeolvasztása a meglevő
II összetétellel, ha szükséges
}
S téi 3
Az olyan kód 'e1enléte, amelyben szárnos feltételes utasltás található, gyakran éppen
arra li al, hogy érdemt7s enne a Stratégi . ervezési mintát alkalmazni
egv ,ÓSl a$,ok v: ltl$zte ',a. A strategiak ugy .annak aviselkedesnek kül:' nböző
megvalosl ásalt nyúj ják, amelyk köztil az ügyfel as erint vá aszthat, hogy id6vel
vagy tarhel ye kíván-e inkább fizetn 6 .
5 Az ügy/eZeknek tudniuk kell a különböző st atégíákról. A minta egy lehetséges há
tulütője, hogy az ügy elnek tudnia kell, miben különböznek a egyes stratégiák, mi-
elott kiválaszthatná a megfe előt. így a megva ásítás részleteinek felfedésére kerül-
het sor, ezért a mintát csak akkor has náljuk, ha az ügyfelek szamára ti viselkedések
egkülönböz etése létfontosságú.
6. A Stroatégia és Környezet obJektumok közötti kommunikaciós többlet. A KonkrétStra-
téga osztályok ind használák a megoszto t Strategy felületet, függetlenül at ól,
#'"
hogy a általuk megvalósított algoril us egyszeru vagy összetett-e. Igy valószínű!
hogy egyes KonkrétStrategia objektumok az e felületen keresztül kapott információk
egy részet nem has nálják fel, sőt, a legegyszerubbek talán semmi sem haSZnoslta-
nak belőle E azt jelenti hogy a környezet időnként olyan paramétereket hoz létre
és lat el ke dőértékkel amelyek használatára soha nem kerul sor. Ha ilyen pro léma
mern] fel, szorosabb csatolásra van s ükség a Stratég.a és a Környe et köZött
7. Az objektumok nagy száma A stratégiák növelik az alkalmazás objektul ainak sza..
mat E a többlet eher néha csökkentheto, ha a strategiákat allapo. né küli objektu-
mokként valósítjuk meg amelyeket a környezetek megoszthatnak. A állapotot ek
kor a környezet tartja számon, és a Stratégia objektumokhoz iranyu ó kéreltnekben
ad' a áto A megosztot stra égiák nem sza ad, hogy a meghívások között aIlapo .ot tá-
roljanak. A pehelysúlyú eI\Tezési min a ismertetésé él (4. fe.ezet) részletesebben
tárgya tuk e meg özelítést.
108ft s
A megvalósí "as során a következőkre ke 1 ügyelnünk:
1. A S rat -gi és Környezet felületek meghatározása. A S ratégia és Környezet felületek
1a ékony ho áférést kell biztosítsanak a KonkrétStratégia objektumoknak bár 1ely
adathoz amelyre azoknak szükségük van a környe ettől, és viszont.
2. Stratégiák mint sablonparaméterek. A C++-ban a stratégiával endell{ez6 osz ályok
sablonokkal (template) álllthatók be. Ez a megoldás csak akkor kivitelezhető, ha (1)
a stratégia ford"'tash.or kiválaszthato és (2) futásid6ben nem kell megváltoz aln.
Ha ezek a feltételek fennállnak, a beállítando osztályt (például a Con text-et) sab
lonosztályként határozzuk meg, amelynek paraméte e egy Strategy osztály:
template <class AStrategy>
class Context {
void Operation() { theStrategy DoAlgorlthm(). }
/ I . . .
prlvate:
AStrategy theStrategy;
} i
3 5 fejezet · Vrselkedési minták
Az osztályt ezután peldányosításkor egy Strategy osztállyal állít.uk be:
class MyStrategy {
public:
void DoAlgorithm()i
} ..
Context<MyStrategy> aContext
...
Sablonok has nála a esetén nem kell elvont osztalyt meghatároznunk, ami aStrategy
felüle "é " írja le, emellett a St ra tegy sablonpara éterként való alkalm.a ása a · s lehe-
tövé teszi, hogy egy stra égiát s atikusan kössünk a környe etéhez, ami növelheti a ha-
tékonysága .
3 A Str, tégia obj.ektumok választh lóva tétele. A Környezet os tály egyszerCísítl1et6,
amennyiben van értelme annak, hogy ne legyen S ratégia objekruma Ekkor a Környe-
zet ll.ozzáférés előtt ellenórzi, hogy rende kezik e Stratégia objektummal; ha igen, a kö -
nyezet a szokásos módon 1asznála ba ves .) ha nem, az alapérteIme ett viselkedést kö-
vett. A megközelítés előnye, hogy az ügyfeleknek egyáltalán nem kell örődniük aStra
tegy o jektuI l0kkal kivéve ha nem tetszik nekik az alapértelmezett viselkedes.
Peld k
Itt a Feladat res ben bemu atott példa magasszintu kód.á adjuk meg, ami a InterViews
[LCI+92J Composition (Összetétel) és Compositor (Összeállító) osztályainak megvalósí ásán
alapul.
A Composition osztaly Component (Ele 1) példányok gy(íjteményét tartalmazza, amelyek
a dokulllentum s öveg- és grafil{Us eleme.t jelö ik A összetétel az elemobjektumokat egy,
a sortörő stra egiát egységbe záró Compositor alosztály példányának segítségevel sarokba
rendezi. Minden elemhez tartoz1k egy termeszetes vagy alapméret (natural size), egy nyújt-
hatóság. (stretchability) és egy zsuga ítha "óági (shrinkability) értek. A nyúj ha ósági érték
azt adja 1eg, hogy az összetevő az alaprnéretehez képest mennyire nő 1et meg, a zsugor..t-
hatósági érték pedig azt, hogy mennyit sugorodllat. Az összetétel átad.J. e eket az értéke {e
egy összeá ítónak, amely segítségükke 1egállapítja a sortörése' legkedvezőbb helyét.
class Cornposition {
public:
Composition(Compositor*) ·
void Repair() ..
private:
Compositor* _cornpositor,
Component* _components;
int _componentCount-
int _lineWidthj
int lineBreaks"
int lineCount;
/1 az elemek lis táj a
/1 az elemek szama
II az összetétel sorszelessége
II a sortöresek helye az
II elemekben
II a sarok száma
} I
Stratégia 323
Amikor csak új elrendezésre van szükség, az összetétel megkéri összeállí óját, hogy állapít-
sa meg a sortörések helyét. IIárom tömböt ad át neki, amelyek az elemek alapfi1éreteit, il-
letve nyújthatósági Cs zsugorí "hatósdgi értékeit tartalmazzák Emellett átadja az elemek szá-
má is, a sor szélességét, illetve még egy tömböt, amelyet a összeá lító a sortörések 11elyé
vel tö t majd fel. Az összeállító a sortörések kiszámított számát adja vissza.
A Composi tor felület lehetővé teszi az összetételnek hogy minden szükséges adatot átad-
jon az összeállítónak:
class Compositor {
public:
virtual int Compose(
Coord natural[], Coord stretch[] I Coord shrink[],
int componentCount l int lineWidth, int breaks[]
) = O;
protected:
Compositor() ;
} ;
Észrevehetjük, hogy a Compositor elvont osztály, amelynek konkrét alosztályai határoz-
zák meg a különböző sortörési stratégiákat.
Az összetétel Repair (Javít) műveletében 11ívja meg összeállítóját. A Repair először feltöl
ti a tömböket az elemek alaprnéret, nyújthatóság és zsugoríthatóság értékeivel (aminek
részleteit a rövidség kedvéért it ki11agyjuk), majd az összeállítótói elkéri a sortöréseket (a
'öréseket is mellőztük), végül azoknak megfelel6en elrendezi az elemeket:
void Composition: : Repair () {
Coord* natural;
Coord* stretchability,
Coord* shrinkability;
int componentCount;
int* breaks;
II a tömbök előkészítése a kívánt méretekkel
II · · ·
II a törések helyének megállapítása
int breakCount;
breakCount = compositor->Compose(
natural I stretchability, shrinkabilitYI
componentCount l lineWidth, breaks
) ;
II az elemek elhelyezése a töréseknek megfelelően
I / · · ·
}
32 5. fejezet · Viselkedési minták
Most vessünk egy pillantást a Cornpos i tor alosztá yaira. A SirnpleComposi tor CEgysze-
rűÖsszeállító) soronként megv"zsgálja az e emeket, hogy megállapítsa, hová kerüljenek
a törések:
class SimpleCompositor : public Compositor {
public:
SimpleCompositor() ;
...
virtual int Compose(
Coord natural[], Coord stretch[], Coord shrink[] I
int componentCount, int lineWidth, int breaks[]
) ;
I / . .
} ;
A TeXCompositor (TeXÖsszeá !ító) stratégiája általánosabb. Egyszerre egy hekezdéstvizs-
gál, figyelem11e véve az elelnel méretét és nYÚjtllatéJságát, emellett az elemek közötti
üresllelyek le11ető legkevesebbre CSCJk (entésével egyenletes nszínt' is próbál ad.ni a bekez-
désnek.
class TeXCompositor : public Compositor {
public:
TeXCompositor() ;
virtual int Compose(
Coord natural[], Coord stretch[JI Coord shrink[],
int componentCount, int lineWidth J int breaks[]
) ;
/ / . . .
} ;
Az ArrayComposi tor (TömbÖsszeállítÓ) az elemeket szabályos közönként sorokra tördeli.
class ArrayCompositor : public Compositor {
public:
ArrayCompositor{.nt intervaJ);
virtual int Compose(
Coord natural[], Coord stretch[], Coord shrink[],
int componentCount, int lineWidth, int breaks[]
) ;
I / · .
} ;
Stratégia 325
A fenti osztályok nem használnak fel minden információt, ami a Compose-ban (Összeállít)
kaptak. A SimpleComposi tor figyelmen kívül hagyja az összetevők nyújthatóságát, csak
alapszélességükkel számol. A TeXCompositor minden átadott ..nformációt hasznosít, az
ArrayCornpositor viszont mindent figyelmen kíVÜl hagy.
A Composition úgy példányosítható, hogy átadjuk neki a használni kívánt összeállítót:
Composition* quick = new Cornposition(new SimpleCompositor)j
Composition* slick = new Composition(new TeXCompositor);
Cornposition* iconic = new Composition(new ArrayCompositor(100));
A Composi tor :e1ületét gondosan ke 1 megtervezni, hogy minden elrendezési algoritmust
támogasson, amit csak az alosztályok megvalósíthatnak Ez azért fontos, mert nyilván nem
szeretnénk minden új alosztály létrehozásakor megváltoztatni a felületet} ami a meglevő al-
...
osztályok megváltoztatásá is maga után vonná. Altalánosságban azt mondhatjuk, a Straté-
gia és Környezet felüle "ek határozzák meg, hogy a tervezési minta 'lennyire éri el a célját.
Ism rt fe has n I sok
Mind az ET++ [WGM8S], mind az InterViews stratégiákat használ a fent leírt különböző SOf-
törési algoritmusok egységbe zárására4
A fordítói kódoptimalizáló RTL rendszerben OML92] stratégiák határozzák meg a különbö-
ző regiszterfoglalási sémáka (RegisterAllocator)} illetve utasításkészlet-ütemező irányelve-
ket CRISCscheduler, CISCscheduler). Ezze. az optimal'záló rugalmasabban alkalmazkodhat
a kü önféle számítógép-architek úrákl10z.
Az ET++ SwapsManager számítómotorkeretrendszer különböző pénzügyi eszközök árait
számí ja ki [EG92]. Ku1csfogalmai az Instrument (Eszköz) és a YieldCurve (Hozamgörbe).
Az egyes eszközöket az Instrument alosztályaiként valósították llleg. A YieldCuf\Te azoka
a ténye őket szárrútja ki, amelyek a jövőbeni pénzforgalom jelenlegi értél{ét ha ározzák
meg. Mind {ét osztály Stratégia osz ályokra ruház át bizonyos feladatoka . A keretrendszer
KonkrétStra égia osztályok családjával számítja ki a pénzá amlást, a devizaárfolyamokat, és
,..
a leszámítolási tényezőket. Uj számítómotorokat úgy készíthetünk, ha a Instrument és
YieldCurve osztályokat más KonkrétStratégia objektumokkal á lítjuk be. Ez a megközelítés
támogatja a meglevő Stratégia-megvalósítások keverését és illesztését, valamint újak meg-
ha ározását is
A Boach komponensek [BV90] a stratégiáka. sabJonargumentumként használák. A Boach
gyűjteményosztályok háromféle memóriafoglalási stratégiát támogatnak: kezelt (foglalás
gyűjtótárból), ellenőrzött Ca foglalást és felszabadítást zárak védik), illetve kezeletlen (szok-
ványos memóriafoglalás). A s ratégiát pé dányosításkor sablonargumentumként adjuk át
3 6 5. fejezet · Viselkedési minták
a gyííjteményosztálynak, a kezeletlen stratégiát alkalmazó UnboundedCol ectl0n (Ne.m
korlátosCy(fjtemény) példányosítása például az UnboundedC o II ee t i on <My 1 t em-
Type * I Unmanaged> formában történik.
A RApp rendszer integrált áramkörök elrendezését szolgálja [GA89, AG90]. A RApp-nak ke 1
lefektetnie és összekötnie az áramkör alrendszereit összekapcsoló ve7etékeket. A kapcso ó
algoritmusok az elvont Router osztály alos7tályai, amely maga egy stratégiaosztály.
A Borland ObjectWindows-a [Bor94] a párbeszédalJlakokban használ stratégiákat) annak el
lenőrzésére, hogy a fe11asználó érvényes adatokat adott-e meg. A számoknak például egy
meghatározott tartományban kell lenniük, a számbeviteli mezők ped+g csak számjegyeke . fo-
gadl1atnak el. Akarakterláncok érvényességének ellenőrzése táblázato keresést igényelhet
A:z ObjectWindows Validator (Érvényesítő) objektumokkal zárja egységlJe az érvényesítő
stratégiákat+ Az érvényesítők a stratégiaobjektumoknal{ felelnek meg. Az adatbeviteli me-
zők az érvényesítő sLratégiával egy választható Validator objektumot bíznak meg Az ügyfél
igényesetén érvényesítőket kapcsol a mezőkllÖZ (a válaszl1até) stratégia példája); amikor
pedig a párbeszédab akot bezárják, a lJeviteli mezők [elkérik érvényesítőiket az adatok el-
lenőrzésére A eggya {rabban előforduló ellenőrzésekhez a7 osztálykönyvtár biztosítja az
érvényesítőket, a számok esetében például a RangeValidatort (Tartományellen6rző). Új,
ügyfélfüggő érvényesítő stratégiákat is könnyen meghatározhatunk; ehllez elég a Validator
osztályból új a osztályokat származtatnunk.
apcsolódó min 'k
})ellelysúlYÚ: a stratégiaobjektumok általában jól illeszkednek a Pel1elysúlYÚ mintába.
Sablonfüggv ny 327
. I
f-- I I
.
Viselkedési osz "ályminta
C'I
Egy adott művelet algoritmusának vázát elkészíteni, amelynek egyes lépései' alosztályokra
"
ruházzuk áto Igy az alosztályok az algoritmus egyes lépéseit felülbíráihatják, anélkül, hogy
az a goritmus szerkezete módosulna.
Fel a
Vegyünk egy alkalmazás-keretrendszert, amelyben találunk egy Alkalmazás CApplication)
és egy Dokumentum CDocument) neVŰ osztályt. Az Alkalmazás osztály felel a "külsőJl for-
mátumban például fájlban - tároit dokumen urnak megnyitásáért, míg a Dokumentum
objektum a dokumentum adatait ábrázolja, miután kiolvastuk azokat a fájlból.
A keretrends7er segítségével épített alkalmazások egyedi igényeíknek megfelelően alosztályo-
kat s ármaztathatnak az Alkal azás és Dokumentum osztályokból. Egy rajzolóprogram példá-
ul meghatározhat egy RajzAlka1mazás CDrawApplication) és egy RajzDokumentum (Draw-
Document) nevű alosztályt, egy táblázatkezeló egy TáblázatKezelőAIkalmazás CSpread-
SheetApplication) és egy TáblázatKezelőDokumentum (SpreadSheetDocument) neVŰt, és így
tovább
dokum nromok
Dokum ntum
Alka/mazás
M ntO
MegnyItn
Bezárn
DoOJv st}
Ho ad Dokumentum()
fr.. gnyitDokumenbJm(]
DaLélrBhozDokumtmtum()
Kép8sMegnyítDokumentum()
K SZÜIMsgnyit[Jokumsntum{}
SajátO kum ntum
------ ....
SajátAlka mazás
DoOlvas()
DoLétrehozDo um ntum()
Képes MegnyitDokumentum( )
KéSZÜIMegnyitDokumentum{)
o ----...
rebJm new SajátDokumenbJm
Az elvont Alkalmazás osztály MegnyitDokumentum (OpenDocument) művelete határozza
meg a dokumentumok megnyitására és olvasására szolgáló algoritmust:
3 5. fejezet · Viselkedési mintak
void Application: :OpenDocument (const char* name) {
if (CanOpenDocument(name)) {
II a dokumentum nem nyitható meg
return;
}
Document* doc - DoCreateDocument();
if (doc) {
_docs->AddDocument(doc) ;
AboutToOpenDocument(doc) ;
doc->Open{);
doc>DoRead() ;
}
}
Az OpenDocument a doku entum megnyitásának minden lépését megl1atározza. Ellenőr-
zi hogy a dokumen um megnyitható-e, létrehozza az alkalmazásra ellem 6 Dokumen L1
objektumot, hozzáada a dokumen urnak ha ma áho , és kiolvassa a doku entumot
(Document) a fájlból.
Az ilyen muveleteke s blonfüggvényekne hívjuk. A sablonfüggvény elvont műveletekkel
határoz meg egy algoritmust, mely műveleteket az alos tá yok felülbíralják, hogy elérjék
a megfelelő vise kedést Az Alkalmazás alosz ályai az algofltmusnak a dokulTIenturn meg-
nyithatóságat ellenőrző (KépesMegnyitDoku 1enrum, CanOpenDocurnent), illetve a Doku-
mentum objek urnat létreho Ó (DoLétrehozDokumentufi1, DoCreateDocumen) lépéseit
ha ározzák meg, a DokumentulIl osztályok pedig a dokumentum olvasásara szolgálat
(DoOlvas, DoRead) A sablonfüggvény egy olyan műveletet is meghatároz, amely értesíti
az Alkal azás alosztályokat arról, hogy a dokumentum megnyitására kés ülünk (Kes ül-
MegnyitDokumen li , Abou ToOpenDocument), ha erre szükségük lenne.
Azzal, hogy az algoritmus egyes lépeseit elvont űveletekkel ha ározza fileg, a sablonfügg-
vény rögzíti azok sorrend.et, de megengedi az Alkalmazás és D okumentum alosztályok-
nak, hogy a lépéseke egyedi igényeikhez igazítsák
I
t s
A Sablonfüggvény tef\lezési minta alkalmazása az alábbi esetekben céls enI:
Egy algoritI us nem változó része.t egyszerre szeretnénk egvalósítani, míg a válto-
zó viselkedés megvalósítását az alosztályokra hagynánk.
Az alosztályok közös viselkedéset a kódke tőződés elkerulése végett közös ,?sztályban
kell ög lteni. ("Refactoring to generalize" , vagyis tú.raepl és az általánosltás érdeké
ben', lásd Opdyke és Jolmson [Oj93].) Eliliez elős ör meg kell keresnünk az eltérése
ket a meglevő kódban, ezeket új műveletekbe {eII11elyeznünk, végül az elté ő kódot
sablonfüggvennyel kell helyettesítünk, ami az új műveletek valamelyiké hívja meg.
s lonfüggvény 3 9
· Kézben szeretnénk tartani az alosztályol{ bővítCsét. Ha olyan sablonfüggvényt hatá-
"ozunk meg, ame y adott pontol{on "llorog t ' (11ook) műveleteke l1Ív meg (lásd a Kö-
vetkez énye (részt), a bővítéseket ezekre a pontokra ko látozhatjuk.
ElvontOszt ly
SablonFüggvény() o 1"-
AJ pMt1veJst1 fJ
AJapMúvelst2(}
/\
Konk étOsztá V
A apMtJvalet1 ()
A apMúvelet2()
...
....-----------
AJapMavelet1 (}
...
AlapMúvelet2()
. ..
R's O
· ElvontOsztáry (Alka mazás)
E vont alapművele eket 11atlroz meg, amelyeket, konkrét a osztál)rok felülírnak,
110gy megvalósítsák dZ aJgorit TIUS lépéseit
Sablonfüggvényt biztos"'t, amely megllatározza az algoritmus vázát. .L sablonfügg-
vény alapmúvcleteket és az ElvontOsztályban (AbstractClass) vab'Y más obJel{tu-
lTIokban megl1atározott műveleteket is meghív.
· KonkrétOsztály (SajátAJkalmd7ás)
- Megvalósítja az alapműve eteket, hogy végrella)t11assa az algoritmus alosztá yfüg
gő lépéseit.
Együttmu Ö s
· A KonkrétOsztály CConcreteClass) az ElvontOsztályra támaS7kodi]{, amely az a gorit-
mus ne} 1 változó lépéseit valósítja meg
ÖV mnyk
A sablonfüggvénye T alapvető fontosságúak a l<ód-újrahas nosílásban. Különösen fontos
szerepet töltenel{ be az oszlálykönYVLárakban, 11it,zen a könyvtár osz-ályana]{ közös visel
kedését h'vatottak leírn_o.
330 5. fejezet · Viselkedési minták
A sabl()]lfüggvényck all<almazása [Of(Jított vezérlési szerl<e7etet erdményez, all1.re id.é5nl{én.t
a ,J Jollyvvood elv" o.éven llivatk()7oak ("Ne hí\'j()n ]11il (et mi hívjuk magát.'J) I.Swe85]+
Ez arra ulaI, hogya SLli!éS ()sztály llívjd az alos7tály műveleteit, és nCln fOfclítva.
A sablonfüggvények az aláL1hi típusú mű\releteket llÍ\rják meg:
· konkrét Jnűvelctcl{ Ca KonkrétOsLtál}T()kcJn vagy 3.L iigyrélosztá.lyokon);
· }<OI1k -ét E.lvontOs7tály lnű\Jelelek (a7011 tnűveletek, al11elyek állaJán.osságban 11asz-
nosak az alc)sztályok sLámára);
· dlapm(ívclelek (vagy._s az elvont műveletek);
· gyártó .ugh:rvények (lásd a Gyártófüggvény mintát a 3. fcjezetlJen); és
· ho ogműveletek (e7ek b"ztosítják az alapéltelmczen viselkedést, amelyet aL alosztály-
ol( .gényeil<nel( mcgfclel(5en killővítllelnek; a 11orogrTIíívelet alapértclme7és szerinl
g)7a]{ran semmil nem csiná.!).
Lényegef" ]lOgy a sablonfüggv-rénycl( megllatározz3.1, mely művejetek horgok (ezek esetlep,
felÜlbírállatok), é melyek elvont műveletek (ezeket felül kell bírálni). Ahhoz, hogy egy al-
osztály kés7ítője hatékonyan használhasson fel egy elvont oS7tályt, tudn'a kell, 1l1ely műve-
lelel{et kell felülírnia.
A7 dlosztályok Ú1:,7 bővíthetik ki a szülő egy műve1etének viselkedését, hogy felülírják
a TTIűvelLtLl J és kifejezetten Inegl1Ívják aszülőműveletet:
void DerivedClass: :Operatjon () {
ParentClass: :Operation();
1/ a DerivedClass bővitett művelete
}
Sajnos az ()fc)kö]t művelet megJlfvásáról k()nn)TŰ mcgfcledl{e7ni, cle egy ilyen. n1űvelelel
t,ablc)nfiiggvénnyé is alakítl13.tunk, 110gy a szülő fclührye1Jlessc, llob'Yan l")ővítik ki al osztá-
lyai. A megoldás lényege, hogy a szülő oztály sablonfüggv[nyébőllTIcghívunk egy horoh-
rnű.veletet, am.clyel -l7tán az a.losLlályc)k felülbírálllalnak:
void ParentClass::Operation () {
II a ParentClass viselkedése
I-IookOperation ( ) ;
}
A HookOperation (Hor()gMűvelet) selllrnil neJll csinál a szülő osztályban:
void ParentClass::HookOperation () { }
Sablonfüggveny 331
Az alosztáJyok viszont ci HookOperat ion-l [elülírva l{ilJővÍtik annak visclke(iését:
void DeriveoCldss: : HookOperation () {
/ / a gyá rrnaztatott ostj 1 y bőví tése
}
Megvalósítás
Három (Jo1gat fontos megemJítenijnl<:
1. A C++ Jlozzájetés-tJczérlésérzek lzasZ11á1at{l. A C++-11an a sa.blonftiggvél1yel( által
meghívott alapműveletekct védett tagok (ént is bevezethctjÜk, így blztosthatjukJ
Il()É:,7 csa]{ 3. sablonfLiggg\Tény l1Ívl13t,sa meg azol(3l. A kötelezóerl iell.ilírandó alap-
műveleteket tisztán virtuálisként adjuk Ineg. Magát a sablonfügg\rényt nCIll sza11ad
felü llrni, így az nem \'irtllá1 is ta.gfiiggvény lesz.
2. Az alap111iJveletek SzállIának a leflet61egkiscbbr"e c\-ökke.'ltése. A sablontüggvén)Tek
írásánaJ( egyi ( fontos célja az alosLtál)T(Jk átal 3.2 algoritnlus l11egvalósításál1.0Z kötc-
lezően fclülírantiéJ aJapJTIűvcletck szárnának csökkentése. Minél lej 11 11 m(ívelctet kell
fcltilllírálni, anná.l több a£ Ü fWfelel{ ffillnl{ája.
3. Az elnel)ezésí rerld\-zer+ A fcliilíran(Jó mŰv"cleteket 1«)o.l1ycn aZ(Jnc)síth.atjtllc, 11é1 ne-
vük elé ValaJll.iJyen közös el()tagot tesziink A Macintosll all(almaZ2.sok MacApll ke-
retrendSLcre lApp891 péJdá,lll a sal11onfLiggvén)Tel{ neve elé a ,Do' eJőtagot llelyezi
(DoCrcate])ocunlent, DoRead. sti).).
éld kód
A7 alál1b' c++ péld.a azt 111.utatja, llog}Tan ](é .1.yszcrítllet egy szülő osztály egy 'n\Tariánst (ál-
landó állítást) alosztál)T3.ira. A példa forrása a eXT AppKit [Ad.(i94.1. \T eg )lÜ11k egy View
(Né7et) neVŰ oSLtályl, arnelynel( segítségével a képLfl1YC)re r.j20111atLlnl( A View raglsl]«)-
d.il{ 3.l1110Z, llC)gy alosztál)'ai csal{ a7után l(cz(ll-lessék lJ1.eg a rajz()] {1St, l10gy az al)]lJ{ Cv'ew)
l11cgI(aJ1ta a fól{uszt. Ez lJi7on.yos megjelenési tulajclonságc}lc (színel{ bctCítípusol() n1egfcle-
ló álla })otueálJítását \Tonj a l11aga után.
A lleállításokat a Display CMegjele]lÍt) salllonfüggvényre lJíZZllk. A View l{ét konkrét rnűve-
lctct llatároz 111eg: a Se L:Focus (J3e311ítFóklJ.s) L)eállítjl, a ResetFocu s (Viss7aál ítFókusz)
ped.ig lc)rli ci rajzolát,i álIapotot+ A tén)lleges rajzolást a view DoDisplay 1()fOg111ŰV<.:lLtC vég-
7j. A Display a DoDisplay e]é5tt megllívja a SetFocus-t, ll(}bry lleállítsa aL állapotot, a vé-
gén peLiig m.egl1ívja i ResetFocusl-t, 11(}gy vlsszaállj()n a7 eredet' llclyzet.
void View::Display () {
SetFocus();
DoDj splay ( ) i
ResetFocus() ;
}
33 5 fejezet Vis Ikedesi minták
A7 invariáns fenntartásához a View ügyfelei mindig a Display-t h'vJák. a osztáyai pedig
a DoDisplayt írják felül.
A DoDisplay a View-ban semmit nem csinJI:
void View: : DoDisplay () { }
A7 alosztályok e művelet felülírásávallatá.ozzák meg egyedi rajzoló műveletÜket:
void MyView: : DoD:.splay () {
II az ablak tartalmának megjeleni tése
}
Ism rt f Ih s nal"s k
A sablonfüggvények alapvető jelentőségét mutatja, hogy sz"nte minden elvont oSLtá yban
megtalálhatók. Wir s-B ock és s erzőtársai lWBWW90, WBJ90] remek átLe 7intét nyújtanak
d sab onlüggvényekről
" P solodó minták
A sablonfüggvények gyakran támaszkodnak a Gyártófüggvény mintá a. A Feladat részben
szereplő DoCreateDocument, amelyet az O enDocument sablonfüggvény h''v meg, 's
gyártófüggvény.
A sablonfüggvényck örö': és révén változtatják az algaritnus egyes részeit, a Stratégia min-
tában átruházás révén a tdjes algoritmust kicseré 1 etjük.
Látogato 333
v. selked.és o o bO el{tumminta
I
Egy objektumszerl{ezet elemein vébrehajtan o múveletet ábrá ülni: a Látogató mint. segít-
ségével anelkül haláro7halunk llleg egy uj művelete., 10gya enne rés l vevő elemek osz-
tályat meg kellene vál oztatnunk.
Fid t
Vegyünk egy fo d.ítóprogra 10t, ami a prog dmokat e von szintaxis :Jkként ábrázolja. Eze
ken "statil{us jelentésLlem é5 n műve eteket kell vége lOe, peldául ellenőri nie kell, 10gy
minden válto ót meghataroztunk eJ emeile t pedig kó ot is e 6 kell állltania. Ennek negfe
le ően szükségünk lesz ípusellenő ző, <óda tmali Jló, ve e léselem ó mCíveletek e,
olyan a, ami ellen6rz., hogy 1asználatba vé .el e őtt adtunk e értekel a valta óknal{, es így
tovJbb. A7 e vont szintaxisfát ezenk"VÜI hasz ál1atnánk formá ott k....ratásra, program-újra-
szerveLés +e, kód-előállításra és különfé e, a proörammal {apcsolatos s ám....tlsokra lS
Az említett művelete legtö Jbjéne;r más (éppen kel] '""ezeI ..e azokat a csomópa tokat,
amelyek értéka ó utasításokat elölnek, mint azokat, amelyek válo ókat vagy matematil<a o
l<ifejezéseket ábrazolnak. E ér külön osz ályunk les a értéka ása 10 egy 1ási"- a vá -
tozók eléréséhe , egy harmadik a matema "ikai kfeoezése (11eL, (5 íöY tovább. A csomópont-
os tályok 11almaza termeszelesen a alkalmazott ro ramozási nye 'vtől függ, de e kü-
lönböz 1et jelentőt,en.
CSD opont
Tr usE1fsn6riz()
16á1l 6d(}
Formázv Ja'rf}
!\ - --
-
V Itoz6H'"vCsam6pon É kadásCsom6pon
TIpus Ellenóriz{) TIp us EU enori2()
Elo Ilf KÓd(} Eh5 á UtK6d()
FormázvaKifr() Fo rmázvaKifr{)
A fenti diahram a Csomópont (Node) osztályl 'erarcl1ia ehY észé llluta ja. A gond itt a7,
10gy az e llí ett múveletek külön -éle csomopont-osztályol{ba való e oztása révén egy
334 5. fejezet Viselkedési minták
olyan relldszer áll elő, 3.lncl)7 ne}lezen átlát]lató, nelll.Zen J{arbanLlrl.Jlató, és mé)dosítá.sa .s
fáradságos. Zavaró, hogya típusellenőrzé5 kód keveredik a formá7ó vagy a ve7érlésclemz6
kóddal, arról nem is beszélve, hogy egy új művelet hOLzáadása valós7ínűleg az ÖSS7es OSL-
tály újraford.ítdsát igényli. jc)111) lenne, lIa a7 új rn(Íve etel(et l(ülön \Te11etnénk fe], 3. csomé)-
pont-osztályok pedig fl1ggetlenek len.néncl a7 {51,et llasználó művclelektől.
Mindkcltő elérhető, ha a7 osztályokban található rokon műveleteket önálló objelnumba, úgy-
nevezett látogatóba cSOlnagoljuk, majd ezt adjuk át az elvont sz'ntaxisFa eleneinek bejárás
köz11en. Amik()f egy cleln "fogadja" (a.ccept) a Iátog'alót, ]{érelmet ki.l1d annak, all1i aL ad.cJtt
eleiTI oS7tálY-l.t tartalmazzal illetve magat az elemet mint argullcntumot. A látogatÓ ezután
végrehajtja az elemne <: nlegfelelő lnúveletet, alni korábban az elem osztályában szerepelt.
Például egy fÓrdítóprogram, alnely nem használlátogatókat l .it TípusEl enőri7 (TypeCheck)
ml'ívdetet a7 elvont s7mtax"sf;'ira meghívva végezhet típuse lenőrzést eh7 eljáráson. Fkkor
minden csomÓpont megvalÓsítja, TpusFIIenőriL műveletet, azzal, hogy meghívja azt a cso-
mópont elemeire (lásd az előző os 7 tálydiagramot) . J la a fordítÓ a típusdlen6rzést l[logatók se-
gítségével VégLi l létrehoz eh'Y 'npusElknőr7őI.átogató O'ypeChcckingVisitor) obj ektu 111ot, LS
a7t argumentLlo1]{éntllas7ná]vJ. a togad. (Acccpt) m(íveletct llÍvja meg az elvont szinlaxisfára.
Ennél a megoldásnál a csomópontok a látogató visszahívásával a Fogad nűveletet valósítják
meg: az értékadó (assignment) csomÓpontok a LátogatÉrtékad.ás (VisitAssignment), a Válto7Ó-
hivatko7ások a LátogatVálto7ÓTIivatkozás (VisitVariableRefe .encc) művelet meghívásával.
A korábban a7 FrtékadásCsomópont (AssignmentNode) osztály ban levő TípusFl1enőriz műve-
let ígya"] JlIsEllené5rzőIJ5togatóra nlegl1ÍvotL Látc)gatE tél(3(J.ás 111űvclelles7.
AhI OL, hogya l-ltogatókkal ne csupán típuse]]enőrzést vége7hessünk, s7Ükségünk lesz az
elvont sz'ntaxisfa összes látogatójának elvont szÜlő osztályára (CsomópontlátogatÓ,
Nod.eVisitor), 3.1nelynek minden csomópont osztály szán ára be kell vLzetnie egy művele-
tet. Egy programméret.ckcl kis7áJ11ító alkalmazás ezután a CSOlTIóp()ntI átogató11é)1 származ-
tatl at új alosztályokat, nem lesz többé s7ükség a csomópont osztályokban alkal1nazásfÜggő
kódra. A Látogató mmta .a programfordítási lépések művelete ot a nekik megfelelő Látogató
()lljektlllnba zárja.
Csom6pontLátogató
LátogatÉrtékadás(ÉrtékadásCsom6pontj
Látog tVált0z6Hiv(Váft0z6HivCsom6pont)
/\
TI usEllenolZoLátogató
K6dElóáUftóLátoga Ó
LátDgatÉrtékadás{rtékadásCsom6pont)
LátogatV I oz6Hiv(Változ6HivCsom6pont)
látogatrtékadás{ÉrtékadásCsDm6pont)
látogatVálto 6 H iv{Vá[toz6HivCsomo pont)
Latogató 335
rogram <> _ J Csomópont
.....- ...,
Fogad{CsomópontLátogatój
/\
ErtékadásCsomópont Válto óHivCsomó ont
Fogad(Csomópontlátogat6 v) o ogad(Csom6pontlátogat6 v) o
I I
T I
v- > Látogatrtékadás(th is)
v> látog atVáltoz6Hiv(this)
A Látogató mintában két usztályllierarclliát a]akftllJl}< ki: egyet az elelTIcJc szá.m3.ra, a.melye-
ken nl(Íve]eteJzet \légzünl< (Csomópont J1icra 4cI1'a.) és eg)' másikat az elenlelcen vég reJl aj-
tandó műveleteket megl1atároLó látobatók számára (Csomó!10ntI átogató 11iera.rcllj3.) (Jj
művelelet a lálogaté) osztál)711ierarcllia új alosztáll)ral való bővÍtesé\lcl llatározI"lalllnl< meg.
Al11íg a fo dító által elfogadott n)lelvtan nCI11 váll()zik Cvagyis lrníg D.eJl1 kell (lj Csomópont
alosztályokal fc!'vennünk), a7 új sz()lgáltatás()k l1eépítésé lez elég (lj CSOI11ópontLátogat() 31-
osztályokat létre110znunk
Al alm zh tóság
A át()glt{) terve és lninta alkalrnazása a követl(Lző esctcl<ben céls£erű:
Ebry ad.c)lt ()11jektumszerkezet szárTIos különböző felületű osztályt larlalJllaz, és e7e-
l(en az olJjcktllffiokon olyan m(íveleteket szeretJ1énJ: végezn+, amclycl( a l{onl<'fét
()sztályc)l<lé)l fuggnek.
· [gy objektllffiszerkezet objektumain több önálló: eh7nlással n.em ro](on lnűveletct
kell \régrellajtallunk, és nenl a](arjuk az osztá.lyul(lt "bcszennyezni' e l11űve eteJ<J<el
A átogató minta segítségével a rol{on 111ŰVLlcle!<: egYlilt lartJlatók, 11a l{özös osztály-
ban 11ttáfozzuk 01 eg 37()kat. TTl egy ol)je]<tulllszerkezetct több alkalmazás k()z()sen
11asznáJ, mi11dig érde111es a műveleteket a Látogat() mintával a7 őket té 1ylegesen
igé IlY 1 Ő all(all11azásokL)l helyezn i.
Az ad.c)ll ()11Je}<tuITIS7erkezetet Dlegl1a.tározó osztályok ritl{án váll()7Jla]<, d.e új J11ŰVe-
1etekre gY3.l<ran van szül(ség. Az emlílett osztályok Jnegvá]toztatása az összes lá.loga-
tó felületének mód.osítás{ll igényl i, aJJ1.i valószítl(leg l{öltségcs. Hd ezen ()szlály()k
gyakran változnal(, érdclncsebb l m(ÍveleleJ<et lleJéjü ( Ile _yezni.
,
336 5. fejezet · Viserkedesi minták
Set
.""'.-.."..I. "1.'1""1.. J' ............ ....... '1
J r \t« :{ L .ow ... .".' ... .".' ... .".' n.... ....._II..._I._I..,_.._...I...n.. ... ... ..W ... o.,.".... ..... ....._..-&;:.1.'1 L áto nat6
; ., J,'.n° .f 1 ......'.. 011'
:
-. ...........-......- .-1-......-1-.1-.........1-...;,
I L togatKonkrétEI mA(KonkrBtE/emA)
I
j LátogatKonkrétE/emB(KonkrétElemB)
A
KonkrétLáto a 61
I
KonkrétLátogat62
LátogatKonkrétElomA(KDnkrétElemA)
L togatKonkrétElemB(KonkrétElemB)
LátogatKonkr tElemA(KonkrétElemA)
LátogatKonkrétElemB(KonkrátE[emB)
I o
. ......-..-.........-1..........-.. ....:..'1..
Obj ktumSzerkezet - - m
- --
Fogad,L togat6)
A
i - j
.-.
'\onkr tE amA KonkrétEJemB
Fogad(Látogató v) <? Fogad(látogató v] ct
Ml1veletA() Ml1velet () r
. t
4 I
I v>látOtkrétElamA(1hiS) :
v->KOnkrétEIBthjS) '1
,
es v
Latogató (Csomó ontlátogató)
- Az objel<tumszerkezet lninden Kan {rétEI em (ConcreteElement) osztálya számára
bevezet egy-egy Látogat (Visit) műveletet, A művelet neve és aláírása azonosítja
a Látogat kérelmet küldő osztályt, így a látogató megállapíthatja a meglátogatott
elem konkrét osztályát. E után a átOgdtó a7 elemet özvetenül a megfele ő f"elü-
eten keres7tül érheti el,
· KonkretLátogató (TípusEllen6rzőLátogató)
- Megvalósílja a Látogató (V.sitor) állal bevezete t műveleteket. Min en múvelet az
algoritmllsn.ak a megfe elő osztályú objektum számá oa megI1atá azott rcszét való-
sítja .. eg. A Konl{fétLátogató (ConcreteVjsito") b+ztc)sítja az algoritmus környeze-
tét, és tárolja ano.lk helyi á lapotát. Gyakran e7 az állapot hryűjt' a bejárás soran
összegYŰjtött eredményeket.
látogató 337
· Elem (CS01TIÓpont)
-. Meg1131ároz egy Fogad (Accept) műveletet, amelynel{ argumentuma egy látogató
Kan krétElem (ÉrtékadásCsomópont ) Vál tozóHi vCsomóp ont)
- Megvalósít egy Fogad műveletet, ame ynek argumentuma egy l(togató
Db je ktum Szerkezet ep rogram)
- Fel tudja soro ni az elemeit.
Magasszintű felü]etet biztostlla , amelynek révén a látogató meglátogat 1atJa az
objektumszerkezet elemei.
- Lehet összetétel (1á<.;d az Összetétel tervezés' mintát a 4. fejezetben) vagy gyűjte-
mény, például lista vagy ha maZ.
E
m
ödes
..
A Látogató m"ntát alka mazó ügyre nek ]étre .7elllloznia egy Konkrétlátogató objek-
tumot, majd a látogatóval m. nden elemet végiglálogalva be kell jarnia a objektum-
szerkezetet
A1niko egy e emllez látogató ér ""ezik, az elem megl1ívja az osztályának megfele ő
Látogató műveletet, és átadja ma.gát argumentumként, l10gy a látogató megisme 11es
se állapotát, ha szükséges.
Az alábbi együttműködési diagram egy objektumszerl<ezet, egy látogató, valamint
]{ét elem egyiittlnűködés(l mutatja:
e yObjektumSz rk e gy ,onkr tiernA
egyK nkr t lemB
gyKonkrétLátogat6
Fogad (egyLátogat6)
LátogatKonkrétBemA(egyKonkrétElemA)
MGve[etA()
Fogad(egyLátogat6)
Lá ogatKonkrétElemB(egyKonkrét iemB)
Ml1velotB()
338 5. fejezet · Viselkedési minták
Köve ke mények
A.. L.át()gató 111inta el{5n)rei és 118.tr1.ny.ai lc)l)l-Jek ]<özött a kü'vell{elé5k
1. lv[cgkötzrzyíli lj In11/;eletck flOZzátidáscít. J.\ ]á.tog].lók meg]{()tlnyft'}.,- :lZ Ol)Iin ]llű\reJc-
lel{ ll()zzáadisát., alnelyel{ ()SSletctt ()}JjCktll nlok ele111eitűl függJle k. Az o1Jjeklll m-
szerl<ezet ti j mű,/'elettel va.l() L1Őv'Ítésé l1e7 igy'" <.:lég, lIa Ú j látoga.tót !(észítü n 1<.
Ha a sz()lgáltatásokat löi)IJ ()sztá]),IJan sz()rnánk: szét, ílj mCí\-'clet fel\JéteJéllcz az
ÖSS7:es (Jszt5.1}/t mlg kellen.e vá.ltoztatnlink.
2. A lát()l.f.JtIIÓ összcl!j}11jti ti rOkOtl tnilvelet(!I?et, és elválaszja a kajJcso!ntbafl ne111 álló-
kat. A f()kon szolgáltalás()l< n.crn az uL)jektuf11szerJ<ezctC:llnegl1atározó oszlál)Iol<11aIl
()szlanak el; egy látc)gató g)l(íjli össze 17()](3t. A l{iIJCSC)]alllln f1ertl .lló 111űveletel( 53.-
j5.tlátc)gató a losztál )/aikt)3 Il k:a pt131{ IlLI }'el. Ez a ren(lszer egy.szerűsftl mind aL elcll1e
1{et leíró osztdl)T()J<lt, l11ind a látcJgaté)]<11al1 l11cglla tárc)z()tt 3.lgoritmus()klt+ A látoga.-
t.ókb-in l1árl11j l)lcn algorilm Ll sfi..i ggő 3.cla.tszerkezet el rejt.1:1ct(j.
j. (jj Konkré/Elem osztályt nehéz hozzáadni. A Látogató minta megnehezíti az Elemből új
a.loszt{ll\,()]( szárlI13Ltalását. rv itl(ieo új KonkrétEleJll (lj el\-Tont m(fv 7 eletet von. 1nlga lllán
a ..átog3.t(íl).lnt illet\le eze}<- fl1cgv'alósítását a KonJ(rétL3.toglt{) ()sztál}ToJ<lJa.n. Egyes ese-
tekben a 1 átogaté) osz1ftly alapérteltllezett Irlcgvllé)sítást n.y(ljtllal, éllllel)let a I<OI11(f{l-
Iálogat()l{ tölJDsége ()fc)]{()111et, clc ez inkál)l) kivételnck, lllintsem s7alJ:1.l)lnak számÍt+
A fentiek miltt a Látogató miTlta 1]l(alJl1.3.zá-sánal( !-(lllcsf()otoSSJ.gú kéru.ése, 110g)T 3.Z
()11jektl11llszerkezetlleJ1 11aszn[tll alg()ritllllJS 111Óliosít.áa \11Ié)S7ínű111J-c, \/ílg.y a szer-
kezetet fe léJ1Íté5 ()11jektllmosztály()ké A.I11en.n)1i1Jen g}'al<ran "\rCS2lI0.k fel II j Kon}{rét-
EleJ11 ()S7tá 1')TOlta.t, i Lá l()glté) osztál)'11ilrar(1'1 ia fetlO ta. 11.sa nclléz7é vál1:13.t. llyen eset-
lJen \'llószín(íleg egysze ':íbb, lIa cSlk: a s7.erl(<:zelel llk()té) oS2tál)lokbln Jlatározzul'-.
meg a 111(j\re] etcI\.ct I-fl lis7on.t az Elclll ()slá ly11 i erarellia. slal)] 1 (ie a program()t
ren.dszcrescn 11{Svítjii!{ (lj l11fíveletekkel, v:agy gY3.kran Ill{>d()sftjllk 3.Z aJg()rilnlusok3t.
3. L5.t(Jgat() mirlta JCJ szolgállt()t te11et a v"áJtuzás()k keze1ésé1Jcn.
1. A ltltoga/iis átÍlJellzl!t (/Z osztálj)/liertlrclliúkol1. Abejárók (l£ls{i :1 1cj3.ró lninláL a fejezct
korábbi rés7ében) is megláLogathatják egy szerkezet objektumail, mikÖ7ben bejárják
aZ()k:1t ]11(Í\rc]cteik 111egl11vás3.\ra.l, ue külön11()7{S típusú clemekl)c51 álló {)1JjcktllI11szer-
](c:oz<:tcken nern Í\'elll.etnek keresztül. A fejezctben ]«()rá111JaIl l)elllllt-il()tl Tterator (Bejf"t-
ró) f-el(i]et pé]cláll1 csak lZ Item CElLIn) lí)usú ()lJjektulIlOI(al kél1es elérl1.i:
template<class Item>
class ILerCJtor {
/ / 4 4 .
Ttcrn Currer1t I LerLí ( ) const i
} i
F7 a l<ócl azl jelenti, 11(Jgy :1 bcjáré) kizárólag Ol)/íln e]ell1ek.:et ]átogalllll meg, ltJ.lel)'ck
sziiié5je 3.2 1 Lern ()szlá]')r. A L<1.tugal() mintá11ln il)'en korlát()zás ni11cs. Bárlllil}len SZl.1-
lő\7cl rencJ.elke7{S o1)jel(tlJrn()1\: 111eglátogat.ll.3.t.()lc (5 l Látogató felllletel<I-1ez lJárl:llilyen
lí pusú o11jel(tum ] 1()zzáad.J1at().
class Visitor" {
public:
/ I . .
Látogató 339
void VisitMy1ype(MyType*) i
void Visi tYourJrype (YourType*) ;
} ;
A fent'_ kódban }Jéldául a MyType (EnyéIllTípus) és a YourType (TiéülípllS) egyáJ-
talán nell1 kell, ]lC)gy örö](]és révén rokonsábban álljanak.
5. Az állapot tá1"ollzató. A Iátogat(Jk össi:eg)rCíjt}letik az álla.potinfoflnációkat, all()gy a7
objektulllSLcrkezetben végjglátogatják 3.2 elelnel(et. Látogató né l<ű] a7 állapot ot
a lJejárást végző műveletnel{ l(icgésLíto argumeI1tumlzént adn.ánl{ át, esetleg erre
a célr3 globális változó!(at llasználnánk
6. ivJegsénlleti az eg,vségbe zárás/o A Látogat.ó n1inl1 által al]<alJl1.azott Jnegközclítés fLl=
tételezi l10gy 3.I(onkrétElem í'ellilet eJég "erős" a Ih oz, 110g)! a látogatók mUl1káját tá-
mogassa. E1111é5l kc)vetl{ezil{, 110gy a minta gyakran arra kénys7erít, h.ogy olY;;ln 11yil-
vánas 111űvcl<:tcl(ct adjunl{ Illeg, amelyel{ 1102Zá -'érnel( egy elem belső állapcJtáll()7,
ami lnegsértlleti a7 egységbe zárás el\Tet.
Magv OSI as
Minden obje}.clU.l11SZerke7etl1e7 tartoziJ{ egy l(apcsolóló Látogató oS7tály. fz az elvont osztály
l s7erke7etet felépítő va.lal11ennyi KonkrétE.1em ()sztály Szál11ár3. IJevezet ef,y-egy látc)gat-
Konl{rétElel11 (VisitConcreleElemenl) Jl1űveJetet. A Látogató mind.cn Lát()gat (Visit) művelete
a.r b TL1111entl1mkén.t egy adott !(onl(rélElelllet ad meg, íg)l a látogató 3. konkrét elemek felülelét
l{özvetlcnül elérllcti. A KonkrétLálogal{) oS7tályo]{ a Látogat n1űvclelek felülbírálásával való-
sítják meg a nekil{ megfelelő KonkrétElem oSLtálY(Jk lálC)gatófüggő vjselkecléset.
A LálogatéJ (Visit()r) ()s7:tályt a C++-ban a l(övctl(zőképpen ve7etlletjük Ile:
class VJ8itor {
public:
virtual void VisitElementA(ElementA*);
vjrtual void visithlementB(ElementB*);
/1 és igy tovább
protecled:
V' si tor ( ) ;
a többi konkrét elem esetében is
} ;
Minden KonkrétElem oSLtály megvaléJsÍt egy Accept (Fogad) múvclctel, amely a7 osztáJy-
,.,
110Z tartozó lálogaléJ megfelelő Vi sit.. . . (Látogal...) műve1etét hívja J)1.eg Igy az 110gy
melyik les7 a meg]1í,'ott múvelc.:t, lnind az eleIn, mine1 a látogató osztál)'ától függ. ID
10 f- 3 tüggv6nytúlterllelésl all{alnlaZnánk a nlűvclctcknck llgY8nazt az eg-yszeru ne"vet Cp]. Vis i t) aclhatn.ánl<-, TDi-
,'el a7 átad()lt )aralnéter kellőképIJen nlegkülönl1öztcti (jkLt. F olcg{)I{lás D1ellett és ellen egyaránt szólnak érvek.
A lÚllerllelés eg)rreS7l megcr()sfti 110gy a lllűvelelek valójálJan ugyanazt a7 clcn1zéLt végzjl<-, csak m;]-lnás argll-
lnenlllnllllal, nlárés7t \' is' ()ot 110ill{t lyosabbá leheti a kódot ()Jvas{) si'ámára, l1<)gy Ini is törLénik a hívás helyén.
A dijntést csak 'lZ befol}rásolja hogy j]taJál"'Jan jó IDegoldásnak tartjuk-e a függvényt-tlltcrhclést) vahr seJTI.
340 5. fejezet · Viselkedési minták
A konkrét eletneket a7 alál)bi mé)don vezetjük be:
class Element {
public:
virtual Elcment();
virtual void Accept(Vjsitor&) - O;
protected:
"Rlcment() ;
} ;
class ElementA : public Element {
plJbl ic:
ElcmentA();
virtual void A.ccept(Vlsitor& v} { v.VisitElementA(th.is); }
} ;
el d.SS ElementJ:3 : publ ic Element {
public.
ElementB{);
virtua] void Accept(Visitor& v) { v.V.sitlementB(this). }
} ;
Egy CornposileElement (Öss7:etettElem) oS7.tály az Accept műveletet a követke7őkép-
l)en ,ralósÍtaná meg:
class CompositeElement : public Rlement {
pubJic:
virtual void Accept(Visitor&);
private:
List<Elemcnt*>* _children;
} j
vo.d CompositoElement::Accept (Visitor& v) {
Listlterator<Element*> i(_children);
for (i. l' j r s t ( ) i !'. 1 sDone (); i. Next ( )) {
1.CurrentJtem()->Accept(v);
}
v.VisitCompositeElement{this)i
}
A Látogató l11inta al](alI11azásakor két továbhi megvalósílási kérdéssell(ell foglalkc)lnunl(:
1. Kettős közvetítés. A Látogató minta végeredményben azt teszi lehetővé, hOb')' az osztá-
lyokhoz azok megváltoztatása nélkül adhassunk új műveleteket. A minta ehhez az úh'Y-
neve.lell kettős közvetítés Cdouble-dispatch) megoldást használja. E7 jól ismert eljárás, né-
Látogató 3 1
1ány programozási nyelv ( éldául a C OS) l{özvetlenül támogatja. A C++, a Sllldlltalk és
lnás hasonló nyelvek az egys eres közvetítést (s.ng e-dispatc11) a 7almazzá
.
Az egyszeres l{özvetítésű nyelvekben két té 1yező határa za meg, mely
k művelet tcl-
jesít egy adott .kérést: a kérelem neve és a fogadá típusa. Az például, hah')' eh'Y
ElőállítKód (GenerateCode) kérelem melyik n1űveletet l1ívja me b , attól függ, milyen tí-
pusú 3 c....mzett csomóponl olljel-ctum. A C++-ban a GenerateCode megllívása ehY
VariableRefNode (Vá tozóH
vCsomópont) pé ányra a VariableRefNode: : Ge-
nerateCod.e 1Ívást eredményezi (ami egyvá tozóllivatkozás számára állít elo kódot),
11a pedig egy AssignmentNode-ra (ErtekadásCsomópon ) hívju ;o' llleg, az eredmény
az AssignmenLNode: : GeneraleCode lesz (ezzel egy értékadás kódjá állít.uk elő).
A vegrel1ajtott művelet a kére]em 2.jtájától es a fogadá típusától is függ.
A kettős kö7vetÍtés mindössze annyit jelenl, J10gy a végrellajtott művelet a kérelem
fajtája mellet - két fogac ó r'pusától függ4 Az Accept kettős közvetítésű művelet, jelen-
tése kél típustól, a látogatóétol és az elemété51 függoen változil{
A kettős közvet"tés
révén a látogatók különl1öző műveleteket l{érllelnek minden elelllosztályra.. )1
Ez a Látogató minta kulcsa: a végrehajtott műve]et m.nd a látogató, 1ind a megláto-
gatott elem tílJUsától függ. A műve eteket ne TI szer {csztjük l1e statil{usan az Elem fe---
lüle be, 11anenl a Látogatóba llelyezzük a okat, és az Accept 11asználatával [utásidő-
ben hozzuk létre a kötést. ígYAZ EleID felület bóví ése csupán egyetlen új Látogató
alosztály létrel ozá
ával jár, nem pedig számos Elem alos7tály meghatározásával.
? Ki felel az objektumszerkezet bejár'ásáél1? A látogatónak végig kell járn._a az objek
tumszerkezet valamennyi elemét. A kérdés csak az, logyan ér' ezt el? A bejárás fel-
adatát három l1elyen he yez11Lljük e : dZ objel<lumszerkezetbco,
látogatóban, illet-
ve egy önálló bejáró objektumban (lásd a Bejáró ref\Te7ési mjntát).
Gyakra.n az objektumszerkezLt felel a bejárásért
[gy gyűjtelnény például egyszeru-
en a Fogad művelet többszörj megl1.ívásával +árja végig az elem.eit. Az összetételek
bejárása során a Fogad .smétlődő ön lívással megy vég'_g az elem gyermekein.
I:gy másik megoldás, 11a az e emek meglátogatására egy bejárót használunk. A C++
nyelvben belső és külső bejárót is 11asznál11atunk, attó liggően, hogy mely.k elérhe-
tő, il etve lnelyil( a llat[konyabb
A Smalltalkban általában belső bejárókat alkalmaz
nal{, a do: Ls egy prog ambIo dc segítségével Miután a be ső be'iáróka az obje '""tum-
serkezet valósítja meg, a belső bejárák haszná ata nem sokban különbözjl{ attó
mintlla az objektumszer]{ezetet tennénk felelőssé a bejárásért
A f6 különbség aZt
hOh'Y a lJelső bejáró { nem járnak kettős kÖ7vetítéssel: a műveletet a látogatóra h/vják
meg, és a művelet arhumenluma egy adott eleln lesz
nem pedig egy elemre, a láto-
gatóval.ffi_int argun1entumlnal
Mindazonálta a Látogató minta könnyen 11asználható
lJelső bejáróval is, ha a látogató 1űvelete egyszerű, önhivás nélkü i művelethívást
'ntéz 32 elemhe" .
II Ha léte ik kett os k:özvelílés, lelletséges hárrnas, négyes vagy még "löbbes'j is? Nos, a kettős közvetítés való-
jában csak a többszöros közvetftés (multiple dispatch) egyik csete, amelyben a műveletet típusol\: valam.t-
lyen száma alapján válas7tjul{ kL CA CLOS ténylegesen a többs7örös kö -"vctítést támoga tja.) A kettős vagy
többszörös l<ő7vctJtést támogaló nyelvekben kcvésl)é szükBéges a Látog,alá Ininta alkalma7ása.
342 5. fejezet · Viselkedési minták
A bejárÓ a]gor'tmus a látogatóba is helyezhető l bár Íb7 a bejárás kódját minden
öss7esÍtett (aggregát) KonkrétHem minden Konkrétlátogató osztáJyában újra és újra
Illcgl<ettéSzzüJ(. A l)cjárási stratégiának a látogatóba llelye7ésérc 3.bbdn az esctbLn le-
het jÓ okunk; ha különösen bonyolult bejárást valÓsÍtunk meg, amely az objektum-
szerkcLden végzett művejetek eredményélől fÜgg. A PéJdakód részben látunk majd
egY7 ilye]l esetet.
éldakód
Mi\TeJ 3.1ál(Jgaté)k által
ban a7 ()sszetétclekI1ez l<apcsolódnaI<, a látogat() lnjnta illllszlrálásá-
nál az Öss7etétel minta Pé]dakód részében bernutatoll Equ j pmenL (Eszközök) oS7:táJyokra
fc)gunk t3.l11j,szkc)d.J1i. A LátogatéJ Jlljntá.t a.rr
i IlaS7Jlá]jlll{ majci., ]lOgy 111Ű'veleteket llatároz-
zunl( 111eg eg)! eszl(özlellár összeá.llításál-l()
, illetve az egyes eszközc)k teljes 1(öltségéJ1ek ki-
szánlítás3.l101.. A7 EquipmenL ()sztál)Tok annyira egyszcrCíck, I-I()gy a Látogat{) tl1inta. alka]-
l11azása ll11ajcio11ké!)]Jen szükségtclcn
ele a lJéldán kC)n]lyen }JClllulat]lat(), mire van szük-
ség a nlint3 megvalósításálloz.
, .. .
AIljon itt ismét az O.sszetétcl mintáná] (4. fejezet) megislnc:rt Equipment oS7tály, amelyet
kibővítcUÜnk egy l\ccepL művelettell hogy képes legyen együttrnúködni a látogatókkal:
el a.ss Eq1.11pment {
.public:
virtual -Equipment();
const char* Name() { return _I]dme{ }
viri_ual Watt Powcr();
virtual Currency Netprice{};
virtual Currency DiscountPrjcc();
virtual void Accept(EquipmentVisitor&);
prot ee ted:
Equipmcnc(const char*);
private:
const char* _name;
} ;
Az EquipmenL műveletei egy 3(lott eS7]<.öz tulajdc)]lságait aclják vissza
lJclcJ.áuI a fOg)!ílSZlá-
sát és a költségét. Az alosztáJyok 3 különbÖző eszköLtípusoknak (házI meghajtók l kártyák
st}).) ll1cgfele]ően felülírják a rnűvcleleket.
Az cSLkÖ7Ök látogatóinak elvont osztálya minden eszköz-alosLtály szárn'Íra tartalmaz egy
el\ront függvényt, al11.nt azt az a]álJbi l<ócll)an látjlatjuk. Alapértelmezés SZeril1.t 3. \TirtuáJis
fi.iggvény 7 el{ egyil(c seIn csirlál sC111nlil.
Látogató 343
class quiprnentVisitor {
pub1'c:
virtual EquipmentVisitor();
virtual void VlsitFloppyDisk(FloppyDisk*);
v'rtual void VlsltCard(Card*);
virtual void Vls'tChassis(Chassis*);
vlrtual void VlsitBus(Bus*);
II 68 igy tovább az quipment minden konkrét alosztályóra
p otcctea:
EauipmentVlsjtor() ;
} ;
Az Equ j_pmenL 11()sztá]Y3j 3.2 Accepl mŰ\Teletct IéJl)regében ug}'anú b 7 J1a.t.á,f()LZá]{ Dleg:
3. 111lí\'clet nlegll.ívja. azt az Eq1Ji pmentVisiLor n1űvclctet, amel)7ik 111cgfelel al AccepL
](érelrn.et kapó ()sztáIynaJz:
void }'loppyDisk: :Accept (EqujpnlcntVisiL<'Jr& visitor) {
visi tor _ vj si tFloppyDi8k (t}l is) ;
}
Azol( az eszk()z()k, a111.el)7ck 111ás eS71<özö!{ct [oglalnal( magllk[Ja (az Összetétel nlintán.á.l
ezek a Compos i LeEquj pment alosztályai), úgy valÓflják meg aL. Accept műveletet, hogy
bejárják gyermekeiket és mindegyikre meghívják. Ezután 3 szokásos módon meghívják
a vi sit 111lívelet<:t. A Chas sis: : Ac cepL pélclául 3 lláztJan találllató eszl{()zöket a ko'vet-
kezőkélJIJen járja l1e:
vo.d Chassis::Accept (EquipmenlVisitor& visltor) {
for (
LisLIterdtor<Equipment*> i (arts) ;
i-Is..Donc() i
i . Next ( )
) {
i.Curcntltem()->Accept(visiLor);
}
visitor.VisitChassis(lh's) ;
}
Az EquipmentVisi lor alc)sztályai a szerkezet egy'cs részeire 'lon.3.tlcoz{) egyedi algorit
musokat határozzák meg. A J?ricinuVisitor (ÁrazóLátogató) az ÖSS7.es eszköz kÖltségét
szátnítJ3 ki. l<'islárTIolj:a az cg)lSZerŰ eszl(őzöl<- (lll. 11ajlékon ),lenle7e]() n.ettó árát, il ]etve J.Z
össJ:etetl eszközöl( (11[. ]láz) leszállíttJtl ár[lt.
class PricingVisiLol : public EquiplnentVisitor {
public:
Pricin,gVisitor {} ;
,
3 4 5. fejezet Viselkedési mintak
Currency& GetTotalPrice()j
virtual void VisitFloppyDisk(FloppyDisk*);
virtual void VisitCard(Card*) ;
virtual void visitChassls(Chassls*);
virtual void VisitBus(Bus*);
I / A A
private:
Currency _total;
} i
void PricingVisitor:.VisitFloppyDisk (FloppyDisk* e) {
total += e->NetPrice()i
}
void PriclngVisitor::VisitChassis (Chassis* e) {
_total += e->DiscountPrice{);
}
A PricingVisitor a sze kezet minden csomóponljándk teljes költségét kiszámít"a. Meg-
figyel11etjü 7, 10gy az egyes eszközosztályok ára7ási módját úgy valasztja ki, 110gy a megfe-
lelő tagfüggvény11ez fordu" Az árazási módszer így meg is vá t07tatható, e11hez eléb
a Pr ic ing Visi tor osztályt mód.osítani.
A leltárkészítő látogatót valahogy így határa 11aljuk meg:
class InventoryVisitor : public EquipmentVisitor {
public:
InventoryVisitor();
Inventory& Getlnventory{),
virtual void VisitFloppyDisk{FloppyDisk*).
virtual void VisitCard(Card*)j
virtual void VisitChassis{Chassis*)j
virtual void visitBus(Bus*)j
I / . . .
private:
Inventory _inventory;
} ;
Az InventoryVisi tor (Leita Látogató) összef,yűjti az egyes esz {öztípusok_rJ. vonatkozó
összegel(et, emellett ped.ig az Inventory (Leltá +) osztály segítségével felületet l1atároz
meg a es kÖZök l10zzáadásá a (ezt itt nem rés71elez7ü]<).
{
Látogató 345
void InventoryV.sitor;:VisitFloppyDisk (FloppyDisk* e) {
_inventory.Accumulate(e)j
}
void InventoryVlsitor: :VisitChassis (Chassis* e) {
_inventory.Accumulate(e) ;
}
Az In ven to ryV isi to r-t a követkczől(éppen haszná ]:latjul( a teljes eleInkés71etre:
Equipment* component;
InventoryVisitor v.sitor;
component->Accept(v.sitor);
cout « Itlnventory ..
« component->Name()
« v.sitor.GetlnventorY(}j
,
Most ped"g megnézzük, hogyan valósítllaté) meg az E telmeLő ITIintánál bemutatott
Slna]ltalk példa a Látogató rninta 11asznáJatával. Az elő.z:őllÖZ hasonlóan ez a péld.a is olyan
egyszerű, llogya Lát()gató mintával valószínűleg nem nyerünk sokat, ele illusztrációnal( tö-
kéletes, mert a minta llasználata mellett egy o yan 11elyzLtet is benlutat, allal a bejárás a lá-
togató felelőssége.
Az objektumszerkezet (szal1ályos J.cifejezések) négy oS7lályhó áll, melyek mindegyike ren-
delkezik egy accept: metódussal J ame ynek argumentuma a ]átogató+ A Sequence-
Expression CSorozath..ifejezés) ()sztályllan ennek alakja a következő
accept: aVis it or
A aVisitor visitSequence: self
Az accept: a RepeatExpression CIsmétlésKifeje7és) osztályban a visitRepea.t:, 3.2
Al ternationExpression CVálasztásKifejezés) osztályban a visi tAl ternal ion: t
a LiteralExpression (LilerálKiejezés) osztályban a vis it Liter al: üzenetet küldi+
A négy osztálynal{ elérő tüggvényekkel is kell rendelkeznie t amelye (et a látoható Jlaszn.ál-
l1at+ A SequenceExpression esetében ezek az expressionl LS expression2, az
AlternationExpression esetél1en az alternalivel és a.lternative2, a Repeat-
Expression esetében a repetition, a Li teralExpression-nél pedig a components"
A Konkrétlátogató oS7lálya REMatchingVisi tor (IsmI lesztőLátogató). Ez az osztá.ly fe-
lel a bejárásért t mert a bejáró algoritmus nem szabályos, ami leginkább abban nyilvánul
meg, 110gy a RepeatExpression újra és újra bejárja az összetevőjét. A REMatching-
Visitor oS7tály egy inputStale nevű péJdányvá tozóval rend.eJkezik, metódusa" pedig
......
....
3 6 5 fejezet · Viselkedesi minták
Jényegében fficgegye70ek az Értchnc ő minta Üfejezésosztályainak match: (illeszt) metó-
usjvdl, csak ezeJ{ben az inpulState argun1entum 11elyél1 az illesztendő kifejezés-csa
mópon.t áll. Mindaz()náItaJ, an it visszaad.nak, az továbbra .s azon adatfolyamol\.. llalma7a,
a111elycl(re a kjfeje7és az a.ktuális állapot aZonosításihoz illes. ?"edik.
visitSequence: sequenceExp
inputSlate := sequenceExp expressionl accept: self.
Á sequenceExp expression2 accept: self.
visitRepeat: repeatExp
I final State I
final State := inputState copy.
[input State isEmpty]
whilcFalse:
[inpulSta.te :::: repeatExp repetition accept: self.
finalState addAll: inputState] .
A f.inalState
visitAlternation: alternateExp
I finalState originalState l
originalState := inputState.
finalState := alternateExp alternativel accept: self.
inputState := originaJState.
f"nalState addAll: (alternateExp alterna.tive2 accept: self).
A final State
visitLjteral: literalPxp
I finalState tSlream I
final State := Set new.
input State
do:
[:stream [ tStream := stream copy.
(tStream nextAvailable:
llteralExp components size
) = literalExp components
lfTrue: [finalState add: tStream]
1 ·
A finalStale
Ismert elh s náláso
A Smalltalk-HO forclító!Jrogra.m l-lrlalnla7 egy látogJ1Ó osztá]ytt a Prog "amNod.eEnunleratol
()rogralnCSOmÓl)()ntFe]soroló) ncvűt, ame])let elsősorban a forrás]<ódot elelTIZŐ algc)ritrnu-
sol{ llas ná]naJ{ Kód-clőá.ll'tásra vagy J{jJJJ.en.ct ormdzásra nem llaszná.latos, pe ig a kalinas
vol11a rá I
Latogató 347
Az RIS Inventor rStr93] térbeli grafjJ{us all{31 nazások fejlesztésére sLolbáló e]eml{észlet
A Jláro1ndimenLiós I-lelyszfnel{et (sce11e) CSOII1ÓP()otok hiera.rc11iá.jakénl álJrázolja, 3.1llclyek
111indegyik_e egy-egy n1értani alak7al()t jelöl, va.gy annak ehry tula.donságdt Az olyan m(fve-
leteJ{t mint a llelysLínek leképezése vagy a bemenet+ esernén.yek 1 oLzáre"llcielése ezen llie-
rarcllia külc)nl1ö7ő módol(on való bejárását jgén.yli, a nt az lnvento műveleteknek (action)
neve7ett Játog3.tól{on keres7lü old lneg. I(ülön lálc)gaté)}{ vannak a lekélJe7és e, 3.2 csc-
ményke clésre, a l{eresés e, letvL a befoglalé) dobozoJ mcgllatár()7ásá -a
Az új csomópontok felvételét n1egkönny."tLnd.ő a7 Inventor kettős 1{ö7vetítési sé nát valós-'l
meg C++-ban A séma. 2. iutásid.ejű tÍIJllSinfo "111ációkra épül, illetve CbY kél{limenziós tálJlá-
7atra, a.mclyncl< sorai a látogatók31, oszlopai pedg a csomó Jont oS7lályo]{at jelképezik.
A cellák a látogató]10z, illetve 3 cson1é)pont osztályllo.l kapcsolódó függvényt cínlZŐ illllta-
tót taItalmazLdk.
A Látogató (Visitor) elneve7ést Marl( Linton llaszná ta clősLöf, a7 X Consoruum Fresco
Applhcation Toolkit leírása.ban LIJ931.
Kapcsolodo minták
Összetétel: A látogatók segitségével ef,Y, d7 Összetétel ffi'ntdval TIeghatározotl objektu TI-
s7er]<ezet elemcin vége? letün]{ el egy a.datt míí\reletet.
...
rtelme7é5: Az értell1ezést látogatéJval js \Tégezhetjük.
,j
348 5 fejezet · Viselkedési minták
.
. I
.
k I
.&
I
.
I
v Itozatok
ységbe ar as
A változó elemek egységbe 7árása számos viselkedési minta alapja, Amikor egy program
valamelyik tényezője gyakran változ'k, ezen m'nták segítenek abban, hogy egy objektum-
ban egységbe zár 1assuk. A prograln többi rés7e ezután együttműködhet ezzel az ohjek-
tummal, ha működésük a7 ell1lített tényezőtől függ. A viselkedési minták általában egy eJ-
vont ()s7tályt határ()zna]{ 11eg; amely Jeírja az egységbe záró objektumot, Cs neVÜket erről
az olJj<:l\:tu mró1 ka1)ják: J2
· a Stralégia olJjel{tum egy algorillnust zár egjrségrJe (Stratégia. mOntd),
· a7 Állapot objektull1 egy állapotfÜggő viselkedést (Állapot minta),
· a I<özvetítő objcl\:tum objel{tun10k k()Z(jttl protokollt (Közvet"'tő minta),
· a ]-ejá.ró objektulll pedig az összesített oL)jektumok (aggregátumok) elemeinek el-
érésére és l1ejá ására s701gáló lnúdszert
A7 említctr n1inták a program egy olyan réSL[l rják le, amelyet mű]<ödés kÖ711en valószín(í-
leg cserélgetÜnk. A legtÖbb nlinta kétféle objektumot tartalmaz: új objektUlTIokat, amelyek
egységbe zárják a kérdéses szolgáltatást, illetve már meglevó1<et, amelyek ezen új objcktu-
mokatllaS7náljál(. Az (lj objekturTIok nYÚjtotta szolgáltatásol{ az adott rninta 11aszná]ata nél-
kül általában a már létező objektumok szerves réS7ei lennének. Egy stratégia k6dját példá-
ul a stratégia környezetébe (Környezet, Context) "drótoLnánk", egy álbpotobjekturn kódját
pec.Jig köz\Tctlcnül az állapot k()rnyezetében valósítan.ánl{ rneg.
Mind.a7onáltal nem n1inden objcklun1vjselkedési lninta a fenti felcJsztást alkalma7za. A Fcle-
lősséglánc mintában például tetszőleges számú (a láncot alkotá) objcktumma dolgozha-
tunk lmelyel( lninclegyi]{e lellel a rendszerben már létező objel<tum.
A Felelősséglál1c minta még egy különbségre fa.világít a viselkedési minták közcjtt: nell1
mindegyik statikus kapcsolatokat határoz meg az osztályok kÖ7ött. A FcJelősséglánc minta
objektumok korlátlan száma közötti kommunikációt ír el6 J míg más mintákban olyan ob-
jektllmol<at tr{lá unk r al11elycket argumentuml(ént adunk át.
Ar umentumkent h szn It obj ktumo
Számos lePlezés. lninla vezet be egy o]yan objektumot, an1clyet lnil1dig a.rgumen.tuln-
ként haszná unk. A7 egyik ilyen minta a LátogatÓ. A látogató objektum egy több alakú
Fogad (Accept) művelet argumentuma! amely a meglátogatott objektumokon mÚködik.
IZ Más nlintiik is 113sonl{)an l111Iködl1ek:. Az R]V011l gyár, az Építő és a 1]rotol.tpl1S mintál< lnind ol)je]<tunl{Jk lélre.hozásá-
nak módját zárják egységl1e; a Díszítő miIlta olyal1 s/()lg[iltatasol<3t, anlclyekkel egy ol)jcktun1 kíegészíthLÍ(); 'lllíd
minta :'-iZ elvont álJrá70Iásl v313szlja el a f11cgvalósÍtáslól, l10g{ az()k eg"ymástól fiiggctlcnül v:iltoztathat{)k legveIlck.
5. fejezet · Viselkedési minták 349
A latogatót solla nem kezeljük ezen ()11jekturTIo.<: részeként, pedig a minta alkalmazásá-
nak l1agyományc)s alternatívája a látogató kódjának elosztása a7 ()bjektuJTIszer (ezet osz-
tályai l(öZött
Más nlÍnták olyan objektumokat l1atároznak meg, amelyel< 111ágj](us jelként viselkednek, ami-
ket körbeadunk és későbll meg11fvunk. Mi11d a Parancs, mind aL Emléke7tet(5 minta ebbe
a kategóráha esi]{. A Parancs mintában a mágikus jel Cnlagic tCJken) egy kérelmet jelöl, az Em-
lékeztet61Jen egy objektum belső állapotát egy adott pillanat113.n. A jel mind.kél esetlJen 11cJn)'o-
lu It belso szerke7elű lellet, de erről az i.lgyfélnek nincs tllclomása. Min(i.azol1által itt is találunl(
külön}Jségekct. A Parancs mintában lényeges szerepet játszik a többa.lal<.úság (pc)limc)rfi7mus)j
lliszen a lJarancs (Cornn1and) objektun1 vég.-ehajtasa többllak(l művelet Ezzel szemben az
Fmlékeztető (Me .11ento) felület o yan nkeskeny", 110gy 27 emlékeztető csupá.n értékkénl adha-
ló át, Íb'Y nem valé)s7Ínű r hogy egyetlen többala.l{ú műveletet is nyújtana az ügyfe einel{
Egysé be r s vagy osztás.
A Közvetítő és a Megfigyelő egynlással versengő tervezési minták. A külön11ség ]{()7tiil< az,
11C)gya Megfigyelő a Megfigyelő (OlJscrvcr) és Alany (SlJ11ject) o11jektumol( beVcLetésé\lel
elosztja a kOlnmunikációt, míg a K()vetJtő (Mediator) objel{tumok éppen 11()gy egységbe
zárják a tc)bbi c)11jekll1D11{özött.. ]{apcsolattartást.
A Mcgfi6'Ye1ő minlá11an nem egyetlen objektum zár egységlJe ebry kc)tést; a Megfigyelőknek
és AJdl1yol(o.al( együtt kell működniük annak fenntartása érdekében. A kapcsollttarlási min-
tákal d megfigyelők és alanyok összeJ<apcso]ás3.nak lnódja IlatárC)Zza meg: az egyedülálló 3.1<1.-
nyol{nak általá11an több Jnegfigyelőjük vant de ehl}T megfigyelő is Je]let egy 111.ásik nlcgfibryelő
alanya. A KÖ7vetítő minta nenl eloszt, in]{áblJ l(özpontosít; a kc)té')ek fenntartásán.a.k felelős-
ségél kifeje7etten a ]{özvetítől{ &e bízza. A sLcrz6k kc)nnye11ben lIjra]lasznosíthatónak találták
a Megfigyelő és Alan}' ()l1jektumokat j mint a l(özvetítől(et A Meg[ibryeléS nl1nta a .megfigyelők
és alanycJk J{()7()tti elosztást és laza csatolást részesíti el(5nyl)eo t ami "tJ.nolnabb" osztályszer-
kezetet eredményez, a kisebb osztályol{at peclig k()nnyebb újrallasznosítani.
A Közvetítő mintában viszont átlátllatóbb a kommunikácjó folyása, lnint a Megfigyelc)11el1
A megfih'Yelők és alanyok általában röviddel létrellozásllk után összekapcsolódnal{, így
a programban (ésőbb ncllcL felderíteni kapcscJlód.ásuk JTI.ódját. Ha iSlTICrjük a Megfigyeic)
mintát, tisztában vagyunk vele ll()b a kapcsolódás lllódj3nal\. ismerete lényeges, és azt js
tudjuk, milyen kapcsolatokat l(e essiink, a minta által beve7etett ]{özvetettség 3.zonban en-
nek e]]enére megnellczítllcti eg)' rend.szer megértését
A megfigyelők a Smallta.ll{ban üzenelparaJllétere (et l(apllatnak az alany áIlapcJtának eléré-
sé11ez, így újrallaSZn()sÍtásuk még egyszeruDl) n1int a C++-ban. A Sn.1alltalklJa 1 ezért von-
7 é) 11 II a Megfigyelő minta, mint a. Közvetítő, míg d C:++ programozó \. inkább az ulóblJit ré-
szesÍt.l< előnyben.
350 5. fejezet · Viselkedési minták
A k..ldó és
ogadó elvalasztasa
Amikor aL eb'ttműködő objektumok közvetlenü hivatkoLnak egyrnásra, függővé válnk
ef,Ylnástól, ami nemkívánaLos hatással van a rendszer rétegezettségére és újrahas7nos....tlr tó-
sdgára. A Parancs, a Megfigyelő, a Kij7velÍtő és a Felelősséglánc nl1.ntá.k mine). érintilr a kül-
dők (adÓk) és fogad.á < (vLvők) elválasztásának kérdését, de máS-l1ás következményekkel.
A Pa 'anes nlinta az elválasLr.:Ísl egy olyan Parancs (Command) objLkLummal Lámogatja,
4;lmelyn_el( eladala a h:üldő és a fogadá kc)tésének meJ.1.3tározasa:
e Kezdeményező
(küldo)
egyParancs
egyFogad6
(fogad6)
Végreha.t()
Mt1velot()
A Parancs objektu 1 egysLení felületet biztoSlt a kérelem kibocsátásához (vagyis a Végrehajt
művelLthe7). A kHdő-foga ó kapcsolat ön:'l1ó o Jjektllmba helye7ése kheLővé tesLi a küldő-
nek, hogy különbö7ő fogadókkal dolbozzon, e.. ellett elválasztja a kü1dőt a fogadóktól, így
meg <önnyíti annak újrahasznosíLásál. A Parancs objektum is újrahasznosítható a fog' .dó kü-
lönbÖ7Ő küldőkkel való par.lméterezéséhez. A Parancs ninta elvileg minden küldő-fog- dú
ka 1csolatho7 külön alos7lályt igényel, de a m'ntd leír olyan mcgvalósítási móds7e eket, ame-
lyekl(cl a7 alosztályok szá.rn1aztalása el (erüllleté5.
A Megilgyelő 1llnta a7 alanyok megváltozásál jeI7ő :elülu meghatározásával vál.lsztja szét
a küldőt (alany) a fogadóLÓI (megfigye ő). A Megfigyelő minta lazább kötést aldkÍt ki közöltük,
mint a Parancs, mivel egy ala.nynak több rllcgfigyelője 'ellct, és s7ám.ul( futásidólJen \lállozl1at.
egyA any
(küldé)
egyMegfigyeló
(fogadó)
egyMegfigyelő
(fogad6)
egyMegfigyelo
(fogad6 )
I
Fris srt()
--
-
Friss itU
-
-
Frissft( ) r--
--
-
I....
5. e-ezet Viselkedési minták 351
A Mebfibyelő minta Alany és Mcgf t gyelő fcliilctcincl( szerepL: a váltaLások {özlésc, ezért
a minta a]{]{or alkalma7hatéJ legjc)lJt)an olJjel{lllmCJk elválaszlásárl, I-1a aci.atfüggőségek áll
nak fenn köztük. A KÖLvetÍtő minta az objcl(tumol{3t úgy vá aszt ja el, l10gy l11cgköveteli,
]10gy egy kC)7Velít(Sn keresztül közvetellen 11ivatk()zzanak eg)lmásra.
gyKolI'ga
( küldó/fogad6)
egy \.özvetító
egyKolléga
(kül dó/fogad6)
egyKolléga
(küld ó/fogadó)
I
-
--
-
-
--
-
-
,.........
-
--
-
--
-
--
I I
A Kc)zvelítő objektumok a kéreimekLt Kolléga (CoIleagllc) objcktUll10k110L továbbítjál{ és
központosítják a közöttü]{ folyó kOmtnUl1d(ációt E110eJ( következménye]{éppeZl a kollégá]{
csak a közvetítő feli.iletén kerLsztültársalogl131nak egymással. Mi\lcl ez a fclCilet rögzÍtctt 1
a nagyolJb rugallTI.asság érde]{ében a közvetítőnek eset]eg saját üzenet]<ü]d.é5 SéJl1ál kelJ
megval{)sltania. A kérelmek kód.olása és az argull1cnlumok becsomagolása így (Jly módon
történhet, 110gy a l(()]]égá]( k()rlátlan s7ámú műveletet l(érelTl1e7 lelnek.
A Közvetítő nlil1ta csökkenti a7 aJosztályc)k létreh()7ásánlk s7l1kségességét a reoclszer11en,
rnivel a kapcsolattartási viselkedést egyretlen osztályban egyesíti, nem pedig alosztályol(
(Ö7ött osztja s7ét Min(ia7onáltal az ad lz oc ü7enelküldc) sénlál< hryal<ran cscjJ{I<enti]{ a tíJJUS-
biztonságot.
A Felelősséglánc rninta a Jcüldőt és a fogadót úgy választja el, l10gy 3. kérelrneket a le11etsé-
ges fogau.ók láncán küldi át:
egyÜgyfél
(küldo)
egy ezeld
(fogad6)
egyKezelo
(fo gadó)
e Keze 10
(fogad6]
Keze lSúgó()
KezeISúg6()
KezeISúgó(}
35 5. fejezet · Viselkedési minták
M"után a küldők és fogadák közötti felület rögztett, a Felelősséglánc ffi'nta s7intén egyedi
üLcnetküldő sémát igényelhet, ami ugyanazokat a típusbiztonsággal kapcsolatos gondokat
veti fel, mint a Közvetítő mintánál. A Fe elősséglánc minta a küldő (s a fogadá szétválasztá-
sára akkor jó megoldás, ha a lánc m.:ir a rends7er sze 'ke7eténe {része, és va amelyik objek-
tum képes kezelni a kérelmet. A ninta emellett ruga mas, JTIert a lánc módostható és
könnyen bővíthető.
..
ss es
Néhány kivételtől eltekintve a viselkedés. minták kiegészítik és erősítik egymást. Egy fele-
lősséglánc egyik osztálya például valószínűleg legalább egy helyen alkalmaz Sablonfügg
vényt; a sablonfügf,rvény a aprnűveletek segítségével megállapíthatja, hogy az obje 7tum ké-
pes-e a kérelem kezelésére, i .letve kiválaszthatja aLt az objektumot, amelynek a kére .met
továbbítani kell. Ezenkívül a lánc a Parancs minta alkalmazásával a kérelnleket objektu-
mokként ábrázol hatja. A7 Etelmező minta az elemző környezetet az Allapot lninta segítsé-
gével ala dtlatja ki. Egy bejáró bejárha egy összetételt, annak elemeire pedig egy látogató
a]kalmazllat mCíveleteket.
A viselkedés! minl.:ik jól működnek együtt más mintákkal. Egy, az Összetéte mintát hasz-
náló rendsLer például egy látogató segítségével hajthat végre lnűveleteket az összetétel ele-
mein, a Feelósséglánc minta révén lehetővé teheti az elemeknek, hogy szülőjÜkön keresz-
tül globális tulajdonságokat érjenek el, sőt, a Díszítő mintával a7 összetétel egyes elelnei-
ben felül is bírálhatja ezen tulajdonságokat. Emellett a Megfgye1őt mintát alka mazva eb')'
objekumszerke7etet egy másikhoz köthet, az Állapot mintával pedig mcgváItoztathatja egy
",
elem viselkedését, amint az állapota megváltozik. Maga az összetétcllétrehoLható az Epít6
mint.! megközelítésével, a rendszer valamely más része pedig prototípusként is keLe heti az
öss7etételt.
A jól megtervezett objektulnközpontú &ends7erek éppen ilyenek - számos minta ágyazódik
beléjük, de nem feltétlenül a7ért, mert tervező'k erre törekedtek. Az osztályok vagy objek-
tumok sz nt je helyett a nzinták szintjén történő tc vezés számunkra is megkönnyíti, hogy
llasonló szervezettséget é iünk el.
.
ul · I
k
Egyesek úgy g()ndolhatják, számu (ra ez a könyv nem nyújtott túl sokat. Tény, ll()gy nincse-
nek benne korábban is neretlen algoritmus()l< és különféle lJfogramozási eljáráso]{. Nem ad
szigorú módszert a rends7erek tervezésére, nem dolgoz ki új tervezés". elméletet, csupán le-
,;
írja a létező tervezési mntákal6 Igy jog'gal adódhat a (övetkeztctés, llogy bárn1enl1y.re jól
összeállított oklalóanyag ke7dőkne]{, az objektumközpontú tervezéshen jártas programo
7{)k számára nem tartalmaL hasznosít11ató ismefete]{et
Reméljük, az Olvasó n1ásl(ént gondolja és egyetétl velünk abban, 110gy 3, tetvezési mintá]{
rendszerezése lényeges J mert szal1ványos InegI atározást és nevet ad az á la]unJ< használt el-
járásoknak. Ha nem tanll má 1yozzuk a (ülönféle progran101<ban felleillető tcrvc.lési mintá-
l<at, továbbfejlesztésükre sem leszünk képesek, és nellezebben állunl{ majd elő újabbakkal+
E7 a könyv csupán a l{ezdőlökést ad11atja meg. Azokat a leggyakrab11an 11asznált tervezési
m.intál{at tartalmazza, amelyel{et a tapasztalt objektumköZll()nt(l fej]esztők a gyakorlatban
nap mint nap al]{almaznak tudo nást mégis csak szájhagyomány útján vagy a meglevő
rendszerek ta.nulmányozásáva] szereznek óluk. A kötet korai vá71ata .ban arra buzdítottuk
az olvasókat, hogy írják le az általul( l1asználl tcrvezéi ll.ntákat: reménycinl\: szerint a vég-
leges változat még inkább erre sackali. Rem.éljük, ez kezdete lesz egy m.ozgalomnak, arnely
a szo[tverfejles7t{5k gyak o .lati tapasztalatait végre írásban rögzíti.
Eme utolsó fejezetet dnnak szenteljük, hogy bemutassuk J szerintünk milyen 11at{.st g)'ako-
falnak a tervezési minták a szoftverfejlesztésre, hCJgyan l{apcsolódna.k 3. tervezéssel kapcso-
latos egyéb részfeladatok 102, llogyan találhatunk m.agunl{ is iltle nem írt lnintákat, és 110
gyan rendszere7hetjllJ< azokat.
35 Programtervezési minták
.1 Mit v'rj nk gy terv
si minta ol?
,
Ime néhány terület, amit a kötetben be .llutatoU tervezési minták az objektumközpontú
programok fejlesztése során érintene {(gyakorlati tapasztalata'.nk alapján),
Közös te ezési S okincs
A programozó s7akemberek ta asztalatai a hagyo 11ányos progra. nnyelve ( terén dzt nutat-
ják, hogy pusztán a nyelvtan ismerete em nyújt elégséges tudást; szükség van a nagyobb
fOhalmi szerveződések, az algoritmusok, adatsze kezelek, nyclvjárások vagy idiómák
lAS85, Cop92, Cu 89, SS86J, illetve a ehry adott célho7 igazított tervek SE84] elsajátítására
is. A tervezők az adott programterv rögztésére használt jelÖlési rendszerre kevesebb figyel-
met fordítanak; inkább arra ÖsszpontosÍl4nak, hogy a tervet a korábban n1egismert a gorit-
musokllOZ, aclatszerkelete]{11ez Cs idiónláldloz °ga7ítsá ,{
A számítógép-tudomány igyckszi]{ elnevezni és rends2cre7ni az algoritmusokat é ddat-
szerkezeteket, de a tervezési m "nták esetében ez igen ritkán áll fenn. Pedig a rendszerezett
tervezési mintál{ l(ö.l()s nyelvet bi7tosít]1atnal( a különböző megoldások °t,mertetésé11e7, le-
írásához vagy fdfedezéséhcz; emellett azálta], hogy segítségükkel a xogramozási nye vek-
né és má jelölési rends7ere {nél magasabb s inte 1 e vonatko7tatva "beszélhetünk" egy
adott tervrő , a programot kevésbé bonyolultnak tüntetik fel. A tc.tvezé<;j m.'ntak tehát egy-
szerűsítil, mind a terveLésl, mind a tervrő] m.unka.társainl{l{al folytatott vitákat.
Hd elsajátítottuk a kötetben szereplő tervezési nintákat, tervezési s7óki 1csünk .s egészen
biztosan meg fog változni, ahogy elkezdünk £lZ eze ( által has7nált fogalm.akban gondol-
kodni. Fe seIn fog tűnni, hObY má is olyanokat lllondunk, hogy "has7náljuk it" a MegfIgye-
lót" vagy "csináljunk 5tr dtég. át ezek11(5l az osztÁlycJ]{llól".
Dokume tac ó s ul ' si s 9 die
A könyv-ben bemutatott tervezési minták megtanulása könnyebbé teszj a létező rendszerek
megértését, hjszen a leglölJ}) nagy méret(f objektumközpontú IJrog am a kalmazza őket.
Az objektumközpüntú programo7ást tanulók gyakran panaszkodnak, hogy a rendsze ,
amellyel dolg()znak, bony()Iult ö ö ési viszonyokra épül, igy ne léz követni a ve7érlési fo-
lyamatot. Gondjuk nagyrészt abból adódik, hOh'Y nem értik a rendszerben je en levő terve-
zési mintá {lt, pedig ezek ismerete feltétlenü segít a7 objektulnkö7pontú rendszere { mű-
ködésének megértésében.
A tervezési minták scgtségével jobb prograllltervezővé is vál1alunk, hiszen e minták gyak-
an felbukkanó )foblémákra nyújtanak ffie!,oldá<;t. Ha kellően hosszú ideig dolgoLunk ob-
jektumközpontú rendszerc.kkel, a ll1intákat va ószínűleg magun { 's felfedezzük, de e {öny-
vet elolvasva a tanulási 'dő jóckán lerövidíthető, így az újonc programozók h4marabb
szakértővé válllatna]{
:E nellett, ha egy rendszert az általa alkalma ott tervezési minták nevével írunk le, felépté-
,<:,Ü megérteni is jóval könnyebb lesz. Ha J em Igy teszünk, arra kénys7erülünk, hogy a SLer-
61 fejezet · Tanulságok 355
ke7etet visszafelé "gcjnb'Yc)lítve)' JusslInk el a llasznált mintál\: kibányászásáig. A közös szó-
kincs l1a,;ználata révén nem kell rés71etesen lefrnunk a teljes s7er]{e7etet; elég, lla megne-
vezzük, Így lninclenl<.j tud.ni fogja, llliről van zú. Hl mégscrn, az illetőnek csak utána kell
néznie egYS7er J J10h7 m.iJyen terve7ési mintát is takar a7 ad.<)tl név amj még mind.ig eb'YS7e-
rlíblJ l11int avisszafejtés.
A szerzők saját l11unl(áiklJan is all(alm3zzák e nlint5kat, és felbecsüliletetlen értél{(nel{ tart-
ják aZ()kal. 'lermészLlcscn a fcl113sználás módja legtöbbször Hnaiv': a minták segítségével
n.evet keresünk a7 c)szlályc)knak J a tletyes tervezés ()ktalásállan alkalIlla7zuk ú.kel J vagy
l fel11asznált tervczési mint3.k3.t sorba állítva lcírunl( egy 3dott l)rogralTISZcrkezctct BJ.94]
Fnnél ](jfin()Tlll11taIJ11 alkalmazás is elképzelhető; ct tenTezési nlinták alapján pél(i.ául CASE
cszl<,öl.öl< vagy lliperszöveges cl()]{umenturn.ok is l<ész"'tl1.etől(, de a l11intál{ alapszinten is
nagy segítséget o}r(]jtanak.
A létező móds e ek kiegés ftóje
Az objektumközpontú tervezési rnóclszerek célja, hogy jó tervezésre ösztökéljenel{, h.ogy
meglanítsák a kezelő progralllozóknak a llClycs tervcLés mikéntjét illetve hogy szabványo
sítsá.k a lJfograrn.fejJesztés m.ódját. rgy tervezési módszer Je]lemzoen a7t írja Je, ]10gy a prog-
ramszerkezel különböző elemeinek modellczc:sérc milyen (áltllában grafIkus) jelölésrcnd-
szeJ111asználl111k, illetve aZOJl s7a11á]y()kat, amelyek arra vonatl<o7Jla]<, hOg)l az egyes s7iln-
l1é)lumc)kal mikc)r és llog)'an alkalmazzul( A tcrvezési mó(!szerek renti.szerint lel-lelséges
prC)11Jénlákat váz()]nak, oleg()]d.ásl aclnak a7()kra és lelrják J 11()g)'an mérlletjük fel a tervezés
llCl)lcsségét a sZ3.kértő progra1110zók tapa.szta.lata.ina.k megragadás3.ra 3.zonbal1 eddig 3.l1{al
matla nnak 11i7()]1lU ]lal<.
Ug;? \réljil]{ a 11enlutalcJlt lervezési minlák azt a láncs7emet je]elltlletik, lmi ecid.ig 11iánY7C)ll
az o bj ektu111k ö zpontú tervezésj tn ódszerel<l) áll Me gm li ta tj ti.]{, l10gyan l1asznál11a tjuk az
a]apvet{S pr()gramelemekel - az objeklull1()kal, az ()röklést vagy a llJl)lJa1akílságc}t - illet\Te
azt, l10gyan. paraJll.étere7hetün]< egy rendszerl algoritmusokkal, viselkedésekkel, álJapoto]{-
kal vagyazokkal az objektllmol(kll, 3.melyeket létre kcll110znia. NCl11 csuI)án döntéseink
eredJl1én.yét rög7ítik, ]laJle1TI a7t írjá]{ le, ,miért} legyen olyan a programszer](e7et, an1ilyen.
A <..löntésel( mcgllozatalában az egyes te \lezés' minták iSl11ertetésében szerel)lő Alkalmaz-
h.atóság, Köv T etJ<e7mények és Megvalé)sítás rés7ek segíthetnel< !11inket.
A tervezési minták különösen llasZnosal(, lla egy elcmző nlodcllből szeretnénk mLgvalósí
tási l110dellt Iétreh.oznil Bár egyesek azt álltjá]{, 110gy az objel<tul11központú eleIllzésből
Lökkenőmentes aL áunenct az objelctum!{özpontú tcrvcLésbc, a. gyakorlatban ez a.£ átlne
net min(i.en J csak nem sima. Egy rugaln1as és újrahasznosítl1alé) programszerkezet olya]1 01)-
jcktumokat is larltllnaL arnclyek lL elcmző llloucllbcn nem sLcrcpclnek, a lervet pedig
a h.aSZJ1.ált JJ[ogramozási nyelv és ()c; z tálykc)ll)T\7"tár is befolyásolja Az elen1ző D10delle]{et
gya.l(ran át l{cll dolgozni, 110gy (Ijrahasznosírllatóvá válj2.nalc. SZdffiOS, a gyűjtcményünl(bcn
slereplé5 minta f()glalkcJ7ik e kér(jéskc)rrel, ezért is 111Vjuk é5kel tervezési rn.in.táko.a.k.
356 Programtervezési minták
Egy teljes tervezés' módszer ne II csupán tervezési, hanem lnás típusú mintákat is i!,ényel,
pé dául elemzési, felhas nálóifc1üleL-tervezési vagy teljesít llényfokozási mintákat. A terve-
zési minták azonban olyan lényeges teru etet jelentenek, amelyről eddig nem sok szó esett.
új aépl S cél" a
Az újrahasznosítható programok fejlesztéséne 7 egyik akadálya, hogy gyakran újjás ervezé
sükre vagy újraé - ítésükre van s7ükség. (Ezt hívják idegen s7óval refaktorizációnak rOJ90].)
A tervczé&' m.inták segítenek abban, hogy megá apítsuk, mi yen újjászervezés szükségelte-
tik, és a későbbi újraépítés igényét is csökkent.k
Az objektumkö7pontú programok élete több sza {aszra oszt} aló. Brian Foote ezeket a sza-
kaszokat a prototípus-készítési, bővítési, illetve konszolidációs jel7őkkel 'lIeti [Foo921.
A prototípus-készítési szakasz számos tevé {enyéget foglal magába; lnindazokat a tevé-
kenységeket, ame yek révén a szoftve az első változat fokozatos bővítésével, módosításá-
vallassan elér'. a "nagykorúságot", vagyis képessé válo { arra, hogy megfeleljen az előzete-
sen támasztott követelményekne.c A program ekkor általában o yan osztá yh' e "arch" ákból
épül fel, amelyek szorosan il eszkednek az előzete terv által meghatározott foga 1akhoz.
Az ebben a szakaszban alkalmazott újrahasznosítás többnyire öröklés útján megvalósítot
"fe11ér dOL10Z0S" új .ahasznos"'tás.
Amikor az immár nagykorú szoftvert működésbe helyezik, további fejles7tését két egymás-
nak eJentmondó szÜkség ct határozza meg: (1) a szo tvernek további követelményeket
ke 1 kielégítenie, mi {özben (2) még in{ább újrahaszno<;íthatóvá {ell válnia. Az új köve el-
mények általában új oS7tályok és műveletek, esd eg teljes osztályhierarch'ák hozzáadásá
igény ik, vagyis a <;zoftver egy bővítési szakaszon megy át, E szakasz ugyanakkor nem
nyúlhat tÚl hosszú 'a, mert különben a szoftver túlságosan rugalm.atlanná, a későbbi változ-
tatásokkal sze nben túl nehéz {essé váhat. Az osz -ály 1ierarchiák e szakaszban áttöri { az
előzetes terv által támasztott korlátokat, más fogalomkörökre is k'terjednek a7 osztá yok
pedig számos önálló műve etet és példányváItozót is meghatároznak.
Ahhoz, hogy továbbfejlőd 1essen, a p 'ogram újjászervezésére van szükség: e ülyamatot ne-
vezik úJ1"'aépítésnek (rc =aktorizáció). A keretrendszerek rendszerint ebl1en a s7akaszban
lépnek a kcpbe. Az újraép"'tés magába foglalja OS7lá yok á talános és s7akosított célú ÖSS7e-
tevőkre bontását, műveletek feljebb vagy lejjebb léptetését az osztályhierarchiában, il etve
osztá yfelületek ésszerusítését is Ezen kons7oLdációs szakas ban számos új objektum jön
létre, gyakran a meg evők felbontásával, illetve öröklés helyett objektum-összetételI aS7ná-
atáva , tehát a "fehér dobozos" újrahasznosítást felváltja a "f<-kete dobozos" újrahasznosí-
tás. Az a folyamatosan fennálló igény. hogy újabb és újabb követeimé 1yekne { {ell megfe-
lelni, illetve még több kód észletet lehessen újrahasznosítan', az obje {tumközpontú szoft
vert a bővítés és 1<ons7() idác.ó körforgásába he ye7i
6. fejezet · Tanulságok
357
. ..........,......:......;..\\....".. .
.. .:.:-....:.:-:- .:..:-..... .:.:.....I.:. . .\...I , ....I.: , :. , .I.:........ .\:..I.:.::..:. , ,,". II L..
" :;1 f. ,',....oc....:. .-...:': -.' , ,.- ,-\, ,,-, . ,......
. ".::,.'....\ .:. \'. :. \ .:.\'. :: f ' .:.L'. :.\ :. , \ .: '::.. :.:..\ .: \'::.:.. .::. .::. , ':.:.'\'.:.:.'. :". .:.....: ,\':. , ..,.
,."1 ..-..:....... I .-.." ."..,..." ".." ."1.- .-... . I ol ." : 1.".1 .11 :. .:'1.
.. .'.':... .:....\'. ,.::.. ,\ .: ::..\':.}.'.:. ::. , ....'.:. .::. .\...... , .:,.::..\......::L.Y...:.\..:.\. .:. \.. , ...::,.:..\ \..:.\:.}:.:...::...
. J ...:.. 1-"" ".1.:'-., 11:'- ...-...:., !"I.". 1, ."1.:."1 .1. .. I ." ."..\". -:1 1 ."1. . .
:.: ,:..,..:,..\,.:.,'.l!:'",...,: ,.:...:,\.:.\'..\ . ::..\ \. :.:'!,:.:. .:..\.:.:.:.}.:.\\.,\'. :...\.:.\:..\.:.\..::.\.:..\':.
:.< ." ,... ..,,.. .\..;10 ..".. .,., o ti "., ....,_. .',' . ..., ,.' .\'''' ' , ',. .
...:.'.:. :....'.: ...!:....\..L.'{.:...,..::.\'....,:\... ":. '.. . .. .. ':"::.'\..:.'\.':..\'... .:.\'::.""::\.:.:..\\::":.:.,\'.:.:.\ , ...
. ."... .-...". ..". .". ."."-,; 1. ........ ..,.1. 1 1.." . :".. . ...... 1'.:..1.11.11011.... .:.-... ."
...,::..:.:.t\,t.\.:.. :.:t.'.:.'f::.:\{..(.:[.'.::.'::.L' . ... S. :.:\.:.:..\.::...\.\..:....\:,:.;..:.:.:..:f::.,\.1..:.;.::.'\'.:.:'.\' ..
.: -!:\....:.....:.......\:.:..(j..:..::. \:....:.:..:....{.:..:...t:....:.\ '.01..::..-:.. ....:.:..::. -:\".":.:..":::... ...:.....:.::.......1. .\\-I....::-.....:..;..\....;:...l:::.....\:..I..;.;....i:..;....::
,.::.:.:\.:::,'i;.:.'.:...;:.: :.:=.:.'.:{.\':.:. .......fi..:;, , ..:':' , \'..;: .t:..\.:..:.:..;:..\::.:.'\:.:...\":=.:\':.:...,:..? (.J:=.':';:.:..\'.: \.:.\.:..:.:..\..:., \' .... :.: , \.. .... .::.\...: , .;\..:.:..\ . i} , .:.
I ." .....--L.I -1,; ... 1. L: o" ..1 .." . 1..."1. I 1. _ .. 1..... ."1. o" "., ." o" I II I I .\. . I" III .... I o" _.. . J" . ,..". .
. " ..........:.:\:. .:..:..\::. . .:" . ..I... .,,:: :! ..\I.:.. . .(......I.:..........\.:.-..::.= . ....:.....i!.....:.....:: . !\....:.....::..I:.!\....:...::. , ...:.:...\:...\...::::. , !\..:.. ::.:.... ?"::.:.:"" ' ::.. L .::. ..:......: , .:.I.. , .:..::...: ... :.I. ,
, .. ,. ... .. . .... . ,.., .. . .,. ..,.,.... \ .'.... *"\,.,, . .., \ .\",.\L: , .. ,. L' ,:Ilf. " ..... o. ,.. . \",., . ..., "". . .', . .
,..:.:\...:.:...::....{...:.\\:.. :.:=.:..:.....'.:..\:..W...L.:{\.'f....:. , \..:.:\\\.,..: .:./:: , .\.:, .\:..\...:....,:.:..:.:.:.....:.. .:.;;,.;.:.:...,\:.:\.:.;\.:.:.,\::.:.;{ , .}'.:\.{ , ::.\..:.::'I;:.:.,":.\\.;..;.:..:.:.;.\..;..\...;...;\...,
. II..., . , 1 -.l'" ...--= I11 ,. 1.... \1.."- ..11.1.... .1 ........1-1 . . ....1--=....... 1..,-...... . '1-. ..... ':-. . \.. . ... ... ... -:-. .. ..... .... ... ...
..:.\:: :! .\. .:L.:'...:.:.':: .:..\.:...:. , \\..:.\\.., ....\' .:..?:.....:.\':. & .._..\,.:.\:...,... . .' .:.:.:... .... .:::L...:.\ .. .::. , .; , .,.::..::.,": , .:,..t,,".L\' ....' '::.1; o....' ,,,,''':.' .'\'.
I. .. . """I.,II,,- 1... .]..... . :.-._. :'-;,...I....I [l.1fIi:'-1 . ....... ....... :'1.. . . .:-.". :J.... .. .... ..:'1.. .... .
.::.I...."..:.:;"....:.."..:: . .:: ...:...: ....:.:..\....:. ...:.:... .:... :: : ..::...:::.\.:.:.:.:... . .....:i..;...: , .:..I}.....L:.. , .:....:.:..--::.;.I..:i:..:::: i;"":...I" .:..:\...:I. i.:..:I.XI:. ...
)' \' ,;", \. ....., , /:',,, .,. '\'" 'o. , . ". . ." \\. ,.... ..\A...\ .\..... .. .,..
:I\..;.." .:.:.:.. :.:.... .:.:. ..::... .:.:.1 :.\ ....:.:... ::.... .:.:. ...:.y!:..\..... .;\...::\.. .' .:"..:.;.f::. :;..\:i... .i. ....:.:..ii.... .i ......1. i 1,; i.:-1 .:";.. .:.=::...
. ...\.:.:.:......:..:....:\.....:.:......:.:..:.: ........:......:.S..*:.:.:. 1. ..;;:-. ;;".1. .:....:.:.\:.;.:.;.;.I....i;.:.i;;...:\.::.;..:..\;.:;".i.:." .
:. .......\I.:..L.:....:....(...........:.:.:-:.\\I....:.:.:\........:..::.'!!f.\I.1(I ...... .:....:: ., ....:. , .)...:;.I..i.;"..il.. .;j.f. , ...;....;.:::I..:.. , "-=.I..i:iIJ.
.. ..f ,.. ,\,' \1 . ." "... , \' - ..' ... .. \ ..,.....\ .
i:;:;::::::{.::::::::; ' ::: L ::::t\::f:::::::' ..\:Jl::: , :t::::.:: , .:::,.:J:::::};: ::. . r. . ..,
,.,. ". \\ ," ,. . '.\':""" " ."...\ ,.. \.. ... ,... ,,' . ..c>
.,.:t,::::.;:{::t:::,:\::::;::::..;:;;\: ::t\,;:::.:... . .:.:::::K..;.::::::.:::,t}:\\:\
:....:.:\..:.:....:. .....\:(..i!:,.....:I..:.....\;:1 . ....;.;\..:.:....:.;";".......:.:.:I::..:...;,,... :.I":..:. .:;.1..::...
:.V.r::\').:::\.;.'.'V'.:.::\'.'!I i!!'...;\\.;.' \-......:\.::..:....:.::.\...::.\:.....\..:..,.:.:.,. :.:.\;.:;.:..\
,:.::}::::::f::::\:::::::;::::::.f:.::.::., \\::.;.}:..."!!.-..{;.:.'i!{:.f:t::"\.-
:j,iirti*f's.%.iffu"
.;:::::}::::::::;?:::;\:f:j! \:::.;? {:.:;:}:}:\::::
:.:. ::.........::.:......;........\..:...;.... :...:t..:.::;:I: :: .:...:.:.:I:.\::.:::.:.l..
: , J:.j:... ..\\.:.:.......:.:. ..:.\.:.:....'f!:..\.: , \\. .,:...:{.,.,..:..,f.:\;..'!.:. :.:':.:...,:..l
:.- It.: II. '.1 ...1 ..L-:1..I. "I(.. .. ..... .... ... ..... .. ....n.. .. .L. . (,
.:...::. . :.:....:....:: . ...:....::. , .-=..:.....::....:.......... .:.::......=.,\:..... .::1 i....II. ..,.:1..; ....I....I:...:
tö bb.k:.':.'..:..,.:..:.:..,..:\..'..imén na obl1:::::::L': ?'..'X::-.' .:."Wl.\""':'..::: osftá s
" - --,L , ,. .-.: Y gy . ,..\". ........ ... ..
\.:.i.:.I.i.i..I. .:.....:....\..:...:.\\;.:;,, ..;..".i: :. :.... .:.: .::.:..:.: .I.:.:....:..:.\....I.:.:.::...:.
\ \..:..:.:.:..;....:.\.{.;\..;\:.\..\.;.;.:\.:.:. i:.};;i::.\'::;..::.:'.\.::.':.:.'.:}..:..'.: ..,\:
f:;:;t }:i1::::.:::;:?
..\.,i3:.'.\..\\.. \.:.:.\I.:: ":.:\'\'': \\'.:':';'\V .:..::....:o.,.:.";...:;.::..:,.t.,...i,.,'.\..
.:..'.:.:::.:.:::.\I:.::i::.:;::.\:;.:...:.:..:::.. .:.:.;:.::. i:::{....\.:::..::.::::;:.:::. :::.:).
;:::::::r::::::::\.. I::::::;:::.:.::.\:::;:::):.::::; :.:;:.
:.:-....:11.::. .:::..:.........::.:...:.:.:..:-..:...... /.I...iil i:.. .::..:.:} :..\....i:..::.:....I.....i.:I.:.:.
..\:..:\.:::\.\.\: ..\.....:.:.\:.:\..i:.:..,.:.: :.. ..%;;.;..:.:...:.:..;...:,..;.:...:....:}\.:..:,",,\.::.
::.\:.:.....i...:.:-11..\..I.I.......::.:...:..:...... ,;?:::....:.::;::;: ..;::j;{.;:::.:.:. :{:.::.:.:::;:.:..
'. \,...:\\..':...:..'..\..\....J;..L\..:....¥....:..:.\".'/I .....\.:.\:.:.:..\...:.::.,.;.,.::.f " ..:. ..:,...:....
\::.:.:t::\::::}.:::::::::::{.\.::.;:::'., .A.. .,:.{::::::;:.:.::;.:::.:.::::::;:::.::;:.:::;..'
.'..'.\..\....\..:.........::........:.;;;:.'\'.:..:.\\.:.:.\..:=... .....::.. ...:'..'.:':.\':.,-,' ..:.:::.\.:..\'.;...::..\.:.4.....:..;\::.;..:..,'
.:.::.:\'..:..:'.:'.::\\':O.:.'::'.:.:!..\:.::.:.:..:'..:.'\... ..::::=.:..\... .::.'{\.\\.;\..(......:.:..:.:.:.s.::\.:.:.:\.. .:...;.\:... ..:.:.:.
...::::::{::::::::::.::.::.:::. :::;::t.*;:: .\.... _ .::?:;. -"\'-'.:..::::::::}:::;.:::;;:.:.::.::::::.::::;::&;:;.:
'.\.:.'\.\..,...,/r::\\,..k.'..:.'.:.:.':.'.:$.\....\.. ':':. . :.\.:\.:..w.:.:..\:.... ,r.,":.;." 'J:..;...:.:...::.:..:"\.'..:.\:.\..:...;.\:.;..\() '.:.;.f.:'\"'.:.
..:...:..:.:.:..\ .:...::...:..\....::.....:\.:..\:..I..:...::..:.:=::.....;,,..:.:.I . :.- \.:;.....\..:.;} .::......:.:..:.:.:..:...:.;...:.:.::....... .:.:...:..;....:.:.I..\\..:;.\:.:....;.;..:...;:.;\...
.) .\..'.\...\.{. ..:.\.:\.:l: .:.........:::....\\.: x .'.:.. \..::.\:.:: , k.:)'.: ,..:.:.,..._,. J' , \\..)..:.: , ....;\\.:..\.:.:. ..::..\: . , ..:.;..\: , '.:..':.;.:..:.;......:\..:.;...:.;\.:.:.:..t::.:.:.f:.\..::.,.:.i\:.:..\..
... ;""1..1. ... .1..:.,... 1 .1,..... 1 -.. ..,..., ... .1..1. 1-'-' ,.I". .:.-............____ .1- ..:.-:...., 1 ":l . . .L-::. ill. .:. .. . ... ... I...:J' ...... 1.... ... ..
.. .. .I...I.. ...1 .... ... ... .J.' . ....,. ...!II ..... .... '.... ....:.,\......... ....\..-...\....x.... \.... .......v...... .......................... ..!\........... . .......... ...................
t . ..:. .: .;:1" ::. .:.:....:.. .:.. :...1 ... . .. .. 1; .:II../.'!f...:.....::.: -..:::...::.:.....::... .:::...::.:.:..;....::/, .. .. .: ..:. :..1 1.: .:. .:.1 ,.. .. :..:1 .,
P O.. . . .. ... S \-:'{\,i3. ...\'x.I!:..'....::..\.J..\.:....:.....\'t-'. ..:. n . O : 1 . elo
. .. .:"...I.::. ...:. ..:.....:. :.:.i...:........I........:.::....::.....::....:.:..:;::..... .:....:.::.:..::.::.:.:::....i.\.;....:::.:\. .:;..:...:.:..I .;.....:...;. ...ii i:'-1 :.....;.L..:..;\..
\.,.:.'.:\.:.::.:.'.:.....:...'.\:\.,\...\:...:...':.:..\,.:\.:.:'..:1!.v" ::.\.\\:.:...\..\.,.;.,\:.;.::.;\..,\:.:.:.:.: ,. '..'{."..:'..\W.J , :: , ):.:..\..:,.\,..:".
.-.; . ........1.;... ..I 11(.:111: ..... i.I.:;. -1 I .... ..-: -.\.....I\-:"" ..1.....111 "I..":.I. ...1. . ,1 ... . r-..\-r:." :... ..:1(.:
.... ..:.i.... .:.:\..:.:.... ..::...::......:: ",.::.::.,,:,,;".-': , " ..::....:. . .:.:.... ..:I, .:: , ..". ...:..\....:.;.. i.. .... .:. .:.i::.:.";..;."i.." "::".i.;"" .:.i." 1 ::.:;\..;..: .i...;.:.;-:-;..;.I. .:.:..
. " ,.L ."." ,. _" , ", '{ ., . .... . ,'o ,...\. ".,.. . .... .... .. ....\....
.....:....:L.;.-..:.;....::....:.I.....: ..\....:;,, .....i.:.;..:: .... .:. . .:.I;''':.;...::.. ::.i.".;;.::" ...:..........;;........i... .: . ..;.\......::."iA... ...i..::.I.I......ii..... :.........
. ". ,. ,. ". "\ . '. '" . " .,:, '.', '.\' .,,. ,. ". ,. "..".. .' '\. .'\.' .'.".' .'
'..:\.:.:.:....::. .:\.:.::.:., ..:i.:.:,...:.:.....;..\\.:.;\.:\. :.;..¥..:...f:;\::.,..,.:'\:.:f:,.::.:,y:Vi.,\..;...::.,' .:.:\\".,...'t:.:...
.. ::....:.: .:\.:..:.: .:...:.:...::.....:.:\:......: ..... ......:...:..;.......:....:.i; ..:.:......::.:.::.;\.;".:.;....::..;..;....:.
.I.............I...\:......:....r....I: . 1.._.iJ":..I..::..I.:..:".:...f:.."..::",":".I:....".
. .\ I(I........ ...:....:.. .\. .:.:.. :..:.:......:..l.:....:.:..
. .. .;...' ., ,..\.:....;.::::::::;*:::;:;::::\t::
1 .:...... -=:....:...\I...\..
. ..I:I....::..:..:..
.. .\...:..
Az ál)rán is Játllató ciklus k>alal{ulása elkeriill1etetlen, de a jó tervezők tisztábdn vannak a7-
zal, milyen válto7áso]{ kéo.yszerítlletik ki 3.L újraéI)Ítést, és is nl erik azokat az osztály- és ob-
jektumszer!(ezetel{et is, amelyek scgítllLtnek az újraépftés elkerülésében. A követelmények
alap os elemzése fényl deríthet arra, me ly igények változnak maj el meg nagy valószín_űség-
ge] a szoftver élete során; a jó l)rogramszerke7et pedig fe]készül ezel{fc 3 változások ra.
Terve7ési mintáink szá nos, az újra építés követke7ménye](ént előálló szerk eL ct et meg ra-
ga.dnak; II a a mintákat a fejlesztés korai szakas7ában alkalmazzuk, segítségi.ik]{el elkerül]1.e-
tŐ a 1{ésőbl1i újraépítés de Inég abban az esetben is 11as7nosak, lIa 3. +enclszer felépítésének
befejezéséig nem tu el juk, Ilof,yan alkalmazzuk ő]{et - ekkor a rendszer mó(iosftásának
móc1ját mlltat]latják meg.
6.
y kis történelem
A gyűjtemény összeállítását Erich ]<ezdte el, PllD. szaJdolgozaláh()z lG am 91, Ga1ll92]
melyben az itt bemutatott minták lninteg)T fele kapott 11e1yel. Az OOPSLA '91 idejére már lli
vata.losan is önálló katalógllssá vált, Richard pedig csatlakozott Ericll-llez, l10gy együtt d.ol-
gozzanak rajta. Jolln ne nl sokkal később csatlakozott. Ralph a7 OOPSLA 92 ..dejé +e ett
a csopo.t tagja. Keményen dolgoztunk, 110 gy az ECOOP t93- a l{özzétellctő álldpotba 11()Z-
zuk a gyCíjteményt, de ha .na. rájöttünk 110gy egy kilencven ()ld.alas do]gozatot ott nem mu
ta tl1a tu nk be, ezért l{ivonatot készítettünk belőle, és a7t nyújtottuk be. El is fOhadták. Rövid-
del ezután (lbry d.öntöttünk, a katalógust könyvvé allkítjuk.
58 Programtervezési minták
A tervezési nlintál{ nc\'e a7 idők során némileg \Tállozott: a Burkc)lóból (\X?rapper) DíszÍt()
(Decorator) lett, a Ragasztóból (GIue) Homlok7at (Facade), a PasziánszbÓl (Solitairc) Egy-
ke (Si 191<.:ton), a ,)étálób()! (\Valkcr) Látogató (Visilc)r). Néllány 111iJltát elveteltünJ{ 1nert
nelTI tűntek eléggé fontosnal,. Ezckté51 ejtekintvL a7onba.n a. gyűjleJnén)l tölJlJé-J<evésbé vál-
tozatlan 111aradt 1992 vége óta, bár maguk a minták rcngeteget fejlődtek.
lszrevenni, hogy valami mintát alkot, könnyű. Mind négyen régóta dolgozunk objektum-
központt rends7.erckkel, így tudjuk, hogy ha valaki elég sok rends7eJt látott már, rögtön ki-
szúrhatja a terveLesi mintákat. A minták leírása azonban sokkal nehezebb, mint megtalálá..uk.
Ha rcn(lszerekct 6pítünk, maj(1. visszatel<intünk rájuk, látju.k a mi 1táJat JllUnkánkban, (ie
úb'Y leírni azokat olyanok számára, akik nem Lsmerik éSket, hogy megértsék műkÖdésÜkct
és fontosságukat, nagyon nehéz. A szakemberek már korai formájában felismerték a gyÚj-
temény jclcntőségét, dc csal{ a7oJ< értették meg a mintákat, a.kil,,- már alkaln13Lták é5J<et.
Miután a könyv egyLk fő célkitűzése aL volt, hogy a kezdéS fej]esztúknek l11egtanítsuk az ab
jektlll11küzpontÚ tervc7és mikéntjét! tudtuk, hogy érdekesebbé kell tennünk a katalógust.
Az egyes n1intákat leíró átlag()san ]{ét oldalt egy-egy részletes példával és saját l11lln]<:ára ösz-
tönző mintakóddal tíLoél is többre bóvÍteuük. Azt is belevettük a kÖtetbe, hogy az egyes min-
ták alkalmazásának milyen teriiletei, illetve lnilyen hátrányai vannak. Mindez a könnyebb ta-
nulást segíti.
Egy másik fontos szempont, anlely fdé a könyv megírása során cltolÓdott 3 hangsú]y, az
volt, hObY bemutassuk a problétnát, amit az adott minta megold. Egy probléma megoldása-
ként gondolni rá, vagy olyan módszerként, amelyet újra és újra fclhas7ná]va egyadott fel-
adatl10z iga7:ítl13.tunk, meg](önnyíti a minta lnegtanulásá.t. A pr()111ét113.l(Ör, illetve annak ]e-
írása, hogy lnilyen Öss7efÜggésben b 'zonyul az adott minta a legjobb mego]dásnak - vagyis
hogy mikor megfelelő -, persze jóval nehezebb. Általában véve mindif, kÖnnyebb tudni,
l1Zil (sinál valal<i, nlint tlldni, ll()gy nliért - a "Jniélt" pccHg a tervezési mintá.k esetében
a megoldandó problémát jelenti. A minta alkalmazási céljának ismerete igen fontos, hisLLn
ennek a]apján válas7thatjllJc ki, melyik 11intál is ](ell fclllasználnunk t ele a már létezéS rer1d
szerek felépítésének megértésében is segít. A tervcLési minta kidolgozója tehát meg kell,
hogy határozza, és le keB, hogy írja a problémát, amit az adott minta megold - még ha
a meg()1dás fclfe(le7;ése után is.
6.3 terve ési minták kö össége
Nem mi vagyunk az egyetlencl(, akil< s73.kernbere]( által l1asznált tervezési minták3t leíró
gyííjteménYLket áHítanah. ÖSS7e: egy nab'Y0bb közösséghez tartoLlmk melynek tagjait álta-
lában véve a minták! külÖnösképpen pedig a szoftvernl'nták érdeklik. Christopher Alexan-
der például az első építész voJt, aki tanulmányozta az épü]etekbcn és közösségekben fcl-
6 fejezet · Tanulságok 359
lelI-lelé5 Inintál,at, és az ilyen mintáJ< 311{otására kifejJesztett eb'Y "minta11yelvct,r. Mllnl<ája
mindn.yájul(13. na.gy 11atássaI volt, ezért ér(lemes rÖ\Tidcn összevetni 3 Ini ercdményeinJ{et 3.2
övéi'vel. EZlltán másol<nak a sz()ftvernliI1tá.k terén végzett kutatásaira is kité .-ün {
Alex de mOn yelvei
Munkánk sok szclnpont11{)1 hasonlít Alexanclerére. Mln.dkcttő meglevő rcnc)szerek vi7Sgá-
latára és bennük minták l{ercsésére épll1. Mindkettő sablc)no1<at all(3.lI11az a mi11tál{ leírására
(bár a mi sablonja'nk teljesen más jeJlegűck). Mindkettő hétköLnapi nyelven, sok-sok pé -
(iávallTIutatja be a mintá]{at, nem formális nyel,rek scg'tségével, és rnindkctt(5 leírja, lnire
allnlk választ az egyes lnintá]{.
Mindlzonáltal elté .ések is jócslcán aciódo.ak:
1. fázakat több ezer éve éIJít az emberiség, íh'Y rengeteg klasszil<lls péJda. áll előttünk,
atnelyckből nlerÍtlletünk. A szoflverfendszerck építése aZOnlJ3.n \lisz()nylag rövid.
időre tel{int vissza, és ,klass7ikussá seIn túl s()]< vált l(öziili.ik.
2. Alexélnder sorrcn(lel á]lít fel a l11inták all{almazása.ra.; mi nem tettC l{.
3. AlexancJer mintái a llangt;úlyt a megoldandó prc)I-JJéJJl.3ra fektetik, míg a uli tervezési
mintáll1k a megoldásllfjáJ< le részletesel111en.
4. Alcxancler állítása sze .int mintáib()J te]jes é})i.iletek épit]letől( icI. Mi nem állítjlJk,
l10gy mintá.ink leljes progra nokat a(lnak l<i.
Amikor Alexander azt á.llítja, ll()b7 pusztán nlintái egYlnás utáni alkalnlazásáv3.l111cgtervez-
lleti.iJ1k egy llázal, LIgya]laZ a céllebcg a szeme előtt, lnint a7()knal( az objektumközpont(l
tenrczési mód.S7ertan.t okta.tó szakeolberel{nek, akik szigorú szabályokat álJítanal( fel a ter-
ve7és lépéscilc. Alexanc]er persze nem taga(ija a kreativitás szükségességét. Eh'Yes 1]1in.tá.i
tl1egl<:övctelik, l10gy .snlerjtil{ azokllal< az embereknek a szokásait, akik 11aJd az é!Jülelet
lakjá k, a tervezés "köllészetél1e't vetett llite pe(i ig ar &ól ál ulkc)(liJ{ 11.ogy a mintanyeJv iSlne-
rete önmagát)an nem jelenti a tlldás teljességét 1 . Mincia7()Jláltalleírása arr()l, llogyan építik
fel ct mintál< a teljes szerkezetet, világossá teszi, ll()gy a nlintan)'elve]{ a tervezési folyamatot
]<.örüll13tárolllat{)lJ11á és egyszeruen megisJJ1.ételllctŐ\lé tel-letik+
Alexander nézőpc)ntját alapul véve a terve7ést befol)'ásoló "eről( c" összpontosítottunk.
I-Iatáára igye]<eztün.k jobb3.n megérteJ1l, llogyan és J11ilyen 1\..övclkezl11énye]{kel alkaJma7-
llalók tervezési 111inláink, f()fJllálís ábrázolásuk miatt viszont nem aggódtunl{. A formá]is áb-
rázolás természetesen. segítllctné a minták alkalmal:ásának a.utomat+zálását, de jelen pilla-
natt)an soJ<lcal fontosabb 11()b7 feJtárjul( a tervezési rnint3.k lnűkc)clését, tnint llogy forrnali-
7áljuJ< ő (et+
Alexander mcgllatárc)zása szc'rint az e l{önyvrben bemutatott 11lin.ták nem all{otn.ak 111inta-
nyelvet. lIa a mana.pság készített s70ftverrendszerek változatosságára gondolunk belátl1at-
1 Láscl: 1he poe1r:y aj IllC lan.PJA.al.;e [AIS+77J.
360 Programtervezesi mintak
..dl
juk, hogy nehéz is lenne egy " eljes" mintal{ész etet összeál ítan,i, ami az a kal lazások er-
vezésé11L lépésrőllé Jésrc vezető utasításokat adr Egyes programfajták - például a jelen-
"éskészítő vagy űrla os programo {esetében persze ezt is rnegte11etjük, de ez a katalógus
csak egymáshoz '""apcso ádá minták gyűjteménye, nem eljes mintanye v.
Igazság szerin. úgy gondoljuk, valószínú1eg soha nem is lesz te jes mintanyeJv szoftverrend-
szerek számára, bár olyat min ig lel1et (és íteni, am teljesebb a korábbjaknál. Ilyen kiegé-
szítést jelentl1etnek például a l{eretren szere 1:>< és használatuk lJoh92], a felhasználói felület
tervezési mintái [B]94], az elemzési 1 .ntá r rCoa92], illetve a szoftverfejlesztés más szempont-
jai A tervezési minták csu pán egy szeletét jelentik egy nagyobl) "szoftver-mintanyelvn.e .7".
Szoftv inták
Első közös élményiinket a szoftverépítés kutatásának terü etén az OOPSLA '9] -en, a Bru.ce
Andert,on által vezetett műhe]yben szereztük, an ely egy szoftverépítőknek szánt kézi-
könyv ]{idolgozásán fáradozott. (Bár a "Sza tverépítők enciklo Jédiája" név jobban illett vol-
na rá.) A műhelynek folytatása is Jett; számos találkozó követte, például 1994 augus7tusá-
ban az első, a lJrogramok mintanyelveivel foglall(ozó l{onfcrencia. Ennek llatására jött létre
a szoft\Tertervezési tapasztalatoka dokumentálni kívánó l{özösség.
Természetesen mások 's tűztek ki 1asonló célokat. D()nal Knutl1 munkája, a The Art of
Computer Progl-'alnming CA számítógép-programozás múvészete) fKnu73] - bá az algor.t
musok leírására öss7pontosított egyike volt az első kísé letel{nek, amelyek a tapasztalatok
egybegyűjtésére · ányultak. A feladat azonban túlságosan hatalmasnak bizonyult ahI oz,
}10gy a végére ehessen érni Egy másik, szintén az aIgoritmusol{43 középpontba helye 6
tervezésmóds7ertani gyűjtemény volt a Graphics Gems sorozat [Gla90, Arv91, Kir92], míg az
...
Egyesült Allamok 11ad.ügyminisztériuma által támogatott DOlllain Specific Software
Arcl1.tecture program rGM92] vizsgálatának tárgyát a7 a .chitektúrákkal kapcsolatos infor-
máció -- répez ék A tudás alapú szoftverfejlesztéssel foglalkozó közösség a s oftverrend
szerekkel által.inosságban kapcsoI.ltos tudást gyűjti öss7e, és még számos csoport célja 1a-
sonlíllega ább egy kicsit a mién :>< e.
James COl)lie Advanced C++: Programmil1g Styles and Idioms CC++ haladóknak progra-
mozási stlusok és nyelvjárások) [Cop92J cí .l1Ű könyve ugyancsak l1atással vo t ránk. Az ő
mintái a mieinknél sokka jobban kötődnek J. C++ nye vhez, és a kötet több alacsonysz.ntú
mintát is tarta .maz, de szárnos átfedés található, amit könyvünkben Je eztün,,- is. Jim a min-
tákat (uta ó közösség munkájábdn ak ívan rész ves ; je]en eg a szoftver ejlesztő szerve e-
tekben dolgozó emberek s erepéne ( eírásával foglalkozik.
Számos más helyen is talá hatun { mintaleírásokat. Kent Beck vo]t az első, ak+ felhívta.
J. zoftve fejlesztők figyelmét Cl1ristop11er Alexander munkájára. 1993-ban cikksorozatot in
d tott a The Smalltalk Report-ban a Sma halk m'ntá'ró . Peter Coad is jó -deje gyűjti a mintá-
kat; a rólul{ Írt dolgozata [Coa92] -:, á 1U rra legalábbis úgy túnik leginká Jb elemzési
6. fejezet · Tanulságok 361
mintákat tartdlma . LegutólJb. 11un {áját e könyv írásako még nem láttuk, ele llldjul{, hogy
újabb mintákon d.olgozik4 Tudomásunk van több folyamatban lev{5 könyvről is, amelyek
a m.intákkal foglalkoznak (töblJek között a Paltern Languages ofPrograms konferenciáról is
lnegjelenik majd egy), de még ezel(et scm volt alkalmun. ( szclnügyre vennit így csak annyit
tel1etünk) hogy tudatjul{ az Olvasé)val, újabb munl{ák várhat{)k e témában.
6.4 Meg ívó
Mit telletünk, 11a érdeklé5dünk a minták iránt? Elős7ör is 113sználjuk oket, és keressünl<- ma-
gunk is a munkánkhoz illő mintákat Az elkövctkezen{ié5 ével{ben rengeteg k()nyv és cikk
lát majd nal)világol e témában., így a keresést számos forrás segítl1cti. Emellett célszerű elsa-
játítani a terve7ési lninták nyc.Jvezetét, és a tervezéssel kap(solatos vitál{ során l11unkatársa-
ini {kal 11asLnálni G.ond()Jkodjllnk a minták fogalmaiban.
Másodszor, legyünk kritikusak. Ez a tcrvczésiminta-gyííjtem.ény nem csupán a .11i l{emény
munkánk eredménye, llaneln aLon töblJ tucatnyi k 'itil\:usé is, akik észrevételcikkel segítet-
tek minket. Ha az Olvasó észreves? egy hibát, vagy úbry ér71, egy ponton részletesebb rna-
gyaráLatra lenne s7ükség, 1e llabol.zon kapcsolatba lépni velünk. Ugyanez persze bármely
más m.intag)'Újteményrc is érvényes: mondju ( el véleményi1.nket 3. szerzőknek A tervezési
minták egyik nagy előnye, ]10gy all{a.lmazásuk révén a tervezési döntések nem ösztönösen
születnek, így pontosan megfogaJmazhatJuk, mit miért javaslun (. Ebből kövel7ezil{ 110gy
,
a mintál{ llibáira is könnyebll rámutatni és a szerzővel \Titába szá.llni. Eljün}{ a lehet6séggel
IIarmadszor, fedeLLlik fej a saját magunk általl1as7nált n1intá.kat, és írjuk e azo {at. Legyen
ez a progra.ffi{lokumentáció részL, amit megmutatunl( másoknak is A n1inták fcJfe(le7ésé-
l1ez nem kelll{utatónak lennünk, sőt, a lényeges minták megtalálása szinte le}1etetlen, lIa
nelTI rendelkezünk kellő gyakorlati ta})asztalatta]. Nyugodtan ()ss7eállít]1atjlll( saját minta-
gyűjteményünket is, la van valaki, aki segít gatyába rá7ni őket
6. Búcsúzóul
A lcgj()l)h tervek számos terveLési mintát l1asználnal{ fcl, an1elyek egymással üsszefon()dva
segítk sikerre a terv egészét. Al10gy Clllistopller A]exander l11ondja:
.Építkezhetünk úgy, hogy a mintákat lazán összefűzz1ik: ekkor az éPület önálló mÍntákból
áll nlajd. Neln lesz "Síil11 n , nem lesz" mély)!. De 11a a l11i11tákat úgy rakjuk össze, hogy több
is átfedje egymást lJg1Janazon a teren belül, az apró tél'" szá1nos jeletltést rejt nla}dJ és ezek
síirU ..zövedékéb61 az ép111et lnélységet nyer.
A Pattern .Lalzguage lAIS+ 77, xli. oldal]
. I ..
a[áírás (szig na túra) Eg)! művelet neve, pa.ra.métcrei és visszatérési értéke.
alosztály Másik osztilytól ijr()]{]{5 osztályT. A C++-tJln az alosLtályl származtatott osztálynak
(cierj\Ted class) llÍ\'jál{.
alrendszer Adott feladatkört együUl11líkÖdve e]]átó osztályok rÜggetJen csoportja.
altípus Egy típus akkor altípusa egy másiknak, ha felülete tartalma7.7a a rnásik típu[-, felÜletét.
átruházás (képviselet. delegáció) Megvalósítási mÓds7er, amelyben az objekturllok más objek-
tUlTIol(llOZ továtJ11ftjá]( \'3.gy más ()lJjel<Lumo](f3. ru11{tzzál{ ál egyes l{érelmel{ \TégreJ1ajtás3t.
A 111eglJÍz()tt lZ eredeti objeklllm ne\IélJcn végzi el a kért 111.űvclctet.
barát osztály A C:++ n}'clvbLn ()IY-ln osztály, amely egy tnásik osztály i(i.alli1102 és n1ű\'cle-
lethez ugyanol Yln jC)gC)SllJtságokkal rcnc.le 1 ke7iJ(, rnint mlgl l lu la jclonos osztály.
csatolás Annak fokl 11()gy"F az egyes szoitverc)ss7ete\ről, rncnnyjre fliggncl( egYI113Sl{)!.
destruktor (megsemmisítő függvény) A C++ nyelv11el1 ol)ran művelet, ami J1li.n(ln esetl)eIl au-
lornatlJ{Usa.n lneg11Í\Té)d.j]{,aI11il(or egy objel{tull1 törlésére kerul sor
dínamikus kötés vagy késői kötés Kérdem futás közbcni Összekapcsolása cgy objektummal,
illet\'c annak egy nl(f/eletével. A C++-l)an csak a virtuális fliggvény'ck kés(Ji I,ötésííck.
egységbe zárás vagy betokozás Ábrázolás és mcsvaIÓsítás objektun1ba rejtésének crcumé-
n)7e. A7 ábrá.zolá.s így nenl látl1ató és élZ otJje]{tUtl10n kívülről kc)zvetlen.lil nem elérllető; el
érése és lllÓ(losítása ](1.z2_fólag 111(í'veleleken. keresztüllellelséges.
364 Programtervezési minták
együttműködesi diagram (interakció-diagram) Diagram amely d kéreime <: útját ábrá70lja az ob-
jektumok ]{özött
e emkészlet üsztálygyűjtemény, amely hasznos szolgálratásol<at biztosítJ d.e ne 1 llatározza
meg egy alkalma á S7erkezetét
elvont csatolás Ha adott egy A osztálYI amely a Bevont osztályra hivalkozik l azt mondjuk,
A elvontan csatQ t B-hez. Lzt azérll1ívjuk e]vont csatolásnak mert az A egy bizonyos ohjek-
tum.típusra, és nelll konlaél objeklumra ] vatkozik
elvont művelet Olyan művelel, amely megad egy ado l aláírást (szignaturát)1 de anna { 111eg-
valósítását nem tarta laZZa. A C++ nyelvben a7 e]vo 1t muvelLt megfelelője a tisztan virtuális
tagfüggvény
elvont osztaly Olyan osztály, amelynek e s6dleges fela(i.ala egy felület meghatározása.
A7 elvont vagy absztrakt osztály l11egvalósítát,ának egy részé VdbY egészét alosztályokra
b;"zza. Nem péld.ányosítható.
fehér dobozos újrahasznosítás üszt.ilyöröklésen alapuló újrahasznosítási módszer l melynek
során egy alosztá y fel113s z nálja s -C lőosztá.lyának felületét és megvalósítását, de 1102záfér-
het a szülő egyé11kén.t rejtett adata 10 is.
fekete dobozos újrahasznosítás Objel(tumösszetételen alalJuló újrallasznos"'tási lnódsze.
Az összetett objektumok nem fedik fel belső felé Jítesüket egynlás számára, e7ért hasonlít
ják őket a repülők fekete dobozá110z
felület (interfész) l:gy o JJe]<tum m.űveletei által meghatá üzott aláíráok (szignatúrák)
összessége A felüjet azon kéreIlnek l1alo1azát írja, e, amelyeket az obje (tum tel.esítllet
felülírás vagy felülbírálás (Szülőosztálytól örökö t) 1 űvelet új meghatározása egy alosztályban.
fogadá (vevő) Kérelem célobje I(tuma.
ismeretség (ismeretségi viszony) Az az osztály, ame]y egy másil{ osztá yra hivatl{ozi {, ismeret-
ségi visLonyban á ] a lnásik osztáilyal, vdgyis iSlnerfJse annak.
...érelem Az objektulTIok akkor hajlanak végre egy rnűvdctet l amiko egy lnásik übjektu 1-
tóI a m(íveletnel{ megfelelő kérelen1 érkezik. A kérelen1 gya]<ran 11asználl másik 1eve az
üzenet
A függelék · Szószedet 365
keretrendszer EgyüllműkÖdő osztályok halma7a, arnelyekből egy bizonyos sLoftvertípus
Szál11ára újra.llasznosítllató te"v készÍt1eté5. A keretrendszer a s70ftvcr szerl(ezetét eJvont
oszlályoJ{ra l)ontja. mcgllalározza azok fclelősségi J<örét, .IletvL a kC)7f>ttü 1< levő kal)CS()lato-
kat, ezáltal útmutltást ad a prograITI felépítésél1.ez+ A fejlesztő a ]{eretrendSZCr1 (1 6 ry s7al)J1at
ja ef,Y a(iott alkalmazásra ll()gya ]<eretosztál)'okból példán.yoka.t és alc)s7tályokat llüZ létre.
konkrét osztály E]v"on.t múvclclekkel neJl1 rendcll(Lző osztály, amely jJéld.ányc)S1t]lató.
konstruktor (létrehozó függvény) A C++ nyeJvben olyan rnűvelet, an1elynck meghívására új
pél,- ányoJ( létrcllozásak()f alltomatil(usan sor keru].
metaosztály Az osztályok a Smalltalk nyelvben objektlJmok. A mctaosnály az osztályobjek-
tllffiOk osztálya.
mixin osztály Vdb>Y bekeveredő (bekevert) osztaly O yan oSLtály, al11e]yet más osztályo1{]{al va-
ló, öröklésen keresztüli együttm(íl<ödésre terve"ztek. A 11lixin osztályok általállan elvontak.
művelet Az ()11jektuJJ1.okba.n tárolt adatokat csak az objel<tum lnűvclLtei érlletik el E művc-
letek végrellajtására akkc)r ](erll] sor amikor az olJjel{tumlloz l<érelern érkczil( A C++-IJan
a rnűvelcteket tagfüggvényeknek llÍ\rják, 3 Smalltalk a metódus l{ifejezést llasználja
objektum futásidejű egyed, an1ely mind az adatokat, mind a adatokon műveleteket végző
cljárásokat tarta nla2za.
objektumdiagram Diagrarn, amel)' egy ad.ott objcktl1mszerkezetet ábráz()l futásidőben.
objektumhivatkozás Más objcl(lUmC)t a7onosító érték.
objektum-összetétel Objektumul( összcszcrelése', rnelynek célja összetettell11 visell{cdés ki
a.lakí tása .
osztály Az osztály llatározza meg egyobjektum feJületét és n1ehY\ralósitás3.t, valamint a7
osztályadja meg al o11jektum belső álJrázo]ását, illet.ve az()kat 3 rn(ívclct,=--ket, anlelyeket az
objektum \'égrehaJtllat
osztálydiagram Osztályokat, aLok belső szerkczctét és múveletcit, illetve az osztályok kö-
zötti statikllS kapcsolatokat ábrázoló diagram.
osztályművelet Olyan n1űvelet, arnely nem egy önálJó objektumra, hanenI egyosztályra irá-
nytll A C++-ban az ()sztálYlTIűvelctck megfe]elői a statikus tagfüggvények.
366 Programtervezési minták
öröklés Olyan kapcsolat, amely egy egyedet eb'Y másikhoz viszonyítva határoz meg. Az DSZ
tályöröklés egy vagy tÖbb szülőosztályból állít elő egy új osztályt, llnely rcliiletét és megva
lósítását a sZli lő]{.től örökli. Az ú j osztályt alosztálynak "ragy Ca C + +-lJan) származtatott osztály
nak hívjuk. Az osztályÖrÖkJés a felületöröklést és a megvalósítás-öröklést egyesíti: a7 előbbi egy
új felületet ír le egy vagy több már létező felület segítségével, míg az utÓbbi egy új meJ:,>va-
lósítást, 1nár lét<.:Ző 111egvaI{)S1táso!( 3.lapján.
őstípus SZlil(5t11)llS amclyté51 eb? 111.ásik tí!)LIS örc)]«()l.
összesítő kapcsolat Az összesítéS objekturn viszonya a7 őt alkotó részekhez. A példányok (az
öt,szesíté5 obJel(tLI1110k) rés7ére ezt 3. kapcs()lalc)t az osztály llatár()/:za Jl1eg.
összesítő objektum (aggregát objektum, aggregátum) Olyan objektum, amely alobjektu 110kból
élliil fel. Az éll()11jektumol( az ()slesíté) olJjektum ré7ei, mel)Tekért iZ aggregátum felclő.
paraméterezett típus Olyan típus amely egyes összetev6 típusait nem határozz:a tneg ponto-
sa.fl; ezeket llaszná.latl(or paranléterl(ént 1<3J)ja llleg. A. C++-1Jan a parlméterczett típusokat
sablonoknak (teI11p]ate) llívj1.l(.
példányváltozó Egy cJl)jekt11111 ábrázolásánal< egy részét megl1atározó adat A C++ az adattag
l\.ifcjezést Ilaszná.lja rá.
privát öröklés A C++ nyelvben olyan osztály öröklése, amelynek kizárÓlag a megvalósításá-
ra van szükség.
protokoll A. felület f(JgllJ11ánal{ })ővÍtése a feld.olgozl13.tó l(éreloleJ< sorozatával.
szülőosztály Olya.n ()sztáJYJ aJl1elytól egy o1{lsik osztály örököl. SziI10ni111ái aszuperosztály
(Sma11ta.ll(), az a[aposztály (C-+) é a7 ösosztály.
tervezési minta A tervezési minták rendszerezik, clneve7ik, és m.egma.6ry-ará77.ák az objek-
tunl]{ŐZpontú ref1dszcrcken lJeliil gya]{ran. ismétlő(i.é5 111egoldásokat. LeírjáJ< a problémákat,
a ráju l{ ad()tt válasz()kat, j]Jetvc 110gy l megoldás Illikor llkainlazllató, lnilyen l<övetkezl11é-
n)Tekkcl és 111e]lék113t3.Sokk1l ke]l SZáOloll1unk, vilaminl ötletel(ct ad.nak és példát 111utatna]{
a megvalé)sftásra · s. A meg()lciás 3. felac atll()Z ilJeszkeclő oSLtályük és olJjektul110k álta]án.os
én'é.oyíí clrcn(Jezése, 3.11lit a l11cg\lal()sítdssal együtt lZ l(i.ott J{ör 1)rCL:etllez ke]l igazítani.
típus Egyaclott fellilet neve.
többalakúság (polimorfizmus) Az összLegye7tetbető fclüktLÍ objektumok [lltáid{jben egy-
111ással vil{) 11elyettesítésének képessége.
u
· · J
il.s k
A lcönyv során a fontosabb foga.lll1a { illusztrá.lásá.ra. clia.gra .nokat llasználtunk. Eg)resel( nin-
formálisa]z" v()ltak 1 J1élci.álll egy IJárbeszé(lablak képernycJI(épének ,ragy egy (Jbjeklllmfa se-
matil(us ra.jzá.nak fOflnájá.t öltötték M3.guk a tervezési 111inták azonban er1nél fOftl1álisal)})
jelölésrendszert alkalma?oak a7 ()sztály(}k és ()lJjektllmcJk kC)7()lti kal)CS()lat()k )emutalásá-
ra: ez 3. függelék ezt 1TIutatja ile részJetesel111en.
Három ]<.ülön.llöző diagramtípust 113.szná]lun]<:
1. Az osztályd;agramok a7 osztáJy()kat, azcJk szerkezetét J ,'a]amint a l{()z()ttü]{ levő stati-
l<:us kapcsolatokat ábráLolják.
2. A7 objektumdiagramok egy adott o11jektl1 mszerJ<e7etet fl1utatna]{ 11e flJ tásidt511en.
3. Az együttműködést diagramok Cinterakció-dia.gra .DO]{) 4. kérelJl1.eJc útját 111.Ut3.tjá]{ a.2 011-
jeklum()k kC)7C)ll.
Minden tervezési minta legalább egy ()sztály(iilgrall1()ttartalma7, a tc)1111i alkalmaáslrl ak-
l{or l{erült 50f, al11.11<or a tárgyalás e7t ln.egkívánta Az l1sztály- és olJjel<tul11dia.gralTI.ok az
OMr-11 (Ol)ject Mod.cling lccllnique) modellen alapulnak lRBI)+91, Rum91]1, lZ együllmííl{ö-
désj diagrarnc)k az ()hject()ry lJC 092], illetve a HOOC]l 111ódszeren rJ1oo941.
. 1 sztálydi gramo,
.A B.l ábra az elvonl és konkrét oszt.ályok OM1-" jelcjlését n1l1tllja. -LA...z (Jsztályc)kat egy (i.C)[)OZ
jelöli, amelynek felső részében alosztály vastag betűs neve olvasllató. Az osztily 1,ulc5J1J.Ű-
veletei az ()sztály ne\'c alatt jelennek mcg ezek llalt pedig az esetleges JléldányváIl()Z(Jk.
] Az Orvff aZ oszlálydíagr31nokra is objektu111diagranl nével11livatkozik, n1í ezt kíz,irólag az ü]JjekLunlszerkezete-
kel ál)rá701ó cliagranl0k rés7érc tartotttik fenn.
368 Programtervezési minták
A típusinformác'ók nem kötelezőek; mi a C++ programozók s70kásait követjük, akk (a
visszatérési típus jel7éséhcz) a típus nL vét kiteszik a művelet, a példányvá tozó vagy a teny-
leges paraméter neve elé. A dőlt betű arra utal, hogy a7 adott osztá y vagy m(ívelet elvont.
Egyes tervezési mintákban segíthet, ha látjuk, l.ollivatko7.1ak az ügyfélosztályok résztvevő
osztályokra. Amikor a minta résztvevőként tartalmaz egy Ügyfé osztályt Cvagyis annak
a mintában fclelősségi köre van), az Ügyfél szokványos osztályként jelenik meg. Ilyen pél-
dául a Pehelysu yú minta. Ha a mintának azonban nincsenek Ügyfélésztvevői (vagyis a2
ügyfeleknek nincs feladatuk a mintában), de feltüntetésük világosabbá tesz', mely résztve-
véSk lépnek ka,pcsolal11a ügyfelekkej, az Ügyfél osztályokat 3, Blb áL1rához 11asonlóan szür
ke betűkkel jeleztük. Erre a Helyettes mintánálláthatun <: pé dát. A szürke jelzés a7t is egy-
értelművé teszi, hogy nem véletlenül maradt ki a7 Ügyfél a résztvevők tárgyalásából.
A B. - c ábra különböző oS7tályok kö7Ötti kapcsolatokat lnutat. Az osztályöröklés OMT jelö-
lése az alosztályt (az ábrán VonalAlakzat) és szülőos7tályát (Alakzat) összekötő háromszög.
A rés7e, il etve Összesítés kapcsolatot ábrázoló objektumhivatkozást rombusL a apÚ nyílhe-
gyű vonal jelzi, ami az összesített osztály (pé dául az Alakzat) felé mutat. 1 la a nyílhegyű
vonal végén nincs rombusz, akkor ismeretségi vis7:onyról van szó (például a VonalA1akzat
egy Szin objektumra 11ivatkozik, a nelyen a különlJöző alal{zatok osztozkodllatnak). A .1i-
vatkozás nevét a kezdőpont közelében néhol feltüntettük, hoby 11eg cülönböztessü k más
Ili\'atkoz3.Soklól. 2
Egy másik fontos dolog annak jelLése, mely os7tályok példányosítanak lnás osztá yakat.
E7L szaggatott nyílhegyű vonallal ábrázaltuk (az OMT ne.n támogatja). Ezt hívjuk Jétrehoz-
za" kapcsolatnak; a nyíl a példányosítás céljául szolgáló osztályra mutat. A B.lc ábr.ín
a LétrehozóEs7J<ÖZ VonalA1a.kzat ()bjektumokat hoz létre.
A7 OMT jelÖlése az "egynél több" fogalmára a teli kör. 1 la ilyen kÖrt látunk egy hivatkozás
előtt: az azt jelenti, hogy több objek1umra h'vatka7.unk, illetve több objektumot összesÍ-
tünk. A B.lc ábra azt mutatja, hogya Rajz több Alakzat típusú objektumot összesít.
Végezetül, :lZ OMT-t álkódos (pszeudokódos) je17ésekke egészítettü 7 ki, hogy felvázol-
hassuk a műveletek megvalósítását. A B.ld ábra a Rajz osztály Rajzol műveletének álkód-
ját tartaln1azza.
2 Az OMT aZ osztályok között "asszodációkat" is meghatároz, amelyeket aL osztályok dobozai kÖLÖll egyszeru
\onalakka] jelez (az aszociációk kétirányúak). Bár elemzés közl)en llasznosak lellelnek úgy érezti.il{ az asszo-
ciácié)k lúlságosan el\Fontak alll1oz, 110gy a tervezési mintJk1Jan kapcsolatokal fejezzünk ki vejük] lliszen a trve-
zés során úgyis le ke]] lnajd őket fordítal1unk objektuln11ivatkozá.sokra vagy mulalók:ra. Az objektumhivalkozá-
sok cInellett l)cfcJé irán'Ylllnak így jolJl)an megfelelnc]{ a nlínket érclcklő kapcolat()k számára. CA H..ajz !JéltlitÜ
ismeri az Alakzat ol)jck1tln10kat, 3.. Alakzatok azunban nern ismerik 3.7 ők.el tartalmd.ló RajZOL. Fzt a viszonyt
nem jhel pusztán asszociáci()lclcal kifejc7ni.)
,
B függelék · Utmutató a jelölésekhez 369
B. Obj ktumd" ramok
Az objeklumdiagramok kizárólag példányokat ábrázolnak; a tervezési minta objektuma -
nak pillanatfelvételét. Az Gb °ektumnal{ a7 "egy Valami' nevet adtuk, allal a u Valami" az ob
je <tum osztálya. Az objektumo]{ jele a könyvben (némileg eltérően a sza.bvá.nyos OM1-től)
a lekerek"'tett sarkú t,dobo.l" (négyszög), aJnelyllen az objektum nevét vonal választja el az
esetleges objck um11ivatko7ásoktól A hivatkozott objektumok a nyilak mutatnak. A7 ob-
jcktumdiagramra a 8.2 ábrán láthatunk pL dát.
ElvontOsztályNév
KonkrétOsztály év
EfvontMdvfJl tI ()
Tfpus ElvontMtIveJ8t2(}
Műve let 1 ()
Tipus MOvelet2()
pél dányVáltoz61
TIpus példányVáltozó2
(a) Elvont és konkrét osztályok
I Ügyfél J
.... .......... -11...1 "1..-......... ...- ...... ..-.........-..-
J .avi{! :
. ..:S . I
.........................1............................... 1
. ..
(b) Résztvevő Ugyfél osztály (balra) és rejtett Ugyfél osztály (jobbra)
Rajz
a!akza D ..
Al kzat
I Létre ho z6Eszköz -------______m_m_________m VonalAlakzat
SzCn
(e) Osztálykapcso/atok
Rajz
for minden alakzat {
Ra' 010 O - ---- - = = - - - - - -------- - - - - - - - - - - - ---- -- a[akzat-> Rajzo1()
}
(d) Álkodos jelölés
8.1 ábra
Az osztálydiagramok jelölese/
370 Programtervezési minták
egyRajz
alakzat[O]
a!akzat[ 1 ]
egyVonalAlakzat
egyKörAlakzat
8.2 ábra
Az ob/ektumdiagramok je/ölései.
egy étrehoz6Eszköz
egyRajz
egyVonalAlakzat
new VonalAlakzat
---------------------------------- --------------------------------
Hozzáad (egyVonalAlakzat)
---
Frissft()
Rajzol ()
1
I
B3 ábra
Az együttműködési diagramok je/ölése/.
B 3 E yüttmúköd si
.
lagr
ok
Az Lhryijttműködési diagramok a kérelmek végrehajtásának sorrendjét mutatják az objektu-
mok között. A B.3 ábrán !evéS diagram aLt mutatja, hogyan adunk egy alak7atot egy raj7hoz.
AL együttműködési diagramon a7 Idő fcnlrőllefelé "folyik"; egy-egy objektum élettartamát
folytonos függéSleges vonal jelzi. Az objektum.ok clneve7ésére ugyanazok a szabályok yo-
natko7nak J mint a7 objektumdiagramoknál, vagyls az osztály neve elé az "egy" kerul (pl.
egyAlakzat). Ha egy objektum példányosítására csak a diagralll által rögzítctt időpont után
kerül sor, ezt sLaggatott függőleges vonallal jelez7ük, ami a létrehozási pont'g ta t.
,
B függelék Utmutató a jelölésekhez 371
A7t, ]10gy egy objektum aktív, vagyis kercImet s70JgáJ ki, a rövid.elJb oldalára állított ("füg-
gőleges J ') téglalappa] jelöljiJ]{. A művelet más ol)je](tumokat is felkérilet, czc!(el a kéreIme-
ket a fogadá olJjcktumra mutató vzszintcs nyilak tTIutatják; a kérelem nevét 3. nyíl felett
tÜl1tetjük fel. Az. objektum.lét.+e110zására irányuJó ]{érelrTIcket szaggatott nyíl11cgyCí vOl1allal
jelezzük, az olyanol(3t pedig, amelyek magára a küldő olJjektulnra vonatkoznak., visszal{a-
nyarodó ny"'llal.
A B.3 ábra azt lnutaljl, 11()GY a7 első kérelem a7 egyLétreI10zóEszkc)7-től érkezik, é5 az
egyVonaWal{ZaL létrehozásá .'a irányul. KésőbLl az egyVonalAla]<7at nHozzáad)'-{)cJik az
egyRajz-h_oz, e nlűvelet pedig a7 egyR3jz-ot arra kéri, .h.ogy saját magának l{űldjön egy
Frissít kérelmet. Megfihryel11etjük azt is llogy a7 egyRajz a Rajzol kérelJnet a Prissít művelet
részeként küldi el az egyVonalAllkzat-nak.
"
I
Ebben a függelékben azokal az alaposztalyokat isrnertetjü (} ame yeket az egyes tervezési
lintákhoz mcll(kel C++ péld kódokban 11aszn.áltunk. SLánd.ékosan egyszerűek és számu-
l(at is s7ándékosan tarto tuk alacsonyan. A 1{övetkez6 osztályok .ól van szó:
List - objel{tumol{ endezelllistája.
· Iterator - egy összes.tő objek um (aggregátum) objek unainak sorrend Jen törté-
nő e érésére szolgáló felület.
LlstIterator - bejá ó a List bcjárásához.
· Poinl - kétdimenziós pont.
Rect - tengelyek11ez igaz/tott téglalap.
A C++ ebryes újabb szabványos típusait nem mind.en fordítóp ogram imeri PJnennyiben
a bOG 1 esetében e7 a J1elyzet, 1 atároz uk meg ezt a típus' magunk:
typedef int boolj
const int true = 1;
const int false = O;
C.1 L.st
A List osztá ysablon a apszintű tároló biztosít objektuI11ok rendezett listájándk táro]ására.
Az elemeket érték szerint tárolja, am. azt jelenti, 110gy a beépített lípuokkal ugyanúgy mű-
köd ok, mint az osztálypéldányokkal. A List<lnt> például egés e {(int) listáját adja rn.eg.
Mindazoná lJJ a legtöbb lninta a List-et arra l1asználja, 110gy obje {tumokat címző mutató
kat tároljon - ilyen pélc dul a List<Glyph*> - ezért a .List l1eterogén listákllOZ nem al-
kalmaz11ató.
..
3 4 Programtervezési minták
A kényelerll kedvéért a List a veremlnűveletckllez s:zinc)nim.á]<at is biztosít, Í&ry a ListLt
vernlekllez llasználéJ l{{)d.ban ne 11 kell új osztályt meg]1atároznunk, 3.illi áttekil1t]letőbbé te-
szi a programot.
template <class ltem>
class List (
public:
List(long size - DEFAULTLTST_CAPAC1TY);
List(List&) ;
List():
List& operator=(const List&)i
Jang Count() const;
Item& Get(Jong index) const;
Item& First() const;
ltem& Lasl() const;
baal Includes{const Item&) consti
void Append(const Item&)i
void Prepend(const ltem&)i
void Remove(const Item&);
void RemoveLast{);
void Removerirst();
void RemoveAll{);
Item& Top{) const;
void Push{const ltem&)i
lte.m& Pop () ;
} ;
A ]<.övetl{czőkben a fenti rnűveletekel részletesehlJen is bcmulaljlll<.
C függelék · Alaposztályok 375
létrehozas, megsemmis tes, előkészftés és ' rté ,..adas
List(long size)
.Előkés7íti (inicializálja) a listát. A size (nléret) paraméter a.2 elcmek kezdeti számára utal.
List(Ljst&)
FeJi.ilbírálja, az alapérte111ezettlnásoJó konstruktcJrt az adattagc)k megfelelő elé5készítésélle7.
-.List ( )
FclsLabadítja altsta bebő adatszerkezeteit, de a lista elemeit nem. A7 osztá yból nem szár-
ma7tath.atók alosztályok, ezért a destru]<lor nem \lirluáJis.
List& operator=(const List&)
Meg\ra.lósítja az érték3.dó műveletet az adattagoknak rnegfelelé5 értékad.ásI10Z.
téres
Ezek a múveleteJ< a lista elcmeio.el< ala.pszint(í elérését bizl()sítjá]<.
long Count() const
A lislát)an levő objektum()J( 523.mát adja vissza.
Item& Get(long index) const
A megadott sorszámú (indeXŰ) objektun10t adja vissza.
Item& Fjrst() const
A lista első objektllm.át adja vissza.
Item& Last() const
A lista utC)]Só objcktumál adJa vissza.
Hozzaa ás
void Append(const Item&)
A7 argumentumot a ljstálloZ adja, an.nal( utolsó eJem.eként CaJ)pend llC)7Záfűz).
void Prcpend(const Item&)
Az argumentumot a listáhC)7 adja., annak e1ső elemekénl (prepend == eléf(íz).
6 Programtervezési minták
E t volft s
void Remove(const Item&)
A megadott elemet eltávolítja a listából (remave == eltávolít). A művele megkövetel.,
a listában levő elemek típusa támogassa a7 = = össze lason Ító operátort.
lOgy
void RemoveFirst()
Eltávolítja az első elemet a listábó].
1
void RemoveLast()
Eltávol'tja az utolsó e emet a listából.
vo id RemoveAll ( )
M. nden elemet el ávol't a 1 + stából.
V rem elnlet
ltem& Top(} const
A Iegfe ső elemet adja vissza (amikor a l.stát ve eml{ént kezeljü ().
void Push(const Item&)
A2 e emet a verem tetejére helyezi
Item& Pop ( )
Az elemet leves i a verem. etejé ő .
c. It r O
Az Iterator az összesítő objektumok bejárási felületét megllatározó e vont osztá y.
template <class Item>
class Iterator {
public:
virtual
virtual
virtual
virtual
prot ee ted:
Iterator();
void
void
bool
Item
Flrst(} ::: O;
Next() ::: O;
IsDone() const = O;
Currentltem() const - Oi
} ;
C függelék · A'aposztalyok 377
A műveletek szerepe a következő:
virtual void First(}
A bcjárót az aggregátum első objektumára á lítja
virtual void Next()
A bejárót a soro7at !{övetkező objel{tumára állítja.
virtual baal IsDone() const
Igazat (true-t) ad visszd, ha a sorozatban már nincs több objektum
vlrtual Item Currentltem{) const
A sorozat aktuális poz'" cióján álló objektum_ot adja vissza
C.3 LIstiterator
A ListIterator az Iterator felület meh:rvalósítása listaobjel{tumok bejárásához.
KCJnstruktora argumentumként a bejárandó 1 _stát várja.
template <class Item>
class ListIterator : public Iterator<Item> {
public:
ListIterator(const List<Itern>* aList) ;
virtual void First();
virtual void Ne-:t () ;
virtual boal IsDone() const;
virtual Item Currentltem() const;
} j
C.4 Point
A Point egy pontot jelképez egy kétdimenziós derékszögű koordináta-rendszerben Alap-
szintű vektorszámítási képességekkel rendelkez.l{. Az egyes pontok koordinátáit a követ-
kezőképpen l1atározza meg:
typedef float Coord;
A Point műveletei önmagukért beszé nek
class Point {
public:
statlc const Point Zero;
378 Programtervezési minták
Point (Coord x = 0.0 Coord y = 0.0);
Coord X() const; void X(Coord x);
Coord Y() consti void Y(Coord y);
friend Point operator+(const point&, const point&) ;
fr . end Point operator-(const point&, const POlnt&);
friend Point operator*(const point&, const POlnl&) ;
friend Point operator/(const point&, const Point&) ;
point& operator+=(const Point&);
Point& operator-=(const Pojnt&};
Point& operator*=(const point&};
Point& operator/=(const point&};
Point operator-(};
friend baal operator==(const point&, const point&);
friend boal operator!=(const POlnt&, const point&);
friend ostream& operator«(ostream&, const Point&)j
friend istream& ope r ator»(istrearn&/ point&);
} ;
A Zero statikus tag jelentése Point (O / O).
.5 ct
A Rec t egy tengelyekhez · ga7Ílott téglalapot jelképez J amelyet kezdőpontja és kiterjedése
Cextent. vagyis '. szé ességc LS a magasságaI Width és Height) határoz 11leg. A Recl
nűveletej se.ll · génye1nek külöJ1 nlagyarázatot.
class Rect {
public:
static const Rect Zero;
Rect(Coord x, Coord y, Coord w, Coord h);
Rect(const point& origin, const Point& extent);
Coord Width{) consti void Width{Coord)i
Coord Height() const; void Height{Coord};
Coord Left() const; void Left(Coord);
Coord Bottom() const; void Bottom(Coord)i
Point& Origin() const; void Origin(const point&);
point& Extent() const; void Extent(const point&).
C függelék · Alaposztályok 379
voj-d M()vc'Tlo (const PoinL&);
void MoveBy(const Point&);
boal IsErnpty() consLi
boal Contains{const PoinL&) const;
} ;
A Zero statikus tag a követ]{cző négysz()ggel egyenértékű:
Rcct(Püint(O, O), Point(O, O));
d .1
.
lj ·
.
f Add94]
Addison-\XTcsley, Read.ing, MA. NEXTSTEP Getlerall(rc1-+ence 3. kiadás, 1. és
2. kc)tel, 1994.
fAG90]
D.B. Anderson és S. (;ossain; Hicra.rcllY evollllion and. t]le softw'are IifceycIc
TOOLS} '90 COlljer>e,lce Pl"oceectings, 41-50. oldal, Pár.zs, 1990 június
Prenti ce J a lJ
[AIS+ 771
Cllristop11Cf Alexanci.er, Sara IS]1ikawa Murray Silverstein, Max ]aco]1so11,
IngritJ Fikscial1.l-Kin.g és Slllomo Angel: A /Jattcrn T arlgllagc. Oxford
lJnive .sity J)rcss, New York, 1977.
[App89J
A.pple Computer, Inc., Cu pertino, CA. Macin tosll Pr'ogranl1nel'S W01 fl k..,./z{JjJ
IJascal 3.0 Rejerence, 1989.
[App92]
Apple Conlputer, Inc., (upertino, CA. Dylan. Arl oh.lect-oriel1ted c{VJ1alnic
larlguage, 1992.
[Arv91]
jalnes At\To: Gl-'aphics Ge1ns Il Aca(lelnic I)ress, Boston Iv1A, 1991.
[AS85]
B Adels()n és F Solowa.y: T11e ralc (Jf cloIllain experience jn softw-are design.
IEEE Tral1sactions atz Soflu)are Rl1gil'leeri11.g 11(11):13511360 1985.
[BE93]
And.reas Bjrrer és TIloInas Eggcnscllwiler: Fra1newor]{s in th.c fina.ncial
engineering clomain: An experjence report. European C011fere11ce 011 Object-
Oriented Progl'"an1111ing, 21-35. oldal, KaisersiauterJ1, Nén1ctország, 1993.
július, Springer Verlag.
382 Programtervezési mintak
B J91]
Kent Bec]{ és Ral})11 Johnson Patterns gcnerlle arc}litcctures. EllrOpeaJl
COnfel"enCe on Object-Oriented Programming, 139-1-19. oldal, Bo ogna,
Olas7ország, 1991. július, Springer-Verla.g.
fBoo94]
Grady Bc)ocll: Object-01'1el1ted Arlalj/sis a.nd Design UJitll Applzcatiofls.
Benjaol.n/Cummin_gs, Redwo()(l Cjty, CA, 1994. Másod.ik kiad.ás.
fBorS- J
A. Bornin.g: T11e prCJgrallli11ing langlIage a,spects o .. TllingLall - a constrainl-
oriented simulation laboratory. ACM Transactions on Programming
Langu.ages alzd S}'stel1lS, 3(4):313-387, 1981 októl)er.
fBor94]
BorlancJ International, Inc. t Scotl Val]ey, CA. A 1ech.tz,ical COn7pll1'7S0rl of
Bo}larld ObJ.ectWln(lows 2.0 atlt[ Micr'osqft 1FC 2.5: 1994.
[BV901
Grady BOOC"l Cs Mic]13.cl Vilat: T1 1e design ()f t]1e C++ BC)OC]l componen.ts.
Object 01"1entcd Prog ra nl 111 irlg SJJsteI1, Larlgllages, a17d Applicatiot7.s
Cor{fere17ce Proceeclirlgs, 1- 1. ()ltial, Ottawa, Kanada, 1990. ol<tóbcr, ACM
J)ress..
[Cal931
)au 1 R. c ld.er: Building User Jnte1jaces lvith Lightweight o bJ.ec ts. 1)111)
sLakci.olgozat, Stanford Univ'Lfsily, 993.
rCa +89J
J. Carolan: Constr ucti(Jn hul et-proof classes. Pl-'oceedil1gs C++ at WOlk '89,
SIGS Pllblicati()ns, 1989.
rCar92J
Tom Cargill: C++ Jlogralnlnirlg St)'le+ Add.is()n-\Vesley, Jteading, MAJ 1992.
[CIRL\1931
Roy r. CampbelJ, Nayeem Islam, Dav+ c Raila és PetcI Mac ea .1y: Designing
anel i111plementing Clloices: AJ1 o}Jjcct-orien.ted systell1 in C++.
COJ171nlf.llicatioflS q{tlze ACA!, 36(9):117126 1993 s2cl)tember
r CL90]
Paul R. Calcier és Mark A. Ijnton: Glypl1s: FlyeigJlt ohjects for user
interfaces. ACiVl U::,-et 11'1ler:(ace Sojtwa1-'e lechl1010gies Co n;!e1-'en ce, 92-10 ..
01(13.1, Snowbi d, Ul', 1990. ol(tóber.
lC192]
l)aull. Ct]d.ef és Marl( A. 1 LJ1ton: Tlle object-oriLnted. implelnent tio 1 of a
document editor. Object-Oriented Programming S'ystems} La nguages, and
Applicatiofl.S Coferet1Ce Pt"oceeclirlgs, 151- 65. oldal, Vancouvcr British.
Columhia, Ka.nad.a, - 992. október J ACM P .css.
fCoa92]
Petcr Coad.: Object-o iented patterns. C01111J1Urlications of the AlM,
35(9):152- 59, 1992 szeptember.
Irodalomjegyzék 383
[ Coo92]
WilliaITI Rr Co()k: Inlerfaces ancl speciflcatio11S for th.e Slnalltalk-80 collection
classes ()hjeGt-Oriented Progra111ming s..'ystenlS, LarlglAages, arld Applicatiorls
COnjere11Ce Proceedi11gs, 1-15. ()ld.al, Vanc()U\Tef, British COlulubia, Ka.na.dl,
1992 okt()ber, ACM Press
lCop92]
Ja.mes O. Coplien: Ac!vancell G'r++ ProgtOCl1nm,i11g SlJJ/es and Idion/ls. Addison-
Wesley, Re3ding 1\1A, 1992
[Cur89]
Bi1l Curtis: Cognjtjve issues in. reusll1g softw3.re artifa.cts. TcdJ'r BiggLrstafr és
Alan J. l}erlis (szerk.): SOJtU}{lf"C .Re'usahility) Vi:Jlulne II AjJ.lJlicatiol1S alzd
Fperiertce, 269-2R7. o]dal, Addison-Wesley, Read.ong t lVlA, 1989.
[d.CI F9)]
])enni!-' d.e Cham.peau-x, ])oug Lea és Pe11elope Faurc: ObjOeCI-Oric1.7Ied s..ystefrl
Developlnerll, Addison-Wcslcy, Rcad.ing, MAJ 1993.
[Deu89]
L I'eter Dcutscll: Design reuse aI1d frlmeW()rks in lIle Sma]ltaIJ{-80 systel11.
l'eu J. Biggerstaff és Alan J. ])er]is (szerk.) L.)ojtu)urOe RC1A.Sabilit)J] \íoI1A.111e Il:
Applications arzd Experierlce, 57-71. oldal, Ad (lisc)n-\Vesl ey, Read.ing, MA,
1989.
[Ede92J
]).R. Edelsc)n: Smart pointers: They're sm.art, but tJ1.e)7're not lJoinlcrs.
Proceedings qfthe 1992 [!SEl'lIX C++ Corljererlce, 1-19 oldll, l)(Jrllln(J., OR,
1992. augusztus, USENIX Association.
fEG921
TIlo .nas Eggenscllwilcr és Ericll G3Jnma: J-111e E'l++SwapsManager: lJsjng
()l1jecl tecJlnology in the final1cial engin.eering dOl11a.in. Objecl-Ol?enled
Programl1ling Systen1S, Langllages, arzd ApplicatiotlS COl/er"eTlCe
Proceedil1gs, 66-] 78. o]dal, Van.couver, Britisll Colulnbia, l{anada, 1992.
október ACM Press.
fES901
Margaret A+ Ellis és Bjarnc StroustnJp= Tlze An no ta tc(l C++ Refel/"ence MarllJal,
Adclison-Weslcy, Reading, MA, 1990
[F 0092]
Brian Faote: A fractal IT1()de] (Jf lile lifecycles of reusable objects. OOPSLA '92
Workshop 01Z Relk\e t 1992. o]{tóber, VancQuver, Britisll Columt)ia, Kanada.
lGA89]
s. Gc)ssain és 1).B. Ao(ierson: IJesignin.g a class llicra.rc11Y for domain
representation and reusab+lity. TOOLS '89 C01iferel1ce lJloceedi}lgs, 201-2] O
oldal, CNf1 1 1)ar.s- a Defense, Fral1ciaország, 1989. novC::lnber Prentice l-Iall.
lGam91]
EricJl Gamma: Oh}ect-Ofiented Sl q ftl1Jar'e DevelopmeJ1t based on ET++: Deslgrl
Patterns, Class Libra1)', Tools (némcl nyelven). 1)11D sZI.l(d{)lgozat, Zi..lric111
.Egyetem, Informatikai lntézel 1991.
384
P ogramtervezési minták
[Gam92] Erich Gamma: Object-Oriented Software Development based on ET++: Deslgn
Patterns, Class Library, Tools(német nyelven), Spr.nger-Verlag, Berlin, 1992.
[Gla90] Andrew Glassner: Graphics Gems, Academic Press, Boston, MA, 1990.
[GM92] M. Graham és E. Mettala: The DOlnain-Specífic Softwa e Architecture
l)rogram. Proceedings of DARPA Software Technology Conference, 1992,
204-2 O. oldal, 1992. ápri is. Ujraközölve: CrossTalk Thejournal of Defense
Software Engineering, 19-21. és 32. oldal, 1992. o <tóber.
[GR83] Adele]. Goldberg és David Robson: Smalltalk-80: The Language and Its
Jmplementation t Acldlson-Wcs ey, Reading, MA, 1983.
[HIIMV92] Richard Helm, Tien Huynh, Kim Marr"ott éSJohn Vlissides: An object-
oriented architecture for constra'n -based graphicai editing. Proceedings of
the Third Eurographics Workshop on Object-Oriented Graphics, 1-22. oldal,
Cllampéry, Svájc, 1992. október, illetve IBM Research Division Technical
Report RC 18524 (79392).
[H087J Dan'e C. Halbert és Patrick D. O'Brien: Object-oriented deveopment. IEEE
Software, 4(5):71-79, 1987. szeptember.
lION94] IONA Technoogies, Ltd., Dublin, Írország. Programmer's Guide for Orbix,
Version 1 .2, 1994..
o-CJ092] Ivar Jacobson, Magnus Christerson, PatrickJonsson és Gunnar Overgaard:
ObjectOriented Software Engineering - A Use Case Driven Approach,
Addison-WesleYJ Wol{ingham, Anglia, 1992+
(JF881 Ralph E. Johnson Cs Brian Foote: Designing reusable classes. journal of
Object-Oriented Programmlng, 1(2):22-35, 1988. jún 'us-július.
(JML92] Ralph E. Johnson, Carl McConnell é J Michael Lake: The RTL system: A
framework for code op imization. Robert Giegerich és Susan L. Graham
(szerk.): Code Generation - Concepts, To Dis, Techniques. Proceedings of the
International Workshop on Code Generation, 255-274. oldal, Dagstuhl,
Németország, 1992, Springer-Ver ag.
Uoh92] Ralph E. Johnson: Documenting frameworks using patterns. Object-Oriented
Programming SytertlS, Langllages, and Applications Con/ere/lce
Proceedings, 63-76. oldat Vancouver, British Columbia, Kanada, 1992.
október, ACM Press.
Irodalomjegyzék 385
(JZ91J
Ralp 1 E. Johnson és Jonatllan Zweig: Delegation in C++. journal of o bject-
Oriented Programmlng, 4(11):22-35 1991. november
[Kir92]
David Kirk: Graphics Gems Ill, lia . court, Brace, ]ov3.novich, Boston MAJ
1992.
[Knu73]
Donald E. Knuth: The Art o/Computer Progra mIn ing, 1., 2 és 3. kötet,
Addison-Wesley, Read.ing, MA, 1973
[Knu84]
Dona d E. Knuth: The TeXbook, Add..son-Wesley, Reading MA, 1984.
[Kof93]
T10mas Kofle.: Robust terators in ET++. St11lctured Programming, 14:62-85,
1993. március.
[KP88]
Glenn E. Krasner és Stephen 1. Pope: A cookhook for using the modelview
controller user interface pa .adigm in Smal talk 80. j01-trnal of Object-Oriented
Programming, 1(3): 2 6-49, 1988. augusztus-szeptember
lLaL94]
Wi f LaLonde: Discovering Smalltalk, Benjamin/Cummings, Redwood City,
CA) 1994
[LCl +92]
Mark Linton, l)auI Calder John InterranteJ Steven Tang és Jol10 Vl.ssides:
InterViews Reference Manual, CSL Stanford University, 3Fl kiadás, 1992.
rLea88]
Doug Lea: libg++, the GNU C++ libra.ty Proceedi11gs oJthe 1988 USENIX C++
Conference, 243256. oldal, Denver, CO, 1988. október, USENIX Associat.on.
lLG86]
Barbara Liskov LS ]o11n Guttag: Abstraction and Specification in Program
Developlnent, McGraw-Hill, New York, 1986.
rLie85]
Henry Lieberman: There's more to me nu systems th an meets the screen
SIGGRAPH Computer Graphics, 181189. o d.al, San Francisco, CA, 1985.
július.
[Lie86]
Henry Lieberman: Using prototypical objects to implement sI1ared l1ehavio
in_ object -oriente( systems Object-Oriented Programming Systetns,
Languages, and Applicatio11S C01iference Proceedlngs, 214-223. oldal,
Portland, OR, 1986. november.
Lin92]
Mark A. L.nton Encapsulating a C++ library. Proceedings o/the 1992 USENIX
C++ Conference, 57-66. oldal, Portiand, OR, 1992. augusztus, ACM })ress.
386 Programtervezési minták
[LP9]
Mark Linton és C}luck Price: Building distributed user intcrfaces witll Fresco.
jJroceedings of the 7th -oLy Technical Co riferen ce, 7787. olcial, Boston, lVlA,
1993. j3.nllár
fLR9 3]
Daniel c. Lync11 és MarsIlalj T. Rose: Intcr"Tlet Systeln Ha 11dbook, Addison-
Wesley, Rea.ding r MA, 1993.
fLVC89J
Mark A. ljnton., Jolln M. Vlissidcs és Paul R. Cald.er: Composing user
interfaces witlllnterVtews. Con1pL/.ter', 22(2):8-22, - 989. fel)ruár.
[Mar9 J
Bruce Martin: Tlle separa.tion of interface and implel11cnlati()n in C+.+.
Proceedings qfthe 1991 USFNIX C++ Co Yffererlce, 51-63. 01(13.1, Wasl1ington
D.C., 1991 + 3.prilis, USENIX Associatiol1.
[McC87]
Paul McCullogll: fransparent forvvarding First steps. ObJ.ect-Oriented
Proglalnnting )J)stenl Lang.ullges) and AjJjJlicatiorlS COl7.jere1'"lCe
Proceeding', 33 -311. oIdal Orllndo, FL, 1987. október, ACM IJ ress .
I
I
1
I
[Mey88]
Bertrand. Meyer: ObJ.ect-Oriented Software Construction. Scries in Computer
Science, Prentice 1 Ja]]., Englcwood Cliffs, NJ, 1988.
[Mur93J
Robert B. Murray: C++ Stralegies and Ta ct ics, Addison-WesJey, Reading, MA
993.
lO]901
\XTilliatTI F. Opdyke és Ralph E. Johnson: Refactoring: An aid in designing
a.pplicalion frameworks and cvolving objectoriented systems. SOOPPA
Confereilce Pr.oceedillgs, 145-16 + oldal, Marist College, PougI1keeIJ,;ie, NY,
1990. szepternber, ACM Press.
fOJ93]
\Villiam F. Opdyl(L és Ralpll E. Jollnson: Creating a11st a.ct superclasses by
refactoring. Ploceedíngs oJthe 21st Atlnual COmp1--lte1 Scte11.Ce Confe'l-ence
(ACM CSC '93) 66-73. ol(i.aJ Indianap()Iis, IN, 1993. február.
lIJ+88J
Andrew J. )alay és mások: The Andrew Toolkit: An overvicw. Proceedings of
tl1e 1988 Winter USENIX Technical Conjerence, 9-21. old.al, Dallas, 1'fX, 1988
fehruár, USENIX Association.
fPar90J
J>arl>lace Systcms, Mountain View, CA. ObjectW1Jrks\Slnalltalk Release 4
Users Guide, 1990.
Irodalomjegyzék 387
[1)as86]
Geoffrey A. I?ascoe: En_capsula.tors: A new sofrnra 'Oe paradigm in Smalltalk-80.
Object-Orlented Pr'ogral1lmirlg Syste1ns) Languages} al'ld Applicatio1s
COYl:ference IJ1oceedl>flgs, 34 -34.6. oldal, Portland OR, 1986. október, ACM
lJ ress "
llJ u g90 J
WiIlianl }Jugll: Skiplists: A prolJabilist'_c alterna.tive to balanced trees
C0111-mlJnications of the AC 33(6):6676, 1990. június
lRBJJ+9 1]
Jam.es RumhaugJI Micl1ael Blaha William Premerlani, Prederick Ecldy és
Willialn Lorenson: Oject-Oliented M()deling and Design, lrcntice Hall,
Fnglewood Cliffs) NJ, 1991.
1 Ru 0194- J
James Rllm.lJaugll: T11e life of an object lnodcl How tlle object ffi()del
cllanges during development. four11.al ofOhject-Oriented Prograln1ning,
7(1):24-32,1994. márc.us-április.
lS81]
Elli()t S()loway és Kate Ellrljch: Empirical studies of programming knowledbe
IEEE TransactioFlS on Soflwa1-'e Engi-neeri11g 10(5):595-609, 984.
szeptember.
[Slla90]
Yen-IJing Shan: MoDE: A UI\1S for S111alltall{. ACM OOPSLA/ECOOP '9Q
COlference Proceedings: 25&-..268. oldal, Ottawa, Ontario, Kanad.a, 1990,
ol<tóbcr, ACM l)ress
rSny86]
Alan Snyder: Enca.psulation and in11erilance in o11ject-oriented. ]anguages+
ObJect-On:eJ1ted Progranlmirlg S.ystefllS; LanglAages, and Application
Conference Proceedings, 38--15 oldal, )()rtlaoci, OR 1986" november, ACM
Press.
[5586]
jalnes C. Sp()hrer és Flljot Soloway: Novice Inistal(es: Are tlle falk wisdoms
correct? C011'lmlÁ-nicatiotlS ojtIle ACM, 29(7):624-632, 1986" jú ius"
15594
Douglas C+ Sc11lnidt és Tatsuya Suda Tlle Service Con fIgura tor Frameworl{:
An extensil)le arcllitecture for dynamically contlguring concurrent: multi-
service nerw-ork daen10ns. Proceedings oj.the Secotld Inlel11.ation.al
Workshop 011 Configurable Distributed Systelns, 190-201. oldal, Pittsburg11,
IJA, 1994. március, IEEE Computer Society.
[Str91]
Bjarne StroustrLlp: 711e C++ Programrrling Language, Addison\Vesley,
Reading MA, 1991. Második l{iadás. (Magyarul: A C++ progranozási nyelv,
2002, KiskaI1u Kiadó.)
388 Programtervezesj minták
Str93]
IJaul s. Strauss: IRIS Inventor, a 3D öraph.ics toolk't Object-OrieJlted
Prograinming SystemJ La nguages, and Applicatio1'ls Conference
Proceedings, 92-200. old.aJ, Was11ingloD_ D.C., 1993 szeptem11er, ACM Press.
[Str9 / ]
Bjarne Stroustrup: The Design and Evolution o/C++, Addison-Wesley,
Reading, MAt 1994.
[Sut63J
f.E. Sut11er and: Sketchpad. A Ma.nA1achine Graphical CommUl1ication
System. }J1 1 D szakdolgozat, MIT, - 963.
lSwe85]
Ric 1ard E. Sweet: Tlle Mesa programming environment SIGPLAN Notlces,
20(7)21229, 1985. július.
[Sym93a]
Symantec Corporat.on t Cuperlino, CA. Bedrock Developer's A1chitectur.e Kit,
1993.
[Sym93b]
Symantec Corporation, Cupertino, CA. IHINK Class Libral)' Guide t 1993.
[Sl.a92]
Duane Szafron: SPECTaik: An object-oriented data specJication languahe.
Technology ofObject-Orie11ted Languages and Systems (TOOLS 8),123-138.
old.al, SantJ. Barbara CA, 1992. augusztus, Prentice lIali.
I
I
rUS87]
David Ungar és Randall B. Smith: Self: The power of simplicity. Ohject-
OrieJlted Progranlming Systems, La'nguages and AJplication.s Conference
Proceedings, 227212. oJdal, Orland.o t FL7 1987. október J ACM Press.
lVL88]
John M. Vlissides és Mark A. Linton: Apply'ng object-oriented design to
structured graph.ics. Proceedings o/the 7988 U!)ENTK C++ Conference, 81-94.
oldal, Denver CO, 988. október, USENIX Ass()ciation.
lVL90]
John M. Vlisides és Mark A. Lioton: Unidraw: A framework for bui ding
domain--;;pecific graphical editors. ACM Transactions on Information
Systems, 8(3):237-268) 1990. július.
[W13J90]
Rebecca Wirfs-Brock és Ralph E. ]o11nson: A survey of current researcll in
object-oriented design. Conlmunications oJthe ACM, 33(9):10 4= 121, 990.
[WBWW90] Rebecca Wirs-Brock t Brian Wilkerson és Lauren Wiener: Designing Object-
OrieJ1ted Software) JJrentice Hall, Englewood Cliffs, NJ, 990.
[WGM88]
André Weinand, Erich Gamma és Rudolf Marty: ET++ - An objcct-oriented
application [ramework in C++. Object-Oriented Progranzming Sytelns,
J anguages and Applications CO"Jiference Proceedi1zgs, 46-57. oldal, San
DOego, CA, 1988. zeptember, ACM Press.
.
mt
I
#room 125
#select 286
aktuálisLabj intus 02
_count 274
current 270
currentMaze 102
eu rrc.ntWord. 74
extent 218
_image 218
°ndex 204
_instance 130, 133
_state 312
-= művelet 216
7 bites ASCII 185
ablakrendszer-betokozó objel{tum 55
Al) akRendszerG.yár 57
ablaktár)lák 285
a11laktípusol{ 151
AboutToOpenI)ocument 328
á11ra 1 09
ábrá { 196
ábrázolás 40
AlJstract Factory 8,86
AbstractClass 329
AbstractExpression 251
Abstract+on 157, 158
Abstractlist 263, 271
absztrakció 12
abs7trakt osztály 16
Accept75334, 337,339,340, 342
accept: 345
Action 237, 246,347
ActionCallback 217
Ada 4,23
Ada általános p "ogramozásj a .egység
23
Adapter 8, 111
Ad.aptive COlnmunications
Environment szolgáltatásbeállító
keretrendsLer 105
adatátvite 312
adatbázis 2
i ,
ábécé 197
ablak 154
Al1lak-AblakMegvalósítás 159
ablakfelüjet 154
alJlakkezelő 128
al)] a ({e.lelő rendszer 52t 58, 162
ablakkezelő rendszer jellemzoi 163
abla (]{czelő rendszerek 95
AblakMegvalósílás 55 54
abla 70k 160
ablal{ok példányosítása 154
390 Programtervezési minták
ad.atbev"teli mezők 326
adatértékek 309
a(latfolyam 191
ad.atfolyam töm_örítés 185
a.datfolyamok 185
ad.atobjektum()k 306
adatsLerkezetek 351
Add 169, 170, 171 J ]74, .76
AcldConslraint 293
ad(i.ress space 195
AddressTranslation 195
adó 350
adorner - 81
aggregáció 24
aggregátum 263
Akci() 237
AktuálisElem 68, 263, 270
alacsonys7jntű felület 187
aláírás . 4 336
.
AJ.al(za t 14 1
Alany 213 t 223 282, 297, 298
alany állapota 300
Alany és Megfigyelt) osztályok
egyesítése 303
ala.nyok törlése 300
alapelemek 165t 166
alalJértelmezett gyermekelérő művelet
169
alalJértelmezett llc.lycltes 116
alapértelmeLclt megvalósítás 158
alalJlap 172
alapméret 322
a]apművelet 225
alapm(íveletek 156, 329
alapolJjeJ<tumok 68
alaposztályok 8
alapvető grafikai elemel{ 35
alapvető llozzárendeles 175
alapvet(5 programelemek 355
alapvető sz(jvegsze kesztési
műveletek 111
Alexander 3,359
aJgoritmikus függőség 26
algorjtlTIUS 12, 317, 327
algoritmus egyes lépései 328
algoritmus környezet 336
algoritl11us-család 31 7
algc)ritmusfüggő adatszerkezetek 318
a]goritmlIS()I< 225, 351
Alkalmalás 27 106, 229, 235 1 238, 327
AlkallnazásA111a]{ 54 60
all{almazásadatok 296
a11<almazásfüggő 3.losztályc)]( 28
all(almazás-l{eretrcnd.zer 327
alka]mazásobjektutn 227
alkalmazás-progra.1llozási fe]iilet 26
alkalmazásprogramozó 58
All(alma7hatóság 7
AlkaJmazott 270
a]kifejezések 24.9
álkód 17
al1{otó minták 10
Állapot 9, 18, 22, 199, 209, 226, 213 J
287,307,309,348
álla.pol felfedése 287
Állapot minta 12J 308
álla.pol nélküli objektumok 321
Allapc)l objekturnok létrellozása 3
Álla.pot ter\Tezésj minta 309
á.lla.potátmenetck 309, 3] 1
áJlapotaul()maták 250
állap()l-lJeállító m"űvelet 300
áJlapotfügg6 kérelrnek 309
állapotfüggő l(ód 310
állapotfLiggő visel]{edés 31
állapothiha 243
állapotinfortnáció 273
állapotinformációk 109 201, 287 339
állapololljel{tum 226t 294 308
ál1apotobjektun10k 307,316
álla.potok 355
álla potok110L tartozó táblázalol{ 1 O
álla.potválto7tatási kérelme]{ 312
alnézetek 175
alosztály 16
aloszlálykészítés 117
Tárgymutató 391
alosztálykészítés elkerülése 13
alosztá.lyok 225
alcJs7tá]yol{ készítése 136
alosztályok s7áJJl.a 281
alosztályok szárma7tatása 222
a]osztályokkal megvalósítc)tt lnűvelet
23
aJosztályokkal \faló bővítés] 79
al pa.ra.ncsok 2 46
al program- kc)nyvtára 1( 28
alrencIszer 7
alrendszerek kC)7ötti függőségek 187
alrenclszerek nyilvános felülete 190
alrendszeri oSLtályol{ 189
alrendszeri osztá.lyok nyi]vánossá
étele 191
alrendszeri szint 189
alsó zintű osztály 1 2
áJtalános adats7erkezetck 163
általános célú 3.datszerkezet 172
általános feltilet 16
általános 11elyettcs 219
általános objektumköZlJOnlÚ
progranlozási nyelvek 4
általános programozási alegység 23
AlternationFxpression 249, 254, 345
altípus 14
altípus-létrehozás 18
alulról feJ felé építkező faszerkezet 00
Aml)aSs3.dor 2 2
analé)g óra 305
AnaJogClock 305
analóg-cli.gitális átalakító 128
anApplication 22R
and 257
AnciExp 257, 259
Andrew Tooll<it 306
AppKit 164
Apple 247
Application 106, 229r 235 t 238r 2:1-4,
327
ApplicationWindow 54., ] 60
al)riJl.tButton 228
a})rint])ialog 228
apró objektum 8]
ár - 73
áramkörtervező progr31n - 20
áramkörlervező rendszer 286
arcJ1Ítektú .ák 360
Arculat 187
argumentum 71,83,91, 101, 105 ] 11,
122,171,266,319,337,348
argumeJ1tulTI átalakítása 232
argumentumként l1asznált ()11jektumok
318
argu .11entuffi(Jk lJecsol11agolása 351
árnyékc)lás 184, 209
Array 257
J\rrayCcJmpositor 318, 324
Array terator 68
árva llivalko7ások 300
ASCII karal{terkés71et 199, 203
ASCII kommuniJ{ációs csatorna 185
ASCII szöveg 96
ASCII7Strcam ] 86
ASCIIÁtala]<ító 97
ASCIIConvcrter 97
Asl<User 244
aspektusok 301
asRExp 256
assignment 334
AssignmentNode 331, 341
asszociáció 24
asszociatív tár 121, 202
átalakítás 96
átalakító oS7tályok 97
átlátszó befoglalás 14, 47
átlátszó egység - 8
átlátszóság 145 170, 177
átmenet 309
át111eneti ablak 161
átmeneti ablakok 160
átmeneti tár 172
álmeneti tárolás 195
ÁtmencliAblak 154
átI11enet-k.c)vetel nények 3 -_1
39 Programtervezési mintak
á ruhá ás 226, 33 -,
á ruházás a apú nyelvek 311
automatikus tová b.tás 233
azonosságvizsgálat 199
Bejáró "ervezési 1.nta 70, 172
bej:íróhelyettes 272
bejárák 276, 338
bejárák törlése 272
BejáróMutató 272
bejegyzet" v 6 se ;redés 182
bekeveredő 228
bekevert osztály 17
bel{ezdés 318
be épési pont 189
be 56 addlértéke ? 310
e ső állapot 197, 201, 287,307
be s6 átmeneti tár 185
be ső bejáró 266, 268, 341
be 56 bejáró metódus 276
be ső bejáró ( 274
be s61istabejáró 272
be ső szerkezet fe fedése 262
belső tárolás 202
belső újrahasznosíthatóság 27
bemeneti fájlfor 1átumo { 261
bemeneti folyamok 254
bemeneti-l{imeneti (IlO) 185
bemenő karakterlánc 250
besoro ás 7
Beszúr 66
betokozás 12, 287
Betölt 122, 219
betustílus 198
betűtípus 199, 202) 203
betutípus megváltoztatása 285
betútípus-informác Ó 204
betűtípusok 163
B etútí pusPárbeszédab lak Irányító 2 8
betűtípus szín ko 1bináció 199
betűtípus-választó párbeszédablak
278, 282
betűtípusváltás 62
betútípus-váltások szá .la 207
bevi eli mez6 277
BevIteliMező 283
B-fa 204
Bag 276
bájtkód 191
BájtkódFolyam 187, 191
balról jobbra 11a adó bejárás 65
barát 267, 269, 291} 313
be nem jegyzett viselkedes 182
beágyazó objektum 177
beágya ott aggregátumok 268
beágyazott álta ánosí"ások 156
beágyazot elemek 196
beágyazott nézet 6
beágyazo t SQL-utas"'tások 1 6
BeállítO da 94
BeállítSzöveg 283
Bedrock 181) 182
beépített böngésző 194
beé JÍtet felületillesztés 145
befektetési portfolió 77
befoglaló 15
befoglaló doboz 149
befoglaló négyszög 39
BefoglalóDoboz 142
Bel1avor 116
Beilles t 238
BeillesztParancs 238
bejárás 66, 172, 204, 226, 263
bejá ás mód 66
bejárási algor 6 lmus 265, 266
bejárási index 294
Bejárható 271
Bejáró 4,9, 67} 173,226,261,262,263,
265,295,338,341,348
bejáró felület 294
Bejáró minta 176, 264
bejáró műve elek 70,262,267
Tárgymutató 393
11i]]enlYŰlczelés 182
lJ '.náris lnegfe le1é5ség 157
BinaryExpression 175
l)it.kélJek 163
biztonság 170
lJlo]<J< 14:8
blokkszerl<e7et 48
BKF 252
]-ody 158
uCJm11a 93
BC)111.bedDoor 121
BomlJedMazeFactory 93
BonllledWall 93, 133
BornlJcdWall* 125
-30111bedWa.ll: :ClcJne 1 25
bonyolult alrendszer 188
l10n")l()ll11t nyelvtan 250
honyolult objektutnol{ 111ásolása 214
bony()ll11t osztály bővít[se 180
11onyolult öröklési v.szonyok 351
B()()C]l gYŰjteményoszlályol< 325
1oocl11(omponensek 276, 325
Boolean 253
B()()leanExp 257
!Jőr 181
Bor{ler 180
BorderDccorat()f 178 J 183
l)()rítél,-levél 316
or13.l1.(1 326
bounding 110X 149
l()un.dingBox 112
Bounds39
bŐ\Títés 356
BővíleltKezelő 232
bé5vÍt]letó gyárak 91
lJővítlletőség 3
böngés7é5 . 94
l)readtllfi 4st 268
Brian Fc)ote 356
Bridge 8, 53
lJfuadcast 299
Bruce An.derson 360
B1'rce 204
buffer 185
Builcler 8, 96, 97
BuildMa7e 103
BUlldIoom 103
Bureaucrat 236
Burlcoló 14 , 177 358
lJUSZ 172
Bultan 2 2 9, 234, 283 285
lytecouL 191
BytcCocl.eStream 105, - 87, 191
C4
C++ 4, . 8, 23, 28, 7(), 91, 100 112, 120,
121,129, ]4.6, 147, 149, 155, 157,
]70,181) 183, 191 2-4, 243 253,
266, 291, 294,321 339, 317, 360
C++ sallIon 23
C++ sabl(Jnc)l< 24.3
caiiback: 240
Can()penDoCU01ent 328
Caretaker 2R9
Cargill 310
Ca ."olan 157
CASF eszközök 355
C3.se utasítás 320
casl - 70
C:é 1 7) 1 O, - 1'1
célgéptílJUS 194-
célregisztcr 175
CcnterDc)cuJnentColnmanc.1239
C:hail1 of RcsIJCJnsi11ility 8) 225, 226
Changccl 283, 284.
CllangeManager 286, 3{)2
C:hal1gcSet current 135
ChdngeState 313
Cllara.cter 203
Cllassis 17 1
(11ecl(Cha.racter 74:
CJ1csJlire Cat 57
394 Programtervezési minták
ClliltI 39
C IILDREN 66
(:]1oics uperáciéJs rend.szer 195, 212
C11rist()pI-1er AJex3nder 3, 358
C1T11fo[ciftó 195
cílntér 195 214
.
cfTnterel< 195
c ílJltérfü ggellen () 11 je kt11 mazonosí ló
217
CircJcFa.cloI)I 136
CISCscl1etill]er 325
C:lass \liev\l 116
Class* I)()Mal<ellassO 114
(] asslllil(ler 105
Clicnt 201
CIockTilJlCr 301
Clone 117 121Í
i
CI()S 4, 266, 34
Closcd 307
closure 266, 272
CL U 266
Cü(ieGenerator 193
C:ol1eaguc 281
Collecti()n )95
CC)llln111 201, 204
COlllrnan(j 8, 226, 236 237 238, 211
C()mm()nWa]1102
COl11piler 188, 193
C(JmpC)neI1t 168 180 t 236 322
COl111Jonent::Ad.ti 171
C()n1 J1()n.ent: : Re rTIo\re 171
COT11ponel1ts 251, 3.45
COnlp()ne11t\liew 236
C0111pOSC 41,325
Composite 6, R, 165, 168
Composite* GerCOffiIJosile() 170
(:0 11positcElemenl 340
Comp()siteFgllipment 73, 313
(onlpositcVle\"1 6, 175
Comp()sition 41 318 322
C:0111.positor 11, 31RJ 322
ConlpressillgStreJJ11 186
ConcrcteClass 329
ConcreteC:OJ11.111and 211
ConcrctcDeCC)rltor 181
ConcreteEJenlent 336
C oncreteflywcigllt 20 1
Concretel Ianciler 230
Cc)ncreteltnplclllcntor 157
Concrctelteralc)r 265
ConcreleOl1server 298
ConcrctcStlte 3()B
ConcreleStrLitegy 3. 9
(:oncreteSubject 298
Concrete\lisitor 336
Constant 257
ConstraintSc)iver 287, 292, 293
Constra. . 1tSolvtrMement() 292
ConstraintStaleVarialJle 14:6
Cc)nstraintVariablc 115
Context252, 257, 309319321
continuations 266
COJltrollcr 1
Ct)pli<.:n 126, 58, 163, 212, 27 316
(Or1jel1 Strinh 156
Copy 259, 294.
C(JI1Y metódus 125
copy mű\'elet 121
CÜI)y-()n-lrite 214.
C{)llntingMazeBuilder 104
Creale 111
C:rea teCllí) rílctcr 2 OR
CrcateCC)mpleXl\1azc 102
CreateI)ocumcnt 107
CreateFileOialog 109
C= rea te T tlitia.lS t3.tL 291
CreatcltLrator 68, 173 2G4 271
CreateManjpllla.tor 142, 119
CretteM3.ZC 85, 92 95, 1 ()1
Cr<:alcMemento 293
CreatcScrollBar 87
CrcateWi(lgets 280) 283, 28.1
Creat()f III
Currcntltem 68, 263, 270, 291
Tárgymutató 395
Cllrsor 262
csatlakoztatllató iJlesztő 145, 116
csatlakoztatllató illeszté5k 52
csatalás 190, 29R
CSc)]\Ter 286 291
,
Csonlúpont333, 335
Cs()mópontLátoga.tó 331, 335
csomópontok 333
csomÓpOnl-()S7tá])'ok 333
csö]{c\rényes bejáré) 68, )68
csökcvénjles gyár 90
csö]{e\rényes ÖSSLltétel H6, 222
csökkentett névtér 129
d"namikllS l]eállítás - 20
()ioílmil<us betöltés 118
djnalniklls l«()tés 14:, 135
c]inamikus ()röl<lés 311
d.inaJl1il{llS fCntl.szereJ< 120
cl"_namikus t1J1l1so1{ 94
ci.inanli]{us tíPllS()kra é )ülő n)lelvel(
147
dinamikusan betöltölt ()SZlál)l 120
Dirccti(Jn felsorolás 82
c]ircctc)[ 97, ?79
l)irectorvBro\lser 14.7
J
Direcl()ryl reeJ)isplay 146
l)iscretionary 76
Disl)llY 331
dfsz 181
dzh6s17, 140, 179209
ciíszített clcln 177
díszített ()[)je]<tuDl 181
DísZÍtő 6, 9 5, 17 - 27, 177, ] 78, 179,
180 r 220, 222,358
lJíszÍt{5 n1i11ta. 140 153, 176, ] 8
clíszítőllCI)lettes 223
dísZÍté5]< ] tsG
ciísZÍtők cgymásbl ágy3.zás3. 81
Do elé5lag 33]
cic): 276, 34: 1
Doc 33 J 208
)c)Crea.teDocllmenl 328, 332
DOCUil1enl 106 209, 238 215
ti()cumentClass 112
DoD.splay 3?,1
d()eNotUnclerstan(i. 216, 217 f 219,233
cloklLlTICnlá.ciéJ 29, 354.
Dokumentunl 106, 199, 23H, 327
Cio]{l11nentul11110SS7:a L99
dokufficntLlm n1egn)li -ása 210,328
dol{UT11entUtll olvasása 32R
dokllmentum SZlne 42
(J()l<u 111entlll11L)an elf()gla]t 1:1ely 198
.
DokllmentumKözéI)rCParlncs 239
DAGCl1angcManager 302
T)A(;VáltozásKezclő 302
DelJuggcrA(l.apt()f 127
Del)llggingC;lYl)JJ. 185
l)ecoralor 6, 9, 177, 178, 179, 180, 183,
358
d.efaultControllcr 116
c]c[a.ultC()ntr()l]erC:lass 116
ele legáció 21
clclcgált 21
ci.elegate 14.7
DelctcCo111Jn{nd. 24:3
Dependents 296
c1erefcrenci;1 2 - -1
cleslrul<:t()f 272
l)e\T]ceRect 162
d.evizaárfcJJyarnok 325
d.iagratn 288
dj2.gra.111SZcrkeszté5 286
Dial()g 229, 235
)ia}ogDircctor 280, 2HZ
DialogKit 95
])iaJog\Vindow 51
Dictionarv 276
J
1)igitalClock 301
digitális szűr(5 ] J8
396 Programtervezési minták
(Jokllmenlulno!{ megnyitása 109
d.okulnentumszerl<es7tő 211
dokumentlllllszerkczet35
d{)kumentuln-tájolás 95
DoLétrcllC)ZOc)kuIIlentum 3 ZR
Dc)main 195
1)on1ain Sl)ecific Softwarc Arcllitectllre
360
Dc)nald Knl]!ll 360
DoOlv-ts 328
D()()r 82
DoorJ\ec(lingSJ1e]] 85
Dc)Reaci 328
dOllblc-(liI-)alCll 340
Draw 39, 166, 183, 199, 211, 216218
f)rawApplicatic)n 327
DrawBcJrd.er 182, 183
l}ralContcnts 160
Dra\vDoC1JJllellt 327
DraV\ l 111gApI)lication 1 06
DraV\ringController 316
Drawing )ocum<:nl106
I)rawRcct 39, 161
Dr())')lladowDecorat()r 181Í
11ylan 4: 291
dynamic_cast 91, . 71
egyező felülctű (JL1jektll1110k 9
egyidejű 2
EhY) 7 ke 9 19 90, 96, 12Rt 129, . 63, 293,
303316,35H
Egy"ke JlliJl.ta 306
egyke objcl<tumra Illvat]<oz() mutatéJ
131
egyl{ék 196
egykenyil\rántarló 132
egyné] töl)b alany megfi b :ryelése 300
egyN)TomtatásGomlJ 228
cgyKyomtatásPárbeszédablak 228
egységbe zárás 12, 21: 287, 291, 295,
339,349
egységbe zárts llatáraj 290
egységbe zárás 111.egsértésc ZR7
egységlJe záró 220
egységes felülel ] 87
eby-s()J< függőségi kapcs()Iat 296
egysok kapcs()latc)J< 281
egys7eres l{özvelítés 3tf 1
egyszeres öröl<lés llÍ7
egyszeri visszavonás 243
egyszer -e több bejárás 265
egyszerű [eltiletáta _ak,.tás 111
egyszerű frissítési prol()](oll 299
egyszcr(Í llbirintus 10?
egys7enI mutató 212
egy1"szcrű l)lrancsol( 246
Egys7enfÖsszeállító 31f)
EgyszcrCílJarancs 245
egyszerűsített felület 187
EgyszcnNáltozásKezelő 302
gyiiltműl(ödés 7 281
egYÜttmű]{ödési cliagran1 7
egyiittl11Űkc)d.ési kÖn)TVt3.r 127
ebry(ittmű]{ödő objektulllO]( 350
egylittn1űködő (}sztályo]( 296
EiffeJ 18, ?3
elága.zó utlsílás 3()9
elárvu1t }11vatl(ozások 300
F]en1 167, 168, 180, 236 337
ECOOl) '93 357
egérlnuta.tól( 63
egész sorSZáIll()k 39
eg)' a7 eg)lllcz l(dpcs()lal 157
egy .AlI{a.ll11azás 228
Eg)léb neve]{ 7
egyed.i célú terlnékc)sztály-példán)rok
133
egyeeli J1é]d2.ny 129
eg)rec]ülállé) alan)íol{ 319
egyenlet 288
egyetlen keelé5 függ\rény 272
egyellen péJdány 128
Tárgymutató 397
Flenl felij]et ] 69
cleme]{ listáj3. 171
elemek megos7tása 69
elerneJ< össze]<őtése 231
elemi objeklum 6
elemkés71et 28, 16, _4 , 237, 296
ElcmNézct 236
elemzenci.é5 inf()rrnáció elérése GS
e]eJJ1.zés 65, 70, 187, 252
elelTIzés egységbe zárása 7-
eleJll.zési m.intál{ 360
Elcmző 187, 191
eletnző generátor 250
clclnLő modell 12, 355
elem7ő műve]etelz 65
ClCl11Lőfa 191
elemzőfál{ - 00, ] 72, 175, 265
ele .nzőgcne átor 252
ElérAktuális 66
el.ogad11ató bemenetek 251
elfc)gadllatC) üzenetel< 220
eJjárásközpo 1tÚ 240
eljárásl(öLpontll nyel\r :1
ellenállé) 11ejáró 2(;6
ellellőrző pont 287
elneve z ési ren.d.5zer 33.
EJőállJtKód 341
előr eltic)lgc)7ó 216
e]é5fizetés-értesítés 5
előfizető objektllm 299
rJőkészít 116, 122
elól{észítési mŰ\7elet 137
el{5készítő parllnéte A 122
előre ll(llacló ucj{irá.s 70 268
előre llala(1ó l{eresés 70
előre l1em i.Stl1eJ1 osztályol( 113
előre nenllá tllat{) 1}{5vítés 180
elc)s7tás 3()9, 349
eloszlott 2
elé5Lér-lláttér sorrend 172
e]őzménylista 226, 213, 292, 240
elrendezés 209
eJre 1dezési algoritmus 325
Első 66, 263, 269
első aJapelv 19
első osztá.lyíi objel(tum 90, 120, 242
elszórt inf()rmáció elérése 65
F]t3VO]ít 169, 170, 176
eltávolítllat() jellel11zé5k 179
eltéréS fe]l11et 221
eltolás 195
elválasztás 65, 70
elválasztási IJont 65
<:lválaszté) 76
eJvá.la.sztó l\.é]Jjel 76
e varázs()lt la11irlntus 85, 93
ElvarázsoJtLa.birintusGyár 92
elvont ál)ráz()]ás 14(), 53
eIV{)11t csatolás 26, 190, 195, 299
c]vonl Díszítő 181
e]v()n t f()galn13.k 12
e],'ont fogalol11 153
Elv()nt gyáf 8 4, 19, 57, 86, 106, 119,
1 27, 135 . 36, 158, 163 J 16:1, 196,
209
I-Jv()nt gyár tervezési minta 51
elvont Itcrator 269
el,'ont Közvetítő oSLtály l<illagyása 282
elvont Meg\ralúsíló 157
elv T ()llt m-(Í\reJet 225
elvont ln(íveletck 16 330
elvont ()sztá]y 6, 153
el\Tont szinlaxisfa 219, 250, 25?
elvonl s7intaxisfál< 333
.
Elv.ontAbráLolás 156, 157, 1SH
ElvontG.yár 8R, 94
Elv()nt Ki feJe7és 251
[]vontlista 263 271
El\TontOsztály 329
F]vOJltTerlnék 88
Enlléke7let{5 9, 15 276, 287 289,319
en11ékeztető llél.p(l lJcjárási felület 295
E111lékezt.eté5 minta 290
Emléke7tető tervezés'_ minta 213
398 Programtervezési minták
Lll11Jloyee )70
Lncapsulator 220
El1c11a.ntl.cJ.J\!J azef actor)' 92
Encllanted.Room 85
e]lgedély 222
enl(élps7uláció 287
:enter 83
EJ1 t1) ri e 1 (i. 283
:Cnvcl()pe- ettcr 316
építési feliilet 100
építési f()lyam.3.t 100
ÉJ)ítIahiril1ll1S 1 () 3
Építő 8, 14,19,96,97,98,119,135,
136, 192
építő rüggvTény 100
ÉpítSzolJ3 103
Equipn1ent 173, 342
EquipmentVisitlJf 34.j
er(-5sen plraméterezett prC)gralJl 22
error: ii7enet 220
értél( 152
...
r: tékad.ásC:solnóponl 334., 34.1
értékacló utasítás()]{ 333
Értél(el 257
ÉrtékModcll152
éltcimetlen Jl1Űvclctek 170
frtel !11eZ 250, 251, 253
értelmezés 247
,
Ertelme7ő 9, 172 225, 248 345 31.7
:Frtel nCLő minta 250
,..
Ertesít 299
értesítés 226, 299
értesítéS fellilet 282
[r\ l ényes 3,cl.alc)l< 326
Ef\'ényesít(5326
éf\léTlyesító stratégiá]{ 326
eSetIICn)l 286
es<.:ménye]{ 182
eseJnén\7ke7elés 347
ol
escményJ{ezelő 236
esernénykczelé5 \risell{edés 182
esetágtkat tartalmazó függ,'ényck 16R
F
EstatJlislled 307
Esz]{()Z 17, 315
eszl<özJ<és z let 28
eszl{()zleltár 312
eszJ(üzpaletta 117
CSZkC)7típllSol( 312
ET++ 95, 105 116 121 127, 151, 163,
175, 1 H5, 194: 209, 236, 247, 285,
306,325
ET++ sz()vegépÍt(1-blol{k 220
ET++ Jraw 151
etgdb 127
E f]) rCJ gra.rn.rningEnvi ro nn1l:11t 191
Eva.lllatc 257
Event-I fandler 236
Fxeclltc 61, 23R, 24:J, 245, 21Í6 29?
eApcct206
expression 218
EXl)ressi()J1Nocle 192, 193
ExleociedI-I3.nu.lef 232
extcnl 21 ]
Fa 145
FaCl(J.e 9, 1.87, 358
Factory Metllocl 6 9, 106
17aElérőKépvjse]ő 147
fájl 185, 195
fá.jlnév 211
fájlrel1c1szer 128
FájlRenllszerEg)'ed 147
FájlRendszell-iLlülel 195
fák 172
fá.kon végzett a13pmuvelete]{ 261
false 257
raNézct 115, 14.6
fa.szerke7et ] 65
faszcrkezettf aggregátuill(Jk 268
fcllér (101102 20
fe1:1ér dol)üz()s újra]13.sznosítás 20, 356
fekete (ic)lJOZ 20
Tárgymutató 399
fekete dobozos újrallaSZllCJsítás 20 356
Fellda.t 7, 217
felllc)n.tás 164
felcserélllctő algoritmllscsaládoJ{ 12
Felcj()lgc)zF.lenl 273
felclolg(Jzó 111(í\7cletek 220
felelősségi l<f)rö]< 140 177 t 225
Felelősséglá. 1C 8, 18 23, 169, 176, 225
226, 227 230, 237, ?17, j48 350
felJlas7náló old3.li gyorslártzás 116
fel]1aszllá.lói cscrnények 236
fcllla.sználé)i fe]ület 2
felJ1aszn5.lói feliilet eletnei 2(19
fellllSZnálé)i fe]ü]et fin.0111ítása 13
feJ11aszná.lói fcliilelleDlezés1 Jnintái
360
feIJlaS7]láI{)i feliileti Jíszítők -183
felhasználói felületi eleme]{ 151
feI11aS7]láJ{)i felii]eti clcn1ké-szlel 154.,
175, 185
felllaS7JláJói l11Űvclctck 59
felh.asználói műveletek enged.éIyezése
185
Fel()lcl 293
r eloldó;\lltpot 2SH
f'els()[c)[é) ál180dó 308
felszalJaclítás 267
[eltételágak 318
fe]téte]es utasítások 232 309
,
felülbírálás 16, 271 283
feJii]et 14, 119 157
felülel egyszerusJtése 94
fe](iJet l11cgfclclősége IR 1
fclülctcl( kÖ7()lti kapcsolatol{ 15
felületi eJenll<észlet 86
felületillcsLtés 115, 152
fel ületcJr{>I<lés 7
fe]ülírandó J11ű\'cletek 3 1
feliiIírás 16 39, 6), 107, 170, 18
fe]ü]írt r11líveletel( 20
Figurc 109
FigyTe1é5 296, 307, 314
PileStre3.m 185
FileSystetnlntcrface 195
FileSYlc111Entity lri7
Filleri ng 1 Istlter3.tor 263
FilteringListTraverser 274
PinomÍtc)ltEl\lon tÁJJrá zola.s 156
fitlOt11ság 12 11
First 66 263, 269, 270
':;ixe(lStac]{ 153
fi7ikaj szer!(<:zct 35
FlyweigJll 9, 196, 201
Flyweig11tFactory 20]
főablak 226
Fogad 334, 337 339
fogadá 227, 238, 24.1, 243 350
f()gadó objel\..tu111 2 1
fogadá olJjektumol< 226
fogacJé}-]11Ű\Telet pál 238
fogalmi rétegek 299
foglalás g)'Újtőtárból 325
fogyasztás 173
fól<us7 j31
FolyaJl1 185, 219, 276
folYélm ()tJjektl111101( 185
f()lyaJ113t 12, 195
fol)ra.mosztály IHS
f()I)Ttatásol{ 266
Font 206
F()nll )ia] ogD ircctor 27R, 284
fOfclítási cg)iség 131
fordítási függőségek 190
forclítási iuej(í n1eg,'alósítá.s-tllggőség
157
forclftási · <..lcjű szerl<ezet 24
fordítási icJej(í tí Jllsellen(jrzés 21f
F()[(i.lté) 188
fordltói a.lrCn(l.s7er 187 193
rord.íté)i 1{é)dol)tit11llizáló 325
f{)f(i.ítóprogra.m 77, 261, 333
[OfcJílc)tt [<eresés 65
f()rcJít(ltt vezérlési szerl<e7et 330
forInális ál-)rázolás 359
fCJfl11áJ is .nyel y"cl( 359
400 Programtervezési minták
form.1.zás 40
formázási pa ancsok 198
form.ázó algcJritmus egységbe zárása
41
formázott l+íratds 333
forrásregis7ter 175
rameVvorJ( 28
Fresco Applicalion Toolkit 317
fr.end 267) 269
Pr.ssít 300, 30
Fr'ssít lJlŰve]et argumentuma 301
Fris::,ít művelet paraméte "C 300
frissítendő te iilct 231
frissítés 286 300
.#
frissítesek láJlcolata 299
Frissítő felület 298
[unl{tor 247
futásl10SSZÚ kódolás 185
futási sebesség 197
futásidejCí ]{Örn.)7CZe 120
futásideju körül nényel( 225
futásiclejtI pillanatfelvétel 285
futásid.ejű szerl{L7et 24
futásidejű típusei enőrLés 168
futasid.ejű r'pus'nformációk 232J 217 t
34.7
függő objektllTI 296
függőség 12
függőségek 89,296
függőség feltételek 299
függőségi rendszer 300
függőségi v".szony 131
fllggvény 11
függvény l"'VÓ o Jeráto 247
fü bb rvényol)jc (lUITI 24.7
gépi CAI) 28
gépi ]<ód 193
gépi ulasításo.{ 191
GetButtonLayoul209
GetCharCode 73
GetCI1Hd 176
GetComposite 171
GetCurrent 66
GetExtent 142, 211, 218
GetMa elOl
G-etMenuBarLayo11t 209
GetM'ss!Jelli 19S 74
GetSelection 283
GetSubclasses 145
GctSubdirectories 14:5
GetWidtl1 182
Get\XTincl.owIlllP - 63
globá is llozzáférési IJont 128
globális környezet 25 J
globális név tér 191
globális objektumok konstrul{lOrai 131
globális t[ })lázat 127
glob3.ls vdlto. Ó 28, 129
globális változók 339
Glue 358
Glyph 38, 199, 203, 208
GlyphContcxt 20/
Glyp 1Context::GeLFc)ot 204
G-lyp 1Context::Next ?04
GlyphFact()lY )07
Glyplls 175
GNU gdb 127
Goldberg 126
gomb 48, 209, 229 237, 277, 283
görbék 57
gördítősáv 43, 18, 87, 178, 209, ?37
görge LS 1 77
GörhetésDíszít6 - I 9
görgetési képesség 181
GörgetésJd.e . 79
gráf 202
Graf+l{a 117, 166, 211
gc 206
GcJ.bAdaptor 127
GeneraleCode 341
gépfelépítés 93
árgymutató 401
GrafikaG)Tár 136
grafiJ<ai alapelernek 165
gra.fikJj j<:llemző 203
grafikai rend.szer 66
gra.fikus a.11\:alma.zás 165
gra[iktlS díszítés 185
grafikus elelll 234 235
grafikus felllasználói felLilel 1 BS, 226,
277, 296
gra fil( ll felll asznál ó i fe l ü 1 eti
ele111készlet 77
grafikus f issítés 236
grafiklls ()11jektumo]{ 199
grafil(us osztál)!ol\. 2- 7
gririkus szerkeszt() 28, 287
grafil(us vezerlő 277
gra.f>kus vezérlők elv(}nt a]Jp()s7.lálya
282
Gr3.fikusEszköz 117 136
Graphic 151 ]66,211, ?17
Gral)llicBlo(l( - 5-
Gral)jlic'l()()l 1] 7
(;rap]llcs. 7, 175
Gra 1)11" cs G'ems 360
(raJ)]licsFactory 136
gyakr3.n iSlnétlő(I.{S megoldás 2
g)rár 15S
Cryár InódsLcr - 06
gyárak 'Í:9
. gyáral< l11in.t cgyl<ék 90
g)/árcJ1Jjeklu m l36
("{ártó rn.etód.us l06 107
..
G.)rárl()fügbY\Tény 6, 9, 19, 94, 96, 106,
107, 264:, 276, 332
gyártófüggvén)T fclülírlsa 90
Gyárté)fl1gg\rén)' minta 96) 120, 136
g)7ártófügg\rényck 116, 330
gYCflllCk 166
gyerrnekek elérésére szolgaló felület
169
gyerlnekek l1almaza 171
gyerlnel(ek sor1 endjc 172
H
gycrmekelem.ek 16R
bermekfüggő tnlíveletek 66
g)rermckl<.el nem rend.ell<ező ]{épjel 68
gyermekkezel(5 fe]ii]et 170
gyerm.cl<l{czclő művelelek 170
g)lcrmcl<-kezel(5 m(í ve 1 ete 1< l)evezetésc
170
gycrmekmutató - 71
gj r erme]«()hjektlIJJ1.ok 193
gyűjtemény 276, 294,337
gyűjtenlény egységbe zá.rá.sának
l11egsértésc 295
gyűjlell1ény Dlérete 158
gyűjteménycl< 267
gyűjlenléJl)FOs7tály 1 57
gyűjteln.ényosztál )l- könyvtár 276
gy(íjtcményosztály()k 2H
gy(fjtl5tár 98
lltgyomány()s prc)grarnt1)JeJvek 3)4
llaltl1az 163, 337
llálózat.i kapcsolat 307
11amis 62, 257
Ha.ndlc 158 163
lIandJe/Body 153, 158
HandleBufferFLllJ 185
Hanti.leI -Iell 228, 229, 231, 233
IanclleMouse 217 218 2R4.
, .
Htnd.ler 231
J anc1JeReql est 231 232
11angjegy 117
11dr(iver 26
113.rd\'er -arcllitcl{túr'ik 193
llár()md.inle117iós ]lelyszínel( 317
}1asáb 35
llasll 158 172, 300
1- .as.Hel}) 233
HasllSet 163
ITasl1.Table . 63
113.sítótáblJ. 72
02 Programtervezesi minták
l1asznál{) ]{apcsolal 2 1.
l1alékonys(.g 110, 250
latéJ;:onyság11övclés 253
llató]«()f 11
ház 3"2
11<..Jp tOplC 233
1 Ie]pHa.ndler 228,229, 231, 233
l1.e yes tervezés 355
llelyesírás 70
]]elyesírás-ellen6rzés 65, 70
Helyettes 9, 15, 116 1.39, 210, 2- 3,222
l1elyettes más()lása 2. /
Hel)reLtes ffi11t r - 153, 2 4
Helyettes tLrve7ési 11intd 212, 267
l1elycltesd.iszítő 223
Helyettesítő 210
11elyettes-szerkezet 213
11Llyettestípusok 2 4
l1ely. á.llapotinfo máció 314
11cly + lnásolat 2. 8
llelyőrző 2110
]lelyrcállítás 240, 287
llelylelenül írt S7 dval{ 65
]1.i1J2.halmo7ódás 2/.3
11ibakeresésÍ iniormáció 85
llil1akercsó 127
llibakereső-felü!cti alkal nazás 127
I-lillakercsőllles7tő 127
h.ibal(eLelés 216
Híd. 8, 73,153,155,221
IIídminta 14:0,1)3
Híd tervezési mintJ 58, 154
llierarcllikus felép"'tésű informá.ciók 36
l1ierarchjJ{llS logikai s7e .kezet 209
Ili-fi berendezés 72
llÍ}JCrSzöveges dol{umen.tumol{ 355
1 lí vási vere TI 268
1 Ii'latkozás 213
l1ivatkozási lánc 23
11ivatkozá.s-zám]álás 156, - 57, 203
llivatko7ásszámláló 58, 2. 4
Hívó 241
I-Tollyvvood elv 330
Homlok7at 9, 12, 187, 189, 196, 222 ,
286,358
ITornlol(zat Jninta 140, 188, 90
110(Jk 1 09, 329
1 T Oo!{OI)eration 330
llordoz latóság 3, :17
llorizontális bejárás 268
llorog 109, 329
llorogművel<.:tck 330
110SSZÚ eljárás()1z 309
110SSZÚ fe]tételes utasításo]{ 309
IlotDraw 3 - 5
Hozamgö be 325
IIozzáad 69, 70, 176
hozzáférés-szabályozás 220
lloz7áférésvezér és 331
l1.úZÓ lllo(lell 301
H ypllenation Visilc)r 75
110 185
IBM ]Jrescntatic)n Mana.ger 154
TconDockWindow 161
leonWindow 51, - 54., 60
idjómák 354
°dő 301J, 318
id.őz"tő 304
' 309
igaz 62, 257
igény szerint 210
igénye]{ 25
1]{onAblak 54 154, 160
ikonbtyífjteJnény 318
iko]101( 160
ikontároló]{ 161
Illes7len.dő 14/
illeszte11dő ]{ifejezés-csom.ól)Onl 34.6
illes7tési folyamat 254
Il esztű 8, 1.1, 44, 186, 220, 221
IllLs7lő minta 139, 164
Tárgymutató 403
IInage 211, 2,17
IlnagelJroxy 211, 2 8
IITIagel)tr 211
.1llllutable 72
lmplcnlentor 157
im.Illicit receiver 227
index 207, 270
Indexed.CollLction 257
io.d.exelés 39
Initialize 116, 122, 124
in line 272
INORDIR 66,265,268
inorder llejárás 65
injJutState 254: 345
inJ1utSlate argumenlul11 346
Insert 39 66
InspcctClass 194
In.s11ect011jecl 191
lnstanc<: 129 130, 131, 133 314
Jnstrumenl325
integrált áraml(ör 173
integrált áramkörök 326
inte +actiol1 tec]lnique 1 ibrary 127
Inleracl()r 151
intera}zcló-d.iagram 7
interaklív eljárások 127
interaktivitás 109
interest 301
Jnterl1ret 250, 251
Interpreter 9t 225, 248
Intersecls 39t 199
InterViews 95,135,151, 175 t 185r 208
217,306,322325
Intéző 289 290
Inva.lidateRect 236
nvariáns 169, 331
InventolY 344
InvcntoryVisitor 344-
lnvol{er 241
IONA l'ccllnologics 116
irányító 97, 98, 279, 2H2
irányított kör ncntcs grá 209,302
IRIS Inve 1tor 347
IsDon 66, 263, 268, 270, 294
IsEmpty SO
ismeretség 24
ISll1ert fe]]13s70álás()I( R
Ismét 62
iSl11étell végrel13jtás 210
IsnlétJésKifejezés 249, 250
IsMisspclled 74
Ttem 33H
ItemTypc 294
IleralionSlale 291
Iterato+4, 9 67, 17:, 226, 262, 263,
268,338
lterátor 262
Iteratc)rOutofBounds 270
Iteratc)rIJir 272
lvan Sutll<:rland Skctc111)ad 126
James Coplien 360
Javít 323
jelen.téselell1ző eJjárás ] 05
jclcntésl(ésLÍtő 360
jelentéstaJ1.j ellenc)fzés 265
jelölésel{ 8
jelölésj rendS7er 354
jelölt 226
jelölt objektumok 225
jó progra 11sze kezet 357
Jollnson 3 5, 328
K
ka.pcsolatban álló objelztumo]{ 296
kapcs()lati kötések 286
}<apcsolattartási minták 319
kapcsolallarlási viselkedés 351
kapcsoló 173
1<.3I)csolód.ó m+nták 8
Ka 1csolódva 307, 314
404 Programtervezési minták
karakter 35, 196, 199
]{arakterf()lyanl 19]
kara]{terkészletel{ 197
karal{tcrkód 198 203, 209
l(arakterJódokkal in.dcxell tál1J.ázat 203
karal{tcrldnc ábrázolás 156
karakterláncminták 24.8
karakterlá.ncc)s ábráLolás 63
kar.ktcrsorozat 185 253
.
kártyál( 172, 34-2
]{atalógus 90
l(ent Hecl{ 360
kén.yclmi 11ázasság 153
Kép 166, 211
képignys7eint210
I(épcsMegn)7itDc)](umentu111328
képJlelyettcs 210, 211
Képjel 199, 203
l(épje]-1JctűtÍPus 110Lzárend.elés 201
képjelek 3R
képjelfiiggő t)ejáról( 68
l(é )JelGyár 207
Ké!JjelKörnyezct 204:
képjeJtípus()I< 70
l<épmcgva1ós-""tá.s 164
kéJ]viselct 21, 27
l(épvisclő 21, 147, 195,210
!(ép\riselő ol]jel<tumok 11.7, 152
l{érelelll 1- , 6t), 64 232
kéreleI11 egység1Je 7árásd 60
kérelelll ke7elésc 226
l{érelem teljes-""tése 2j()
kérelen1 továl1bítása 180
ké elCln()bje]{tuln()k 232
kércleI11- Jaraméterek 232
kérelel11továl1bíta.s 221
]{érclmek 213
l<ére]mek ábrázolása 231
kérelme]( ]lallnaza 232
kérelnlel< kódolása 351
l{érellnek teljesítése 226
l{érclmet kibocsátó ügyfél 228
kérc::lme£ő olJjcktun1 277
keresés 65, 132, 172
]{eresési id.éS ?07
kereső algofltlnus 248
keresztkapcsoJatol{ 278
lcerLtren(-}szer 28, 116, . 75
l(eretrendsLerek 106, 356, 360
keretrcndszerrelll1egl1atároLott elvont
gyárak . 34
Ké Fell13s7n.áló 211
Kcrne 1 J)roX)T 212
l<es]{eny felület. 46, 289 291
keske11Y 11íd 163
későblJi fel11as7n.álás 185
]<ésői kc)tés 14
1<'és7 66, 263, 268 270
Kész-""tAjtó 1 2 3
KészítFal123
Készlet 86
I(észülMegnyitDc)kuJ11entum 328
két feJi" lel egymá.slloZ illesztése 14.6
](étdilnen7iós táblázat 347
kétirányú illesztéS 145
kétirányú osztilyillesztő 46
l{étszeres öröklés 180
kettős közvetítés 310, 347
kettős szegély 180
ke7deménye7{) 288, 289
]<ezdő tervező 1
kezdőérték 122
](ezdópc)nt 14:9
1,,-ezd.őszil11bó 1 il m 248
KezeIE(}ér 284
LJ
KczelKérelcll1 231
ke7e]ő 229, 230, 231
KezelSúg() 228, 229, 23
kiegészítő szoJgálta.t3.sok 177
]<iegy<:ns(llyozott fák 263
l(ifejezés 24R
KifejezésCsOmÓl)Ont 1 92
kifeje7ett fel ülcl-meglla.tárc)zás _ 47
l<ifejezett llivatkozás 300
Tárgymutató 405
kifejezett ()S7tá])rnlegadás 26
ki feje7ett SZÜJ.őllivatkozá sol{ 169
kifinomullalJb llivatkcJzás 212
I<iír 270
Kiír.Alka mazottak 270
kind 66
Kinézet 209
l<irajzolás 209
kiseb11 gYŰjtemények 58
l(ismérclű objektum 181
Kit 86, 95
l{iterjedés 211
kivételezell Jl()77áférés 267
l{ivonattáblik 163, 72
klónc)k el(5készítése 122
Klónoz 117, 121 136
klónuzIs 122
kód megl(ettőzésénel( ell{eliilése 221
kó(llJa "cl.rólozotr" művelel]1í'lá 231
ké)ci-elé5állítás 187 t 253, 265
1{ódl<ettt5ződés 328
ké)d())limalizál{) 333
](ód-újrallasznosít3s 329
}\.()tler 267
KoIJéga 281
Kollébl osztályc)k 281
kolJégák 35
komrnu.nikáció 225
K001J107Íció 165
Kornpozit 165
]{()nkrét gyár 90
konkrét LétrellOZó 110
k()nl<rét nlegvalósítás 56
kan.krét m(ívclctck 26, 330
konkrét osztály 16
KonkrétAlany 298
...
KonkréLAllapot308
K()nkrétBejárc) 265
Konl(létDíszítő 180, 181
}«(Jnl<rétFlem 80, 222, 336, 337
Konl{rétÉpítő 98 99
\..onkrétGyár R8 9-1
l(onl(rétKezelő 230
Konkr[tKc)zvetftő 281
I(on!<rétLátogató 336
KonkrétLétrel1.()7() 1 (JS
KooJ(rétMegfigyelő 298
KonkrétMegvalósít() 156, 157, 58
]«)nl<rétC)s7tály 329
I(oI1krétÖsszCS-'lŐ 265
KonkrétI)arancs 2/ 1
K011krétPellelysúlyú 201
I(onl<rétI)rototípus 119
K () J1 krétS tra té gia 319
I{onl(lélTcrmék 88, - 08
k()nne]<lo[c)l< 286
konstrul{lOr 19, 85, 102, 104-, P] I 2, 122,
131,133, 50, 183t 194, 208, 234,
245, 2S8t3 3
l(onstrukt()rllÍvás 48
konst lJl(torn1.k átadott IJaralnélerek.
157
l{onszolidá.ció 356
l{ooordinála.rcndszer 237
korlátfeltételel{ 26.8
l{orlá.tla.n szintű visszav(}nás 210
k()ltas7er]<esztó 1 17
l{ottavonal 117
kölcsijnös függősége]< 280
]{ö]tség 197
költséges objektuo10k 210
Ki)nnn.yűsúlylt 253
lc()ny\'e}(Srends7'er 128
Kön.yvtárFaNézet 146 147
kÖn}7vtárszerkezet 14.6
Kc)nyvtárTallózó 147
]<.ör 136
l(örGyár 136
l{örkörös függőségck - 90
körl{örüs llivatkc)zás 12 1
környezet204 1 250, 251, 3083-9
!{örnyczct á.lllpota 311
k()rnye7etfüggő állapot 140
}(örnyczctfüggő llClyi menü 210
406 Programtervezési minták
1(()rnyezetfügg(S infornláci()l< 199
kC)rnycLctfliggő progranl 26
1<örn)Te7etfüggő SllgÓ 226
kC)r11yezcti \Táltozó 127, 134
kötclezé5en feli11íranció ala.pnlű\7eletel{
331
Kötéstcl()lcló 287, 292
kötésfe]oldó rend.sze. 287
kÖ\Jetkczelesség 140
}(Övel]<ezlnén\'ek 3. 7
- }
«()letkel.ő 66, 263t 266, 270
1<ö\/ct}.ce7ő elem 22H
kc)vető 228
közös t)ejárási fclület 263
kC)7()S Elcrll (Jsllály 181
]<ÖZÖS el(5tag 331
l{özös visell{cdés 278
KözösFal 102
l(öztcs frissítésLk 3()ü
kc)ztes réteg 278
l(özvetett elérés 221 222
J
!\.öz,\Tetettség 225
közvetítés 281
Közvetítő 9, 23 225,277, 278, 281
303 306348,319351
KözvrctÍtő l11inta 196, 280
kc)z,\retJtő objektlll11 23, 225
]zöz\lellen elérés 222
!(üzzététel-El(5fi7etés 296, 297
közzétc\lŐ 297
1_rLativit5s 359
kupaera llel}'ezett bcjáré) 267
l(ufz()f 262, 266
kur70r .lap(l hejáró 268
kUrZ(Jf llap(l l1ejárók 276
külcié5 227 350
f
küldő-fogadó ](3.pcs()lat 350
Jzülő állapot 197 201
kliJső állapc)t eltá.volítása 202
külső ál]lI)oti11form{lciók a.z()nosítása
202
ki.ilső állapotinfofInációl( ral(lára ?04
külső llejá.ró 266, 268, 311
l<ülső lJcjárók 274
lar)iri ntus 82, R1 J 91
I3.birintlJsFpítő 100
labirintusépítő 111Lí\lelet 01
Lal1irintllsGyár 91
La l)irintlIsProtc)tí pusGyá.r 122
lánc 226
láncolt lista alll)Ú nlegva]ósítás 158
]áncolt list'tk 163t 172
la.pllib-l 195
látJlatatlln bef()glalás 11
látJlató eleme]{ 178
LátllaléJElel11 179
rátogat 336, 339
LátogaLFrtékadás 334
LátcJgat!(onkrétE]eJTI 339
LátogatéJ 4, . O, 11, 15, 22, 75 ] 76) 193
226 252, 261333,331,336, 348
358
L"tt()gltó tervezési Jninta 76, 261} 335
Iátog3.tVáltc)zóHiva.tkozás 334
L3 tszal 187
La y "F()l1t 209
L3)70lllKit 95
laza csatolá.s 26, }9, 190, 225, 277, 2S- ,
319
laz)! initializati()n 113
Ie3.f 68
let)egé5 eszköLIJalett3k 160
lefelé irányu]() átallkítás 94:, 125
lefelé irányt1] Ó tíPllsá talal{ítás 91
legalMessages 2 2 0
Leíró 153, 158, 163
lcképezés 347
lelt3.rl(észÍt() látogal() 344-
Lcltár átOg3.tÓ 314
lenlezmeglltjtó 173
lemezre 111entcll ()i1jektul11ok 1 1 1
Tárgymutató 07
Le01J)e]-Zj\T 185
lenyitllató lncnii 60
léptető matc]l: Jll.ű\'elct 256
Lerom1101tfa193
Ler01111JoltI-#al)irintl sGyár 93
létezé5 felület 222
létrellozási fül)lamal lOO
1 élre II (r/
ás j ]11. inta 137
létre}lozási tninták 10, 19
81
létrell()zási objektl111ffiinták 11
létreJlozási osztályrninták ] 1
LétrellC)zBejflré) 68, 173, 264, 271
étre]lozDol(umenlllm 107
Létrcl10 zF á j ll) á r lJeszéd.a lJ la.k 1 09
..étre]lozGördítőSáv 87
I..étrclloz. \..ar
ikter 20B
LélrcI-loz
alliri11tus 92
Létre110zMóciosÍl() 11Í.2
LétrLllC)z{) "1 OH
1
ét re 110 zÖ sszetettL3.b irin III sIO 2
Lélrell()7\le7érl{51{ 280) 283
lev
ilasztás 298
Levél 167
le\Té] l<épjeJ 68
levélJ1ez való 110Lzáati{ls 171
lc\rélc)tJjeklum 167
l..exi 33
Lczár\/ d 307
314
.
li11g++ l<Öl1.yvtár 163
LiclJcrl11an 217
1 ine 165, . 66
ineFa-ctory
136
..ineS]laIle ] 4:1
jnl<edlist 163
Lin!(c<-!Set 163
List 262, 268
L'sta. 262
33/
LislaBejáré) 68, 262, 269
l"stál{ 68
li
l3mező 278, 283
listalnező feltöltése 284
LislB()x 2R3, 285
Listening 3()7
List tera tor 68, 174, 262, 269, 27 , 272
ListTra\'erser 273
lileral 24.8
literá.l 248
LileralEx!Jression 24:9, 251, 315
ljterális karal{tcrlánc 254
LitcrálKifejezés 249, 750
Load 122, 219
Loa.dI111age 2 - 5
logil<
li változól< 257
r
ook 209
lo()k.-and.-feeJ standard 17
ookup 132
lllsla elé5](ész1tés 1 - 3, 131
MacApp 1- 1, 116, 181, 182, 236, 331
Macinl()sh 52, 331
MacroColnm
lnd. 176, 239, 244, 216
ma.gasabb s7in.tű felület 187
nlagasall1J szinlú műveletek 1 56
mag
lsság - 49,211
nlagjc toket1 319
Jl1.á.giklls jel 349
malce: nletódus 90, 125
Mal{cColor 95
Make )oor 1 23
Mal{e ?ont 95
M
lke \Xl
ll] 12.1
Ma]<eWin.cl()\v 95
Makr{)J)arancs 176, 239, 212
Ma]1ipulator 109, 112, 149
Ma!JSitc 83, 125
111aracla11dó ]<ötés 153, 155
tl13.r3.cla.ndú ()bjeklllT11 2J 2
Marie Lilll()n 34.7
l\.1arri3.ge of Convenience 153
111á
i"elülelre törtéo.ő 3tültctés 190
második a131Jclv 21
Másol 259
408 Programtervezési minták
lnáso á 21
másolás rásJor 214
11ásoló konstnl]{tor 121, 124
malch: 254., 346
mate nat.kai egyenletek 287
malematikai (. c.jL ések 333
Ma7e 84
MaLcBui (er 100, 101
MazeFactory 91, 122, 133
MazcG.ame 84
MaLel J rototy )eFac aty 122
McCullogll 220
Medialor 9, 225 277, 28]
megbízott 31-
Megfibryelő 5, 9, 18, 226, 286, ?96, 297
298, 34.9
Megf'gyelő minta 286,29/,299,306
Megfigyelő tervezési minta 282
llleg :'igyclőfüggő frissltési prolc)l<o]]
30
Megfordítllató 6'
ncgl1ajló 342
meg]lajtók 1 /2
fficg11íljlé}progra TI 2
Megjelenít 331
megjclLníLé 296
megjelenítési mód 209
m.egjelenítési módszerek 296
megjelenítési szabvány 47, 86
megjelLníl(i s abványok 209
megjelenítési szabványo!{tól való
l1ggetlen.sCg 209
meglevő J1"vatkozások 23
I11eglevó objckluml1ivatkoz/.sok 231
Megny't 307
MegnyitDokumentum 3)7
MegnyitParancs )39
megold.ás 3
megosztás 169, 96, 202
megos llató objekturnok 220
lnegosztott állapolinforJl1.[.ciol{ 202
n1egosztotllevé]-csomóponl202
D1egosztott objekllJm. 197
lnegoszlolt obje].ctumok kezelése 202
Inegosztott slrat[gá]( 321
Jl1egosztolllörzsű ]eÍról( 158
Méh se 62,243
Jl1egsetnmisít[s 311
Mcg\lalósftás 8,140, 149, 153, 157,32
megvalósítás részletei 1. 57
tnegvalósí dt,-függőség 9
mehJValósítás' függőség 21
llegvalósítás. függőségek 53 3 O
mebrvalósítás' lTIodcll 355
megvalósítás örökJés 18
MegvaJósló 156, 157
megvalósító osztály 56
lnegvalósítók 1egosL 'asa 158
Megváltozott 283
mellé (13lás 202, 220
mélymásolás 120
mélymásol.Jl - 2
Memento 9,287
metnóriában tárait l<aral{te lánc 185
rnemóriafogJalás 325
memórial{ezelés 63
memória-011jektulll 195
mem.óriaszivárgás 272
Me noryObjecl 195
Mem.oryObjcctCacl1e 195
Me noryStream 185
Ment 122, 219
MeI1U 238
Mcnu11arT ayout 209
Menultem 238
menü 48, 209, 237, 238, 277
Menü El ern. 238
Message 219
metaosztály 13)
metódus 1-
meLódushJvások 220
metódus-kikeresés 216
melódusválasztó 286
Metszi 199
Tárgymutató 409
Meyer 53
minta neve 3, 7
minták leírása 358
lni11tanyelv 359
mixin 17, 228r 234 271
Mc)de Com,poscr 127
Model 4:) 306
Moclel/View/Controller 226
Modell 4., 226
modell állapota 226
m.odetJ-né7el-vezérlő 116, 226,306
Model- View-Controller 4.
MéJdc)sÍt() 109, 142
mondatok 248
Monc)G lyph 45
Motif 47, 86
MOlifLool< 209
MotjtVe7érlőC-;yár 87
MotifW idgctFactory 87
MoveC()mmanc1 292
mozgató művelet 288
MozgatlJarancs 292
működés k'_bővítése alosztályokkal 27
multimetódus 4
Murray 267
MutaU}árbesLédablal( 280
műve]el 14., 237
művelet felülírása 27
művelet neve 336
műveletek 11, 347
műve]etet kezd.eményező objektum
242
műveleti függvény 2-17
múveletvégző l{épje ek 60
művelet-visszavonás 240) 287, 288
művészi rajzolás 2 8
Mve 4,306
MyClass 216
MyCreator 111
M)lCreator::Create 112
Myproduct 11
MySingleton 133
MyType 339
,
nagy fin.OIT1ságú olljel{lUmok ] 96
n,lgy számú objel{lUm 199
Odgy szoftverrendszerek 190
Nagyító 237
nabrykövel212
nagyméretlf ras7terképel< 210
Nam.eSingleton.Pair 132
natural size 322
nem karakter képjelel{ 208
nem módosuló 172
1em soros elérésű gYŰjtem.ény 276
nem virtuális lagfübgvény 331
N emMe gosztottKon.l{rétPe]1elysúlyú
201
nenlterrniná is szimbólllill 251
nemtcrtninális szimbólulllol( 257
Nemtermi náIisKifeje7és 251
nested generalizations 56
NetPrlce 174
NettóÁr 174
névadási szabályok 111
NévEgyl(ePá 132
nevcjtelt váltoLó 258
névtelen függvények 266, 27?
névterel{ 191
new I TI.űvelet 131
NewGra.phic 136
Next 66, 204, 263,266, 270, 294
NeXT ApIJKit 52, 164r 236, 331
nextA.vailat)le: 256
I\TEXTSTEP 147, 212, 220
Nézet 4, 5, 160, 226,31
né7etek 181, 306
nézc.tkezcl6 285
nil 219
f\ode 333
NodeVjsitor 334.
Nontermina1ExlJressiol1 251
NormálMé etIJaranc,; 239
NOf111alSi7eComman.d 239
nOl257
4 O rogramtervezési minták
Notify 299, 301
NullBe"áró 68, 268
NullIterator 68, 173, 268
nulln1ut3. o 170
null műveletek 194
NXBitMaplIllageRep 64
NXBrO\\lSer 152
NXCachedlmdgeRep 164
NXEPSImageRe) 164.
I\"'XImage 161
NXIllla,geRep 164
NXProry 212, 220
nyelvI támogatás 291
nye vj;írások 354
nyelvtan 225, 248, 354
nyelvtan megvalósítisa 252
nyelvtani ellenőrzé 65
nyelvtani szabá y 249
nyelvtani sza11ályok 252
nyilvános 149
nyilvános alrendsz<...ri osztályok 91
nyi vánas felü .et 191
nyilvántartó 12 - , 132
n}rornkövelési információ 185
nyom .atás 227, 236
nyomt tás" kép 233
nyomtatds pá .beslédabldk 236
nyomtatási S<)f 28
NyolntatásPárbes7édablak 227
nyon1tató 128
nyíljt11atóság 322
I I
objeJtum belső á la 10t3 287
objek um belső része" 18
objektum fe ü .ete 1/.
objektum módosítása 212
o jektum tejjes szolgáltatásköre 223
objeklumfelületek 14
objek Um110Z való 110z7áférés 220
olJjektumillesztő 142, 144, 150, 153
objeklum!{lónozás 121
objeJtumkompozícjó 20
ol)jektum {özpontu progrAmozás 354.
objektumkö7pontú rendszer 175
obj ek tu mközpontú szöve gszerke7t6k
196
objektum]{özpontú tervezés 355
objektumközpontú tervezési minták 3
olJjektuITI-Iétrel107ás 48
objektum-létre 10zási mintak 8-
objel{tummegvalósílás 15
objektuITI.1nintá 7 11, 221
obje .{turnak 11, 355
objc:ktumok azoD_ossága 181
objektumok fele ősségi körökkeJ való
bővÍtése 180
objektumok közötti függőségek 226
objektumok közti fiiggősCge]{ 190
objektumok megosztása 40
objektumo]{ összesítése 24
objektumoklloz való hozzáférés 210
objel{tumon]{énti belső
állapot" nforo1ációk 2 02
objektum-összetétel 20, 27, 1 7, 136
139, 43,166,186, 221t225,356
objel<tumproto (ol 281
objektumszerkezet 333,337
objektumsze kezet bejá ása 341
obje {tum-tulajdonság 199
ObsLrvab.e 306
()bserverS,9, 226, 296, 297, 298,303,
304,306
Okos he yettes 212,214
okos mutatá 212
Object 125, 220
Object gyö]{é .osztály 303
Object Modeling Tec11niquL 7
Objective C 90, 120, 147
Objects for States 307
ObjectWindows 276,326
01JjeclWorks\ Smalltalk 45, 152, ] 85,
94
Tárgymutató 411
oldalikon 60
OlvasFolyam 276
olvasóprogram 96
OMT7
on osztá ymetódus 126
OOPSLA '91 357,360
OOPSLA '92 357
Opdyke 328
Open 307
OpenCommand 239,241
OpenDocument 327,332
OpenLook 209
o,perátor. 5
operatorO 247
operator* /72
ope ator> 214, 272
optimalizdló 325
or 257
éJra 305
O.bix ORB 116
Ordered.Cc)Jlection 257, 276
originator 288, 289
ősosztály nélküli oSLtály 216
őstípus 14
oszlopdiagr dm 296
osztály 15,17
osztály alapú mintál{ 221
osztályal.onosító 111
osztályba so o ás 10
oszlály11ierarchia 225
osztály lesztő 144, 149
osztá yilles rők 139
osztá y {önyvtár 236
osztá ykönyvtárak 329
os tJ ylélreho ási minták 81
osztá ymetódus 129
osztá ymnták 11
osztá ynlűvelet 129
Os tályné z et 116
osztá]yobjektum 120
osztályok ábrázolása 155
osztályok dinan ikus betöltése 120
osztályol{ megvalósítasa 157
os lályok s erve ébe 222
osztályo]{kal történő paraméte ezés
136
osztályöröklés 16, 18
osztálysablon 23, 245
osztá yválto7ó ] 12
önálló objektumok 166, 196
önállóan terve7etl oS7lály 22]
ÖJlhívás 140, 66
önhívó felépítés 36
önhívó összesítő szerl{ezetek 268
önl1Ívó összetéle (10) 153, 165, 222
önh/vó szerl{ezete { 276
öröklés ll, 20, 153, 177, 221, 225, 252,
320,355,356
örö <ölt művele " 330
örökö t műveletek 300
Összeállít 325
(}sszeálJítási modell 100
Összeá Jító 41, 318
()SS7edIlíló utasítása ( 172
összeegyeztethető felületek 38
összefér11etetlen felületű oS7tályok 141
össze {ötől{ 286
összeomlás 2/.0
ÖS'37esítő 265
összesítő objektumok 262
összeszer {esztés 132
Összetétel 6,8, 12, 18, 20,41, 106, 127
139 t 165, 167, 168, 186, 192, 202,
203 J 209, 222J237, 261, 268, 276,
318,337,347
Összetétel minta 165, 166, 172, 175,
231,22, 252, 261,342
Ósszetétel teI\Tezési minta 40, 106
összeté elek 268
összetételek bejá ása 176
Összetett 165
összetett aggregátum_ok 265
összetett frissltések 286
ÖSs7etetl frissJlése]{ egységbe zárása
302
összetett kép. elek 207
4 2 Programtervezésj mintak
összetett objektllm 6
ÖSs7etett objektumok 96
összetett protok()ll 136
összetett szerkezet 166
ÖsszetettElem 340
ÖsszetettEsLközök 173
parserCIass 116
parsjng 252
partCatalog 90
Pascal 4
)ascoc 220
PassivityWrapper 185
!)aste 238
PasteCon1mand 238,244,24.5
.Pa.sziáns2358
passzív 272
Pásztá7ó 187, 19
patll 57
Pe11clysúlYÚ 9, 12, 181, 196, 201, 261
pe 1elysúlyú grafil{us objektumol{ 203
pe11elysúlYÚ lcvél-csomópontok 202
l)ehelysú yú minta 14.0, 176, 169, 197,
199,310,316
!JeI-lelysúlYll oLljektum 197
pe .1elysúlYÚ olJjLktumol{ 208
pellelysú.yú ol]jektumok Jnegosztása.
200
Pellelysú YÚGyár 201, 202 J 207 209
lJéldakód 8
pé dány 16, 129, 131,311
példányok s7ám.a 202
példányosftás 16, 137 210, 217,311
példányosítási folyamat 81
példányváltozó 310
pénzforga am 325
pénzügyi eJemző progra.m 77
pén7ügy' eSLközöJ 1 J 6, 325
pénzügyi modellc..lo alka ma7ás 28
perform:witllArguments: 219
perzisztens 222
Pete + Coad 360
Piclure 166
p .llanatfelvétel 288
plugga11le adapter 145
JJluggableAdaptor l5?
PM 18, 57, 161
l)MAbla.k 154
IJMlconWindow 154
,
p
11al etták 161
PaletteWindow 161
lJane 285
paraméter 8, Iri} 23, 60, 66, 70 85, 9 ,
94,101,111, 152t 194, 199,226,
240 273
param.étcrek átadása 232
paraméteres illcsztő 148
paraméteres műveletek 91
paraI11éterezés 117, 24:0
paraméterezell gyártófüggvény
felü t)frá13.sa 111
paraméterezetl gyártófüggvények 111
paramétere7ett típus()k 23
Parancs 8, 14, 18, 6 , 226, 237, 238,
241,292,295,349,350
IJaral1CS mjnta 176, 240,2/2, 247
Parancs objektumok élettartarna 24.0
Para.ncs lervezc:si minta 61, 237
parancselőzmények 63
.para 1csok so. ozala 239
parancsössLLtétele \: 212
parancssoro7ato ( 210
PárbeszédAblak 54, 109, 16 , 226, 235,
277
párbesz[ciablak be?árása 285
Párbeszéda blal{1 -án yító 280
párbeszécJablakok 160, 326
Parcl)lace Smalltalk 85
IJarent 40
párllu7amos 2
párlluzamos osztályllierarchiák 109
Parscr 105, 87, 19
1
1
Tárgymutató 413
PMlkonAblak 154
I)MVezérlőGyár 87
PMWidgetFactory 87
1)M\Xlindow 154
}JNfWin.dowImp 161
Point 161
l)olicy 317
polimo. fizmus 14, 349
PülygonSllape l/l
Pont 161
portfol+ó 176
postf.x 253
POSTORDER 66
}JREORDER 66
Presentation Manaber 48, S2 t 86, 161
l)review 233
PricingVisitor 343
primitív 35
pr..mitívek 65
P int 227, 270
PintDialog 227
PrintEmployees 270
]JrinlNEmployees 274
privát 149
privát alrendszeri osztályok 190
privát fejléc-állomány 157
privát öröklés 18
p obléma 3
proceduráIi 240
process 195
Procest,ltem 273
l)rogramCsomópont 187, 192
program-csomópont 92
)rogramCsomópontÉpítő 187, 191
prograrnkörnyezet26
ProgrammingEnvironn1ent 194
IJrogramNodc 187, 192, 193
ProgramNodeBuilder 105, 87, 191
}JrogramNodeEnumcrator 316
prograrnozásikörnyezet 187,194
programozási nyelv alapelemei 191
rotected 267
Plotokoll 286
!)rotot'pus 9,19,90,116,117,119,127,
135) 136,352
prototípllS klónozása 90
Prototípus minta 96, 119
prototípuskészílés 356
prototípus-l(ezelő 120, 121
prototípusobjektum 36
prot()Lípuok k ónozása 120
protot"pusokra épülő nyelvek 121
lJrototype 9
Proxy 9, 210, 213
pt,zeudol{ód 17
Pub isll-Subscribe 296
pulI ffic)ci.el 301
push model 301
PutInt 185
QOCA 261,295
QOCA kötésfeloldó elemkészlel 145,
295
queue 276
.
Ragaszlé) 358
RdjzAJkalmazás 106, 327
RajzDokumentum ] 06, 327
raj70hjektum 09, 111
Rajzol 166, 199 J 2 , 218
rajz()lási lJejárás 202
rajzolási l{érelmek 179
rajzolÓIJ[ogran1 165, 327
RajzolT3.ftalom 160
RajzolTégla 161
rajzszerkesztő 141
RangeValidal()f 326
RApp 326
Read 111
ReadSlream 276
14 Programtervezési mintak
RealSubject 213
ea Subject metódu 219
Recejver 241, 245
Rectangle 39, 166
Refacloring to generalze 328
refakto +izáció 356
égi felület 222
Register 132
RegisterAllocator 325
RegisterTr .nsfer 75
Reg'_sterTransferSet 176
cgiszte 175
regiszterfog lási módszer 77
regiszterfoglalás. sémál{ 325
regular expressions 2/8
RegularExpression 249
rejlett fogadá 227
rekurzié) ] 40
rekurzv aggregátumok 268
re (urzív ereszkedő 252
rekl1rzív leorn )ozíc'ó 36, 165
REMatc 1ingV'sitor 315
Rcmove 39,169, 70,171, 74,176
rendezett aggregátumok 267
. endsze rétegezettsége 299
rendszerfüggő ablakok 54
rendszerfllggő jellemzők egységbe
zárása 158
rendszerfüggő megva]ósítás 155
rend.szerfüggő obe {turnak 163
rendszer uggő osztályok elrejtése 196
rend7erösszeomlás 240
endszerparamé er 136
Repd. 323
Re airFault 196
repeat 253, 254
RepeatI:xpression 345
repetition 254
RepetitionExpress'on 249, 254
Replace 257
Request 232
ResetFocus 331
Responder 236
rész-egét,z v.szony 166
rész---egész viszonyok 165
részegységek 172
Résztvevő ;r 7
rétegezés 26, 157
rétegezettség 350
ReverseListlterator 270
Reversible 62
Rich Text Fo ma 96
RI SCCodeGenerator 193
RISCKód.Előállító 193
RISCsc11eduler 325
Robson 126
robusztus 267
ro .7on algoritmusok 320
rokon nták 10
rokon műveletek 334,335,338
rokon objektumok 222
romantikus regény 2
Room 82
RoomNo 81Í
RoomWitlABomb 93,124
Router 326
Row 199, 201, 204
rögz'tett számú e em 153
RTF 96
RTF elem 96
RTF-á aldkító 105
RTFO vasó 96
RTFReader96
RTF-vezérlőszó 96
RTL 175
RTLExpression 175
rugalmas minták 12
11Jgalmasság 3, 12, 221
Rum11augll156
sablon 23, 70
Sab .onfügbtyény 9, 116, 225 t 301, 327,
329,352
Sdbion :Üggvény tervezés minta 328
Tárgymutato 415
sablonfüggvénjrek 328
sablonok 113 t 321 J 359
sa.blon_ostály 321
sablonpa.f3.métere]( 321
SajátOs7tály 246
SJ\'e 122, 2 9
Scanner 187 191
i
scer1e 34.7
ScrolllllrLayout 2{)9
Scroll])ecorator 178, 179 184
Scroller 46_ 237
T
Scr()111() 179
sebesség 65
sekély másolat 121
Self 4,21, 121,311
sémarcjgzítő rendszer 165
Sequen.ceallleCollection 257
SequcnccExpressiol1 249, ZSt], 315
Service Configurator 105
Session 35
Set 63, 276
S6táló 358
SetConlenls 184
Scttocus 331
SetMemenlo 293
SetSide 94
Sell'4ext 283
SGML dokumentlJffi 99
SGMLOlvasó 99
SGMLReacier 99
Shape 111,148
S110wDialog 280
s11rinkability 322
S m_pleChangeManagcr 30,2
SimpleComm.and 245
SimpleCompositor 318, 324
Single Static Assignmenl 175
singlcdi1)3.tcI1 341
Singleton 9, ZR, 130, 358
SkipList 263, 271
SJcipListlterator 271
Skip1'o 267
Smalltalk 4., 18, 24, 25, 90 94., 112, 120,
121 125, 129, 131t 147, 191, 216
219,226,233,253, 26l, 266, 276
303, 306, 311345, 360
Sl11alltall{ 80 135
Smalltalk Model/View/Co 1troller 175
SlTI.alltalk/V 257, 282, 286
Smalltall<lV for Windows 282
Smllltalk-80 4 105, 175, 257, :$4.6
Smalltalk-80 Model/View/Cc)nlroller
116
sole szabályból álló nyelvta.n 252
s()k-s()k kapcsolatol{ 281
sol{szög 35
Soksz()gAlakzat 11
SoleInstan.ce 31
SolilairL 358
Salve 293
SolverState 288
sor 35, 199, 276
s()rbejáró 276
sormutató 262r 266
soros elérésű gyűjternény 276
Soro7atKifejezés 219
sorszá.ffiozás 39
s()rtáv()lság 109
sortörés 4.0, 317
sorzár{) karakterek 76
SPECTaJl< 261
SpellingCllccl{.ingVisitor 75
SpreadSJleetJ\.PIJJicalic)n 327
SprcadSlleetDocUll1ent 327
SQL 1]6
SQLIJarscr 116
SSA 1 75
StackMacllin.eCodeGen.erator 193
StandardMazeBuil<.lcr 102
State 9 226,307
Staten1enlNocle 192
StateVar'able 145
slatikllS llozzirendclés 175
stati (US l{apcsolatok 348
16 ProgramtelVezési minták
stati!cus nyclve]{ 121
statikus objektum 133
stat".kus osztályösszetétel139
statikus öröklés 158, 180
slatikus példány 133
statikus ta.gfüggvény 129 t 131
statj}<us tfpusokkal dolgozó nye v 147
statikus típusokra épüJő nyelvek 170
statikus váltc)zó 273
statikus védelem 291
stílus 209
stí .us' nformáció 209
stílustáblázat 209
stc)ra.gc 195
Stratégia 6, 9, 12, 18 J 22, 181, 186t 226,
317 1 3-9,332,348
stratégia alapú n1egközelítés 182
Stratégia tervezés. n1inta 1i3, 318
stratégiá]{ 317
Strategy 6, 9t 226, 317, 321
StrealTI 185 1 276
Stream.Decorator 186
stretcllal)ility 322
String 256, 276
StringRcp 156
Stroustrup 163
strukturált grafikus objektumok 151
Stylcs 1 75
Subject 213, 282, 297, 298,303,306
succcssor 228
súgó 227
súgól{érelem 233
SúgóKezelő 228, 229
súgórendszer 226
súgószöveg 226
súg()témakc)f 233
Sun dbx 127
SunDbxAdaptor 127
SunView 95
SunWindowl)ort 16..3
Surrogate 2J O
SwapsManager 325
switch 309
Symantec TCL 236
SZJbályos kifejezések 248, 345
szabályos kifejezésre illestő prohram
253
SzabályosKifejczLs 249
Szabályozott llolzáférLs 1.29
SzalJványLabir" ntusÉpítő 102
szahványos gyűjteményos7tályok 276
szabványos Smalltalk 152
s7akértő 1.
sza.kkifejezések 8
s7ámbeviteli lnezé5k 326
szám"'té)gép 172
számítógépház 172
számÍlómotor 325
számológép 65
Számoló r ab '.rintllsÉpítő 104
származtatott osztály bővÍtése 331
szavak megszá.1nláJása 70
s2cgéJy 43 - 77, 180
SzegélyDíS7:ítő 78
szegélyrajzoló stratégia 81, 182
szegélyslílusok 181
szelektorol< 152
széles fell: let 289, 291
szélesség 149, 211
sLélességi bejárás 268
s7eJTIcsézettség 12
szemétgyűjtés 203
szemétgyűjtés nélkül" nyelvek 172
szempont 301
SLerezAblakMegvalósítás 163
SzerezAIl<ön)"Vtára]{ 145
SzerezA1osztályok 1:15
SzerezGyermek 176
SzerezKijelölés 283
SzerezKiterjedés 112, 2. 1, 21H
Szere Labirintus 101
SzerezÖssLetétel171
SzerczlIpus 232
Szerkezet 7
Tárgymutató 41
szerkezeti minták 10, 139, 221
szerkezetj olJjektumminták 11, 139
szerkezeti osztályminták 1, 139
szétválas7tás ] 57
szignatúra 14
szín 199
s7íl1es kijelző 135
S.línlnegjeleníl{5 képessége]{ 164
S7011aBomlláva193
sLoftver élete 357
s70ftvermjnták 358, 360
s2oftvcr-mintanyelv 360
S7()ft verreJlctszerek építése 359
Szokv3,nyos kéreilnek 299
szokványos memóriafoglalás 325
szolgáltatások metszete 53
szolgáltatások uni()ja 53
s7oros csatolás 26, 190 267 296, 297,
299
Szöveg 165, 166
szöveg beilles7lése 238
Sz(}vegAlak7at 14.1
SzövegÁtalal(ító 96
szövLgd.okumenlum 219
szöveg-elrendező algoritmusok 198
szöveges ábra nyújtása 109
szövegfolyamok sorokra tördelése 317
szövegformátum 96
Sz()vegMódostó 142
SzövegNéLct 178
s7()vegnéző 185
s7övegszerl{esztés 151
szövegszerkesztő 33t 196 t 203 210
SzövegVezérlőAtalakító 97
szűrési feltételek 263
Szűr{SListaBejáró 263, 274
szül(séges objektumok 12
szülőcsoméJpontok 253
szi..ilőllivatkoLás 169, 231
szülő11ivatkozáso]< 233
szü]ől( táro13sa 169
s7ülőtnutató 202
szülőművelel 330
7il1őosztály 16, 330
szünetjel 117
lál-J avezér ésű elemző 252
táblázat 35, 152, 296
tá11Jázat alapú á.llapotautomaták 3
táblázatban való keresés 3 O
táblázalke£elő 327
TáblázatKeLelőAlkalmazás 327
TáblázalKe7előDol{umcntuln 327
táblázatok 196, 310
tál)lá7atos keresés 326
lálllá7atos l11egjelenítés 152
Tal11eAdaplor 152
tagelérő ol(-""velet 214
tagelérő műv'elet túlterhelése 215
tagfüggvényt címLő mula ló 21.5
talzarítás 267
tapasztalltervező 1
tárJleIy 318
tárllcly-megtakarítás 202
tárigény 65
tárigény csökkentése ] 69
tárköltség 199, 202
tá olás 195
tárol{) 166
tá .oló objektumc)k 165
tárolótípusok 276
táraIt képkitcrjeciés 2 - 9
tárult kilerjed.és 211
lársftásos tár 202
tá.rsításos tárolé) . 2 .
lársolJjeJ<tumok 196, 225
tartomá.ny 195
tarlományellenőrző 326
Ta sk 24.7
táv()li gép 222
távolt ]1elyettes 212 213, 214
18 Programtervezési minták
távoli objclctumok 220
távol" objektulnra mutató llivatkozás
116
távolság 2R8
TClJ kaJ1csolat 308
CI) k3-pcsolat C++ 312
TC"'P kapcsoJati prc)to (011 315
TClJ J1roto1<011 3] 2
TCJ) Álla.pol 307
TCIJClosed 307,3- 3, 311
TC]JConncction. 307, 312
TCI)Esla11I isllCd 307, 314
TCIJKapcsolal j07
TCPKapcsolód.va 3(}7
TCIJ] ezárva 307
'CPListeo. 314
TCIJState 307 31 2
égla.la p 166
téglalapok 287
téglala.prajLcJ]ó l11űve]et 57
teljes alrendszer 140
leljesítmény 1 2
teljcsílllléJ1yfoko7ási. minták 356
,
lemplate 23 321
Te 11plate Metilou. 9, 225
tényleges a.lany 213
tényleges a]an)T típus 216
TényjegesAlany 213) 216
térl1eli gra.fil<us allcalmazás 317
térl13tás 209
térköz 76
termék 49 98) 108
terméJe összeállítása 99
termékcsalád 51, 89
tcrmékel{ lélre110zása 90
terD1ékobjektum 13t>
terlnél<osztályc)k 49
TermlI1.alExpression 25
terminá]is csomópontok 253
l erol.inálisK ifej ezés 251
te +l11inálszimbólum 248, 251
lermin.álszimlJólumc)k megoszlása 253
tervezési (i-öntések 361
tervezési minta 2
tervezési lnintá]{ közössége 358
tervezési rninták re11dszcre7ése 353
tervezési mócJs7er 355
tervezési szó (incs 354
terve7ésl tapasztalat 2
tervezési újra11asznosítás 28
tervczésmódsLertan.1. gyűjtemény 360
Tc')tIletn 275
testrcs7allás 88
tcstresza.bott eJemzőprogral11 116
TeX 42, 31R
TeX f()rmátllill 97
11eXÁtallkító 97
TCXCOD1positor 318, 321
I-reXConverter 97
TeXÖss7eállító 318
11ext 165, 166
TexrConvertcr 96
TextT)oculnent 219
Tc.xtlvIdnipu .310f 142
TexlI)ln.e 285
'extSllape ]41,119,151
TexlView 1:11,14:8,178, 1 84
l-1 ext WidgetConvcrter 97
T11e Smalltalk Report 360
llleirProduct 111
TllingLab 126
I lINK 285
THINK osztá.lykön-yvtár 217, 306
III is 21, 170
Ticl{ 301
timer 306
Tirnes Rc)man 206
tilnes12 206
tjpográfiai információk 202
típus 14, 17 171
lípusL1iztonság 351
t1)usl1íztos átalakítás 72
'TIpusEllenőriz 334
típusellenőrzés 73, 252, 3;J
tílll1sellenőrző 333
Tí pusEllené5rzőLátogató 331
Tárgymutató 4 9
típusinfornláció 121, 170
típuskényszerítés 1 70
típusrends z er 168
tiszta felületörc)klé') 18
tis7tán virtuális tagfüggvény 100
token. 96, 191
tokenfolyam 191
toló tl1od.elJ 301
Tool. - 7,315
toolkit ZR
tov3.lJbítás 68
továbbítási lánc 237
továbbító függvény 232
továhl)ílÓ művelet 231
több ablakkezel{5 rendSLer 52
tc)bb adatforrás 300
több keretrendsLcr 195
több kilépési pont 267
több példány 128
több részbő1 álló feltételes utas/tások
308
többágú feltételes utasítások 318
töbllalakú bejárás 263, 264, 27- , 276
tö1Jbalal{ú bejárák 276
többalakú művelet 349
többalakúság 11, 19, 130, 267,349,355
tcjbbsLakaszos alal<zat 57
többszintű visszavonás 63 243
l()bbszöri frissítés 286, 302
többs7ÖrC)S öröklés 17 39, 43, 146,
147, 149 158, 3()3
többszörös öröl{lést nem tartalmazó
progral1111yelvek 303
tömb 12
TömbBejáró 6H
tömbök 68r 172
TömbÖss7eállító 318
tömörített bináris adatok 186
tÖlll.örJtő algoritmus 185
TörölI)ar3ncs 243
törölt a]lny()k 300
törzs 158
tragikusan Lsendő h.ős 2
Transaction 237
1ransientWi .1dow 160, 161
tran.sparent enclosurc 44
tranzalcció 237, 24.0
Tra\'ersable 2/1
Traversal 66
fraverse 193
TreeAccessorDelegale 147
TreeDisplay 45, 116
t11Je 257
true-false 62
tud.ás llapú sLoft\Terfejlesztés 360
tulajdonság 301
túlterhelés 211, 215
tlllterl1elt -> és * művelelek 215
TypeClle(k 334
Ty.peCh.eckjngVisitor 334
"
,
Ugráslele 267
UgróLista 263, 27]
UgróIjslaBejáró 271
új felület 222
új hivatkozások 231
új mtíveletek 334
új lermékfajták 89
újbóli végrehajtás 62, 213
lJjGrafika 136
újraépítés 356
újraépítés az általánosítás érd.ekél)en
328
újrafordítá.s 90) 334
újrallaSZnc}sítás 356
újral1asznostható prc)graInok 356
újrallasznosítllatóság 3 350
újratervezés 25
UnboundcdCollectjon 326
Undo 24:3
Unexecule 62 240, 243, 24-6, 292
Uni draw 111 6,127, - 45, 236 t 247,
276, 286 294, 306, 3 1 5
4 O Programtervezési minták
Uns11aredConc eteFlyweig11l201
Update 300,301, 303
űrlapos program 360
using 24
DSL StandardC()mponents 267
UtasításCsom()pont ] 92
utasításkészlet-litemező irán.yclvek 325
utoljára végrell£ljtott parancs 243
utólagos növelő művelet 276
Ügyfél 89, 119, 144, 168,201,230,241,
251,317
ügyfelalrendszer csalalás
csökkentése 190
ügyfelek áJta igényelt felület 111
ügyfélkérclmel{ 189
ügyfélpr()gram 168
ügyintéző 236
üres ruggvény 100
üres llalmaz bejárása - 73
üres környe7etű értelmező 261
iiresllely 76
iirc11elyek 324
üzenetl1 J 216, 219
üzenetküldő séJnák 351
üzenetparanléterck 349
llzenetszórás 299
vált()zó11ivatkozások 334
VáltozóHivCsomópont 311
változók 333
vállozópéld.ány 16
Változ atÁllapot 313
value 152
va ue: 152
ValueModel152
VanSúgó 233
várat an frissítés 299
VariableExp 257
Var'ableRefNod.e 341
védelmi llelyettes 212, 213, 220
védett műveletek 267
véd.ett tagok 331
véges állapotú allton1ata 254
végpont 109
Végrehajt 238, 240, 241, 292
végrehajtó objel{tum 228
vcletJen péld.ányosítás 133
verem 153 t 272
VeremGépKódElőállftó 193
vevő 350
vezérlés 225
ve7érléselemz6 333
veLérlési folyamat 225 J 351
vezérlési szer {ezetek 266
Vezér]ő 4, 5, 18, 86, 209, 278
Ve7érlőGyár 87
vezérlők kÖzölt. ]{özvelítő 285
Ve7érlőMegváltozott 280, 283, 285
View 4, 6, . 60, 175, 182, 306, 3.31
Viewer 316
VjewManager 285
virtuális cím 195
virtuális függvény 112, 312
v".rtuális gép 216
virtuális llclyettes 212, 213,214,216,
220
virtuális konstruktor 106
virtuáli'-) memória ]<eretrendszer 95
viselkeciés 225, 355
viselkedés elosztása 277
vágólap 238
Válas71:á.nc 226
válaszoló 236
Válas7tásK'fejezés 2/9, 250
valé)d" világ 12
valós' dejű programozás 2
VáltozásKezel6 286, 302
változá.snapló 240
vá.ltozásol( fokozatos tárolása 292
válrozatol< egységlJe zárása 348
változó elemek egységbe zárása 348
válto7ó méretű obje <turnak 163
váltoLó s7ámú példány 129
változó ténye7ő 55
Tárgymutató 421
viselkedések megkülönböztetése 32
visell{edések ()bjektumba zárása 226
viselkedési minták lOt 225, 348, 352
viselkedési objektumm + nták ll, 225
viselkedésj osztályminták 1 ], 225
viselkedésn1ódok 120
viselkedésol1Jektumo { 182
Visit 336, 339, 343
visitAlternation: 315
VisitAssignment 331
Vis tCharacter 75
VisitConcreleElement 339
visit iteral: 345
Visitor 4, 10, 75, 226 336, 339, 347,
358
visitRepeat: 345
VisitVarial1 eRe -'erence 334
VisllalComponent 175, 179, 183
visszafelé l1aladó bejáró 270
vissza]1Jvható fügb'Yény 240
visszatérési érté.( 14
Viss7avon 240, 213, 246, 292
visszavonás 59, 62, 243, 288
visszavonási állapot 21.6
VObjects 1 / 5
vonal 35, 136 J 165, 66
vonal nyújtása 109
VonalA]akzat 141
VonaJGyár 136
y
Walker 358
Wa 1 82
Wall* 125
widget 48,86,234, 282t 304
WidgelC11anged 280, 283, 285
WidgetFactory 87
WidgetKit 95, 135
WidgelKit: :InstanccO 135
Window 39, 154, 159, 184
Window alaposztáJy kOnSlnIklora 58
Windowimp 55, 154, 159
WindowPort 163
Windows 52
Wind.c)wSystem 95, 163
Wind.owSystemFactory 57
WindowSystemFa.ctory: :Insta .1ccO 163
Winclow-Windowlmp 159
Wirfs-Brock 332
Wrapper141,177,358
wrvSIWl 7 G 33
X52
X Windc)w 56t 95, 161
X Window System 1 54
XAl) lak 15 ti
XAblakMegvalós"'lás 1 54
XlconWindow 54
xlkonAbJak 154
X\V"indow 154
XW+nclowlmp 56, 151, 161
XWindowPort 163
Yie dCurve 325
YourProduct 111
YourType 339
záradékok 266, 272
zárak 325
záro ás 212
zenei objektum 117
zeneszerkesztés 28
Zoomer 237
7weig 315
zsugorítllatóság 322
"
E kötetben az objektumközpontú S oftvertervezésben sze ett ha-
ta]mas tapasztalataikkal felvértezve négy elismert tervező mutatja
be egyszerű, de nagyszerű megoldásait a általánosan felbukka-
nó tervezési probiémakra. A korábban még 1e nem Irt 23 tervezé-
si minta lehetőve tes i, hogy a tervezők rugalmasabb, elegánsabb
- és ami a legfontosabb -, újrahasznosítható programterveket ké-
szíthessenek, anélkül, hogyamegoldasokat maguknak kellene
felfedezniükR
" .
rogramtervezes
minták
Ujrahasznosíthat6 elemek
obektum ...ÓZ ontú programokhoz
--- --- ..... .....
. . ..... .
'<...
....
o >
':
. <
.'
.
. .
. .
\ \
. .
) 1
A szerzők először bemutatják a létező mintákat, illetve hogy ezek
mikent segítenek bennünket az objektumkö pon ú programok fej
les tésében, majd rendszere ve neve adnak az objektumkö pon-
tú rendszerekben vissza-visszatérő mintáknak, elmagyarázzák és
értékelik a okat. A Programterve ési minták segitségével megta-
nuljuk hogyan illes kednek ezek a minták a szoftverfej[esztés fo-
lyamatába, és hogyan oldhatók meg velük a leghatékonyabban
saját egyéni tervezési gondjaink.
. "1'. .... J'.
...;. .,.
L
--...-
," ....( _:J'. ,. ...10 .r-
, ,
. .,
". . ...;f
. .
.,
I .
. ..'
, .
, ".'"
Minden mintánálleírják, milyen körülmények között alkalmazható, milyen más tervezési megköté-
seket kell figyelembe venni/ illetve hogy az adott minta nagyobb terv részeként vala felhasználásá-
nál milyen követke ményekkel és mellékhatásokkal kell számolnunk. Minden minta létező rendsze-
ren, a valos életből vett peldakon alapul. Mindegyikhez tartozik kód is, amely bemutatja, hogyan va-
losítható meg a minta az olyan obJektumközpontu nyelveken, mint a C+ + vagy a Smalltalk.
:---. --= "« ... « .
«= . ::.:: -:;-. ..
:::-.' .
. .X ':.:.--: -..:c- :-::; .
..:- ::;- :::; '(:;: -::.... .:.": '-h ..
A szerzők nemzetközileg elismert s akemberek az objektum központú programozas területén
Dr r.c 1 G mma a svájci Zürichben az Object Techology International szoftvertechnológiai köz-
pontjának technikai igazgatója. r. Richar Heim az ausztraliai Sydneyben dolgozik/ mint az IBM
Consulting Group Object Technology Practice Group csoportjának tagja. Dr.. Iph ohnson az
iHionoisi egyetemen ok att a szamítógép-tudományok tanszék en. Dr. John VIi ss id s az IBM
Thomas J Watson kutatóközpontjaban oly tat ja kutatásait a New York állambeli Hawthorne-ban.
-.¥-
'U
... Addison Wesley
Kategóf-. programozás, elmélet
elhasznalói 5 int: haladó
ISBN: 963 9301 77 9
ISBN sz m: 963 9301 77 9
,
A : 5980 Ft
9 789639 301771