Текст
                    .


.


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