U E D R , A S I H C RSS

Gof/Mediator


1. Mediator


1.1. Intent


MediatorPattern€ ฒด๋“ค˜ –ด๋А ‘•ฉ๋“คด interaction•˜๋Š” ๋ฐฉ๋ฒ•„ encapsulate•˜๋Š” ฒด๋ฅผ  •˜•œ‹ค. Mediator๋Š” ฒด๋“ค„ „œ๋กœ—ฒŒ ๋ช…‹œ œผ๋กœ กฐšŒ•˜๋Š” ฒƒ„ ๋ง‰Œœผ๋กœ„œ loose coupling„ ด‰„•˜๋ฉฐ, ธ๋ž˜„œ Mediator๋Š” —ฌ๋Ÿฌ๋ถ„—ฒŒ ฒด๋“ค˜ interactions๋“คด ๋…๋ฆฝ œผ๋กœ‹–‘•˜ฒŒ •ค€๋‹ค.

1.2. Motivation


Object-Oriented ๋””ž€ ฒด๋“ค ‚ฌ˜ –‰œ„ ๋ถ„‚ฐ„ žฅ๋ •œ‹ค. ธ๋Ÿฐ ๋ถ„‚ฐ€ ฒด๋“ค ‚ฌ— ๋งŽ€ —ฐด€„ ง€๋‹Œ ฒด ตฌกฐ๋กœ ๋‚˜ƒ€๋‚  ˆ˜ žˆ๋‹ค. œ•…˜ ฒฝšฐ—๋Š” ๋ชจ๋“  ฒดฐ€ ฒฐตญ ๋ชจ๋“ ‹ค๋ฅธ ฒด๋“ค„ •ŒฒŒ ๋œ‹ค.

๋น„๋ก •˜๋‚˜˜ ‹œŠค…œ— ๋งŽ€ ฒด๋“คฐธ—ฌ•˜๋Š” ฒƒผ๋ฐ˜ œผ๋กœ žฌ‚ฌšฉ„„ •™”• ง€๋ผ๋„ interconnectionsด ๋Š˜–ด๋‚˜๋Š” ฒƒ€ žฌ‚ฌšฉ„„ ฐ†Œ‹œ‚ค๋ ค๋Š” ฒฝ–ฅžˆ๋‹ค. ๋„ˆ๋ฌด๋‚˜ ๋งŽ€ ฒด„˜ ƒ˜—ฐฒฐ๋“ค€ ฒด๋“ค˜ ๋…๋ฆฝ„„ ๋–จ–ด๋œจ๋ฆด ˆ˜ žˆ๋‹ค. - ธ๋Ÿฐ ‹œŠค…œ€ ๋งˆ˜ ™„ „žˆ †ตผ๋œ ฒƒ ฐ™–‰๋™•œ‹ค.

ฒŒ๋‹ฐ€ •˜๋‚˜˜ ‹œŠค…œ— ๋งŽ€ ฒด๋“คฐธ—ฌ•˜๋Š” ฒƒ€ –ด๋–ค ˜๋ฏธžˆ๋Š” ๋ฐฉ๋ฒ•œผ๋กœ ‹œŠค…œ˜ –‰œ„๋ฅผ ๋ฐ”พธ๋Š” ฒƒ„ –ด๋ ฒŒ •œ‹ค. ™œ๋ƒ•˜๋ฉด, –‰œ„๋Š” ๋งŽ€ ฒด๋“ค ‚ฌด๋กœ ๋ถ„‚ฐ๋˜–ด กŒธฐ ๋•Œ๋ฌธด๋‹ค. ฒฐ๋ก  œผ๋กœ‹‹ € •„๋งˆ ธ๋Ÿฐ ‹œŠค…œ˜ –‰œ„๋ฅผ customize•˜ธฐ œ„•„œ ˆ˜๋งŽ€ subclass๋“ค„  •˜•••  ฒƒด๋‹ค.

˜ˆ๋กœจ –ด๋–ค GUIƒ—„œ‹–ผ๋กœธ ๋ฐ•Šค˜ ตฌ˜„„   •ด๋ณดž. •˜๋‚˜˜‹–ผ๋กœธ ๋ฐ•Šค๋Š” ž‘€ ๋„ตฌ๋“ค(๋ฒ„Šผ, ๋ฉ”๋‰ด, ž…๋ •„๋“œ)˜ ๋ชจŒ„ ‘œ˜„•˜๋Š” •˜๋‚˜˜ œˆ๋„šฐ๋ฅผ ‚ฌšฉ•œ‹ค.


๋Œ€ฒŒ ๋‹–ผ๋กœ˜ ๋„ตฌ๋“ค ‚ฌ—๋Š” –ด๋–ค dependency๋“คกดžฌ•œ‹ค. ˜ˆ๋ฅผ ๋“ค๋ฉด, –ด๋–ค ๋ฒ„Šผ€ –ด๋–ค ž…๋ •„๋“œฐ€ ๋น„–ดžˆ„•Œ๋Š” ๋น„™œ„™” ๋˜–ดžˆ๋Š”๋‹ค. list box๋ผ ๋ถˆ๋ฆฌ๋Š” „ ƒ ๋ชฉ๋ก—„œ ฒด๋ฅผ „ ƒ•˜๋Š” ฒƒ€ ž…๋ •„๋“œ˜ ๋‚ดšฉ„ ๋ฐ”ฟ€ ฒƒด๋‹ค. ๋ฐ”ฟ”๋ง•˜๋ฉด, ž…๋ •„๋“œ— ๋ฌธž๋ฅผ ƒ€•‘•˜๋Š” ฒƒ€ ž๋™ œผ๋กœ ๋ฆฌŠคŠธ ๋ฐ•Šค—„œ •˜๋‚˜ƒ˜ ๋Œ€‘๋Œ€๋Š” ž…๋ „ „ ƒ•˜๋Š” ฒƒด๋‹ค. •œ๋ฒˆ …ŠคŠธฐ€ ž…๋ •„๋“œ— ๋‚˜ƒ€๋‚˜๋ฉด, ๋‹ค๋ฅธ ๋ฒ„Šผ๋“ค€ •„๋งˆ ™œ„™” ๋ ฒƒด๋‹ค. ธ๋ž˜„œ ‚ฌšฉžฐ€ …ŠคŠธ๋กœ –ด๋–ค „ •˜ฒŒ •˜ฒŒ•  ฒƒด๋‹ค. ˜ˆ๋ฅผ ๋“คž๋ฉด, ด€๋ žˆ๋Š” ฒƒ„ ‚ญ œ•˜ฑฐ๋‚˜ ๋ณ€ฒฝ•˜ฑฐ๋‚˜ •˜๋Š” ๋”ฐœ„˜ „ •  ˆ˜ žˆ„ ฒƒด๋‹ค.

‹ค๋ฅธ ๋‹–ผ๋กœธ ๋ฐ•Šค๋“ค€ ๋„ตฌ๋“ค ‚ฌ—„œ‹ค๋ฅธ dependency๋“ค„ ง€๋‹ ฒƒด๋‹ค. ธ๋ž˜„œ ‹ง€–ด ๋‹–ผ๋กœธ๋“คด ๋˜‘ฐ™€ ข…๋ฅ˜˜ ๋„ตฌ๋“ค„ ง€๋‹Œ๋‹•˜๋”๋ผ๋„, ๋‹ˆœžˆ  „˜ ๋„ตฌ ด๋ž˜Šค๋“ค„ žฌ‚ฌšฉ •  ˆ˜๋Š” —†๋‹ค. dialog-specific dependency๋“ค„ ๋ฐ˜˜•˜ธฐ œ„•„œ customize๋˜–ด ••œ‹ค. subclassing— ˜•„œ œ๋ณ„ œผ๋กœ ๋„ตฌ๋“ค„ Customize•˜๋Š” ฒƒ€ ง€๋ฃจ•  ฒƒด๋‹ค. ™œ๋ƒ•˜๋ฉด ๋งŽ€ ด๋ž˜Šค๋“คธ๋ ‡ฒŒ ๋˜–ด••˜ธฐ ๋•Œ๋ฌธด๋‹ค.

๋ณ„œ˜ mediator ฒด—„œ ‘‹˜ –‰œ„๋กœ encapsulate•˜๋Š” ฒƒ— ˜•„œ ด๋Ÿฐ ๋ฌธ œ๋ฅผ ”ผ•  ˆ˜ žˆ๋‹ค. •˜๋‚˜˜ mediator๋Š” ฒด๋“ค ธ๋ฃน ๋‚ด˜ ƒ˜ž‘šฉ๋“ค„  œ–ด•˜  กฐ ••  ฑ…ž„žˆ๋‹ค. ธ mediator๋Š” ธ๋ฃน๋‚ด˜ ฒด๋“คด ๋‹ค๋ฅธ ฒด๋“คณผ ๋ช…‹œ œผ๋กœ กฐšŒ•˜๋Š” ฒƒ„ ๋ง‰๋Š” ‘„ž๋กœ„œ˜ —ญ• „ •œ‹ค. ธ๋Ÿฐ ฒด๋“ค€ ๋‹ง€ mediator๋งŒ •Œ  žˆ ,  ๋กœ interconnection˜ ˆ˜๋Š” „–ด ๋“คฒŒ ๋œ‹ค.

˜ˆ๋ฅผ ๋“ค๋ฉด, FontDialogDirector๋Š” ๋‹–ผ๋กœธ ๋ฐ•Šค˜ ๋„ตฌ๋“ค ‚ฌ˜ mediatorˆ˜ žˆ๋‹ค. FontDialogDirectorฒด๋Š” ๋‹–ผ๋กœธ ๋„ตฌ๋“ค„ •Œ  ธ๋“ค˜ interaction„ กฐ ••œ‹ค. ฒƒ€ ๋„ตฌ๋“ค ‚ฌ˜ communication—„œ hub™€ ฐ™€ —ญ• „ •œ‹ค.


‹Œ interaction diagram€ ฒด๋“คด ๋ฆฌŠคŠธ๋ฐ•Šค˜ „ ƒ—„œ ๋ณ€™”๋ฅผ ๋‹ค๋ฃจธฐ œ„•˜‘๋™•˜๋Š” ๋ฐฉ๋ฒ•„ ๋ฌ˜‚ฌ•˜  žˆ๋‹ค.


Here's the succession of events by which a list box's selection passes to an entry field.
—ฌธฐ„œ๋Š” list box—„œ˜ „ ƒด entry field ๋กœ  „‹ฌ๋˜  žˆ๋Š” ด๋ฒคŠธ๋“ค˜ ๋ฆ„žˆ๋‹ค.
  1. ๋ฆฌŠคŠธ ๋ฐ•Šคฐ€ ฒƒ˜ director—ฒŒ ฒƒด ๋ณ€–ˆ๋‹  ๋ง•œ‹ค.
  2. director๋Š” ๋ฆฌŠคŠธ ๋ฐ•Šค๋กœ ๋ถ€„„ ƒ„ –ป๋Š”๋‹ค.
  3. director๋Š” ž…๋ •„๋“œ๋กœ „ ƒ„„˜ธด๋‹ค.
  4.  œ ž…๋ •„๋“œ๋Š” –ด๋–ค ๋ฌธž๋ฅผ ฌ••œ‹ค. director๋Š” –‰๋™(ธ€”จ๋ฅผ ตตฒŒ •˜ฑฐ๋‚˜ ธฐšธฒŒ •˜๋Š” ๋”ฐœ„˜ –‰๋™)˜ ดˆธฐ™”๋ฅผ œ„•ด ๋ฒ„Šผ„ ™œ„™” •œ‹ค.

directorฐ€ ๋ฆฌŠคŠธ ๋ฐ•Šค™€ ž…๋ •„๋“œ ‚ฌ˜ กฐ ••˜๋Š” ๋ฐฉ๋ฒ•„ 𔕕˜ž. ๋„ตฌ๋“ค€ „œ๋กœ‹ง€ „ ‘ œผ๋กœ director„ †ต•„œ †ต‹ •œ‹ค. ธ๋“ค€ „œ๋กœ— ๋Œ€•„œ ๋ชฐ๋••˜๋ฉฐ, ธ๋“ค ๋ชจ๋‘๋Š” director๋ฅผ •Œ•„••œ‹ค. ฒŒ๋‹ฐ€ –‰œ„๋Š” •œ ด๋ž˜Šค— ง€—ญ™” ๋˜–ดง€ธฐ ๋•Œ๋ฌธ— –‰œ„๋Š” ด๋ž˜Šค๋ฅผ ™•žฅ•˜ฑฐ๋‚˜ ตฒด•œผ๋กœจ ๋ณ€•˜ฑฐ๋‚˜ ๋ฐ”ฟ”งˆ ˆ˜ žˆ๋‹ค.

FontDialogDirector ถ”ƒ™”ฐ€ ด๋ž˜Šค library๋ฅผ †ต•˜•˜๋Š” ๋ฐฉ๋ฒ•€ ๋‹Œณผ ฐ™๋‹ค.


DialogDirect๋Š” ๋‹–ผ๋กœ˜  „ฒด –‰œ„๋ฅผ  •˜•œ ถ”ƒ ด๋ž˜Šคด๋‹ค. client๋“ค€ ™”๋ฉด— ๋‹–ผ๋กœธ๋ฅผ ๋‚˜ƒ€๋‚ดธฐ œ„•„œ ShowDialog —ฐ‚ฐž๋ฅผ ˜œ•œ‹ค. CreateWidgets๋Š” ๋‹–ผ๋กœธ ๋„ตฌ๋“ค„ ๋งŒ๋“คธฐ œ„•œ ถ”ƒ —ฐ‚ฐžด๋‹ค. WidgetChanged๋Š” ๋˜ ๋‹ค๋ฅธ ถ”ƒ —ฐ‚ฐžด๋ฉฐ, ๋„ตฌ๋“ค€ director—ฒŒ ธ๋“คด ๋ณ€–ˆ๋‹ค๋Š” ฒƒ„ •Œ๋ ฃผธฐ œ„•„œ ด๋ฅผ ˜œ•œ‹ค. DialogDirector subclass๋“ค€ CreateWidgets„   ˆ•œ ๋„ตฌ๋“ค„ ๋งŒ๋“คธฐ œ„•„œ override•˜  ธ๋ฆฌ  ธ๋“ค€ WidgetChanged๋ฅผ ๋ณ€™”๋ฅผ ๋‹ค๋ฃจธฐ œ„•„œ override•œ‹ค.

1.3. Applicability

MediatorPattern€ ด๋Ÿด ๋•Œ ‚ฌšฉ•œ‹ค.
  • –ด๋–ค ฒด๋“ค˜ ‘•ž˜  •˜๋˜—ˆง€๋งŒ, ๋ณตžก•œ ๋ฐฉ๋ฒ•œผ๋กœ †ต‹ • •Œ. interconnection˜ ฒฐณผ๋Š” ตฌกฐ™”๋˜ง€ ๋ชป•˜  •ด๋ฅผ –ด๋ ฒŒ •œ‹ค.
  • –ด๋–ค ฒด๋ฅผ žฌ‚ฌšฉ•˜๋Š” ฒƒฒƒด ๋งŽ€ ๋‹ค๋ฅธ ฒด๋“คณผ ด€๋ žˆ  †ต‹ „ •˜ธฐ ๋•Œ๋ฌธ— –ด๋ šธ ๋•Œ.
  • ๋ช‡๋ช‡˜ ด๋ž˜Šค๋“ค ‚ฌ— ๋ถ„‚ฐ๋˜–ด„ •˜๋‚˜˜ –‰œ„ฐ€ ๋งŽ€ subclassing•˜๋Š” ž‘—… —†ด customize๋˜–ด •• •Œ.

1.4. Structure



 „˜• ฒด ตฌกฐ๋Š” ด๋ ‡ฒŒ ๋ณดฒƒด๋‹ค:


1.5. Participants

  • Mediator(DialogDirector)
    Colleague ฒด๋“คณผ †ต‹ „ œ„•„œ „Ž˜Šค๋ฅผ  •˜•œ‹ค.
  • ConcreteMediator(FontDialogDirector)
    Colleague ฒด๋“ค„ กฐ ••œผ๋กœจ —ฝ•–‰œ„๋ฅผ ตฌ˜„•œ‹ค.
    ž‹ ˜ colleague๋“ค„ •Œ  ด€๋ฆฌ•œ‹ค.
  • Colleague classes(listBox, Entry Field)
    ฐฐ˜ colleague class๋Š” ž‹ ˜ Mediator ฒด๋ฅผ •ˆ๋‹ค.
    ฐฐ€˜ colleague ๋Š” ž‹ ด ๋‹ค๋ฅธ colleague™€ †ต‹ • •Œ๋งˆ๋‹ž‹ ˜ mediator™€ †ต‹ •œ‹ค.

1.6. Collaborations

Colleague๋“ค€ Mediator ฒด—ฒŒ š”ฒญ„ ๋ณด๋‚ด  ๋ฐ›๋Š”๋‹ค. Mediator๋Š”   ˆ•œ colleague—ฒŒ š”ฒญ„ ๋ณด๋ƒ„œผ๋กœจ ˜‘๋™ –‰œ„๋ฅผ ตฌ˜„•œ‹ค.

1.7. Consequences

Mediator Pattern€ ๋‹Œณผ ฐ™€ žฅ ณผ ๋‹ „ ง€๋‹Œ๋‹ค.
  1. MediatorPattern€ subclassing„  œ•œ•œ‹ค. mediator๋Š” ๋‹‹œ๋ง•ด ๋ช‡๋ช‡œ˜ ฒด๋“ค ‚ฌ— ๋ถ„‚ฐ๋˜–ดงˆ –‰œ„๋ฅผ ‘‘•œ‹ค. ด๋Ÿฐ –‰œ„๋ฅผ ๋ฐ”พธ๋Š” ฒƒ€ ๋‹ง€ Mediator๋ฅผ subclassing•˜ธฐ๋งŒ •˜๋ฉด ๋œ‹ค. Colleague ด๋ž˜Šค๋“ค€ žฌ‚ฌšฉ๋˜–ดงˆ ˆ˜ žˆ๋‹ค.
  2. MediatorPattern€ colleague๋“ค„ ๋–ผ–ด๋†“๋Š”๋‹ค. Mediator๋Š” colleague๋“ค ‚ฌ—„œ loose coupling„ ด‰„•œ‹ค. colleagued™€ Mediator๋ฅผ œ๋ณ„ œผ๋กœ‹–‘•˜ฒŒ •  ˆ˜ žˆ , žฌ‚ฌšฉ •  ˆ˜ žˆ๋‹ค.
  3. MediatorPattern€ ฒด protocols„‹ˆœ™” ‹œ‚จ๋‹ค. Mediator๋Š” ๋‹ค๋Œ€๋‹ƒ˜ด€„๋ฅผ Mediator™€ colleague๋“ค ‚ฌ˜ ผ๋Œ€๋‹ด€„๋กœ ๋ฐ”พธ–ด ๋†“๋Š”๋‹ค. ผ๋Œ€๋‹ด€„๋Š” •ด, ด€๋ฆฌ, ™•žฅ•˜๋Š”๋ฐ ๋” ‰ฝ๋‹ค.
  4. MediatorPattern€ ฒดฐ€ ˜‘๋™•˜๋Š” ๋ฐฉ๋ฒ•„ ถ”ƒ™” ‹œ‚จ๋‹ค. Mediation๋ฅผ ๋…๋ฆฝ œ๋…œผ๋กœ ๋งŒ๋“ค  •˜๋‚˜˜ ฒด— บกА™”•˜๋Š” ฒƒ€ —ฌ๋Ÿฌ๋ถ„œผ๋กœ •˜—ฌธˆ ฒด˜ –‰œ„๋Š”  œณ๋‘  ธ interaction— ‘‘•˜ฒŒ •ค€๋‹ค. ด๋Š” ฒดฐ€ ‹œŠค…œ ๋‚ด—„œ –ด๋–ปฒŒ interact•˜๋Š” ๋ฐฉ๋ฒ•„ ๋ช…™•žˆ •˜๋Š”๋ฐ ๋„›€„ ค€๋‹ค.
  5. MediatorPattern€  œ–ด๋ฅผ ‘‘™”•œ‹ค. Mediator๋Š” interaction˜ ๋ณตžก๋„๋ฅผ mediator˜ ๋ณตžก๋„™€ ๋งž๋ฐ”ฟจ๋‹ค. Mediatorฐ€ protocol๋“ค„ encapsulate–ˆธฐ ๋•Œ๋ฌธ— colleagueฒด๋“ค ๋ณด๋‹ค ๋” ๋ณตžก•˜ฒŒ ๋˜–ดงˆ ˆ˜ žˆ๋‹ค. ฒƒด mediator๋ฅผ ด€๋ฆฌฐ€ –ด๋ šด monolith ˜•ƒœ๋ฅผ ๋›ฐฒŒ ๋งŒ๋“ค ˆ˜ žˆ๋‹ค.

1.8. Implementation

‹Œ ตฌ˜„ณผ ด€๋ จ๋œ issue๋“ค€ MediatorPatternณผ ด€๋ žˆ๋‹ค.
  1. ถ”ƒ Mediator ด๋ž˜Šค ƒ๋žต•˜ธฐ. ถ”ƒ Mediator ด๋ž˜Šค๋ฅผ „ –ธ•  •„š”ฐ€ —†๋Š” ฒฝšฐ๋Š” colleague๋“คด ๋‹ง€ •˜๋‚˜˜ mediator™€๋งŒ ž‘—…„ • •Œด๋‹ค. Mediatorด๋ž˜Šคฐ€  œณต•˜๋Š” ถ”ƒ ธ coupling€ colleague๋“คด ๋‹ค๋ฅธ mediator subclass๋“คณผ ž‘๋™•™ฒŒ •ฃผ๋ฉฐ ๋ฐ˜๋Œ€˜ ฒฝšฐ๋„ ธ๋ ‡๋‹ค.
  2. Colleague-Mediator communication. colleague๋“ค€ ธ๋“ค˜ mediator™€ ฅ๋ฏธ๋กœšด ด๋ฒคŠธฐ€ ๋ฐœƒ–ˆ„•Œ, †ต‹ „ •••œ‹ค. •œฐ€ง€ ๋ฐฉ๋ฒ•€ mediator๋ฅผ Observer๋กœ„œ(ObserverPattern„ šฉ•„œ) ตฌ˜„•˜๋Š” ฒƒด๋‹ค. colleague ฒด๋“ค€ Subject๋“ค๋กœ„œ ž‘๋™•˜ , ž‹ ˜ ƒƒœฐ€ ๋ณ€–ˆ„•Œ, ง€‹œ๋ฅผ Mediator—ฒŒ  „‹•œ‹ค. Mediator๋Š” ๋ณ€™”˜ šจณผ๋ฅผ ๋‹ค๋ฅธ colleague๋“ค—ฒŒ  „‹•˜๋Š” ๋ฐ˜‘„ •œ‹ค.

˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•€ colleague๋“คด ๋ณด๋‹ค ๋” ง ‘œผ๋กœ communication•  ˆ˜ žˆ๋„๋ก Šน๋ณ„•œ interface๋ฅผ mediator—ฒŒ ‹ฌ๋Š” ฒƒด๋‹ค. œˆ๋„šฐšฉ Smalltalk/Vฐ€ ๋Œ€‘œ ˜•ƒœด๋‹ค. mediator™€ †ต‹ „ •˜ ž • •Œ, ž‹ „ argument๋กœ„˜ฒจ„œ mediatorฐ€ senderฐ€ ๋ˆ„ตฌง€ ‹๋ณ„•˜ฒŒ •œ‹ค. Sample Code๋Š” ™€ ฐ™€ ๋ฐฉ๋ฒ•„ ‚ฌšฉ•˜  žˆ , Smalltalk/V˜ ตฌ˜„€ Known Uses—„œ‹ค๋ฃจธฐ๋กœ •˜ ‹ค.

1.9. Sample Code

šฐ๋ฆฌ๋Š” DialogDirector๋ฅผ Motivation—„œ ๋ณด•˜๋˜ ฒƒ˜๋Ÿผ font dialog๋ฅผ ตฌ˜„•˜ธฐ œ„•„œ ‚ฌšฉ•  ฒƒด๋‹ค. ถ”ƒ ด๋ž˜Šค DialogDirector๋Š” director๋“ค„ œ„•œ interface๋ฅผ  •˜ •˜  žˆ๋‹ค.
~cpp 
	class DialogDirector {
	public:
		virtual ~DialogDirector();

		virtual void ShowDialog();
		virtual void WidgetChanged(Widget) = 0;

	protected:
		DialogDirector();
		virtual void CreateWidgets() = 0;
	};

Widget € widgets๋“ค„ œ„•œ ถ”ƒ ธฐดˆ ด๋ž˜Šคด๋‹ค. •˜๋‚˜˜ widget€ ž‹ ˜ director๋ฅผ •Œ  žˆ๋‹ค.
~cpp 
	class Widget {
	public:
		Widget(DialogDirector*);
		virtual void Changed();

		virtual void handleMouse(MouseEvent& event);
		//...
	private:
		DialogDirector* _director;
	};

changed ๋Š” director˜ WidgetChanged —ฐ‚ฐ„ ˜œ•œ‹ค. Widget๋“ค€ ž‹ ˜ director˜ WidgetChanged ˜œ„ ˜๋ฏธžˆ๋Š” ด๋ฒคŠธ๋ฅผ •Œ ฃผธฐ œ„•„œ ‚ฌšฉ•œ‹ค.
~cpp 
	void Widget::Changed() {
		_director->WidgetChanged(this);
	}

DialogDirector˜ subclass๋“ค€   ˆ•œ widgetž‘๋™•˜ธฐ œ„•„œ WidgetChanged๋ฅผ override•„œ šฉ•œ‹ค. widget€ ž‹ ˜ referece๋ฅผ WidgetChanged— argument๋กœ„œ„˜ฒจคŒœผ๋กœ„œ –ด๋–ค widget˜ ƒƒœฐ€ ๋ฐ”๋€Œ—ˆ๋Š”ง€๋ฅผ director๋กœ •˜—ฌธˆ •ŒฒŒ•ค€๋‹ค. DialogDirector˜ subclass๋“ค€ CreateWidget ˆœˆ˜ ถ”ƒ —ฐ‚ฐž๋ฅผ ๋‹–ผ๋กœ— widget๋“ค„ ๋งŒ๋“คธฐ œ„•žฌ •˜•œ‹ค.

ListBox, EntryField, Button€ Šน™”๋œ ‚ฌšฉž „Ž˜Šค š”†Œ๋ฅผ œ„•œ DialogDirector˜ subclass๋“คด๋‹ค. ListBox๋Š” ˜„žฌ „ ƒ„ œ„•„œ GetSelection—ฐ‚ฐž๋ฅผ  œณต•œ‹ค. ธ๋ฆฌ  EntryField˜ SetText —ฐ‚ฐž๋Š” ƒˆ๋กœšด text๋กœ field๋ฅผ „šด๋‹ค.

~cpp 
	class ListBox:public Widget {
	public:
		ListBox(DialogDirector*);

		virtual const char* GetSelection();
		virtual void SetList(List* listItems);
		virtual void HandMouse(MouseEvent& event);
		//..
	};

	class EntryField:public Widget {
	pblic:
		EntryField(DialogDirector*);
		virtual void SetText(const char* text);
		virtual const char* GetText();
		virtual void handleMouse(MouseEvent& event);
		//...
	};

Button€ ฒƒด ๋ˆŒ๋ŸฌกŒ„•Œ, Changed๋ฅผ ˜œ•˜๋Š” ๋‹ˆœ•œ widgetด๋‹ค. ด๋Š” HandleMouse๋ฅผ ตฌ˜„•œผ๋กœจ ๋˜–ด„‹ค.
~cpp 
	class Button : public widget {
	public:
		button(DialogDirector*);

		virtual void SetText(const char* text);
		virtual void HandleMouse(MouseEvent& event);
		//...
	};
	
	void Button::HandleMouse(MouseEvent& event) {
		//....
		Change();
	}

FontDialogDirector ด๋ž˜Šค๋Š” ๋‹–ผ๋กœธ ๋ฐ•Šค˜ widgets‚ฌ— ‘„œ„˜•œ‹ค. FontDialogDirector๋Š” DialogDirector˜ •˜œ„ ด๋ž˜Šคด๋‹ค.
~cpp 
	class FontDialogDirector:public DialogDirector {
	public:
		FontDialogDirector();
		virtual ~FontDialogDirector();
		virtual void WidgetChanged(Widget*);

	protected:
		virtual void CreateWidgets();

	private
		Button* _ok;
		Buton* _cancel;
		ListBox* _fontList;
		entryField* _fontName;
	};

FontDialogDirector๋Š” ฒƒด display•˜๋Š” widget„ ถ” •œ‹ค. ฒƒ€ widget๋“ค„ ๋งŒ๋“คธฐ œ„•„œ CreateWidget„ žฌ •˜•˜  ฒƒ˜ reference๋กœ ฒƒ๋“ค„ ดˆธฐ™”•œ‹ค.
~cpp 
	void FontDialogDirector::CreateWidgets() {
		_ok = new Button(this);
		_cnacel = new Button(this);
		_fontList = new ListBox(this);
		_fontName = new EntryField(this);

		// fill the listBox white the available font names

		// assemble the widgets in the dialog
	};

WidgetChanged๋Š” widget๋“ค„œ๋กœ   ˆ•˜ฒŒ ๋™ž‘•˜๋Š” ฒƒ„ ™•‹ •˜ฒŒ •œ‹ค.
~cpp 
	void FontDialogDirector::WidgetChanged(
		Widget* theChangedWidget
	) {
		if(theChangedWidget ==_fontList) {
		_fontName->GetTet(_fontList->GetSelection());
	  } else if (theChangedWidget == _ok) {
		//apply font chnage and dismiss dialog
		//...
	  } else if (theChangedWidget ==_cancel) {
		//dismiss dialog
	  }
	}

WidgetChanged˜ ๋ณตžก„€ ธ๋งŒผ ๋‹–ผ๋กœธ ๋ณตžก„„ ๋†’ธ๋‹ค. ๋ฌผ๋ก  ฐ ๋‹–ผ๋กœธ๋Š” ๋‹ค๋ฅธ œ ๋กœ •„œ ๋ฐ”๋žŒง•˜ง€ ๋ชป•˜ง€๋งŒ, mediator ๋ณตžก„€ ๋‹ค๋ฅธ application๋“ค—„œ Œจ„˜ ž‡ „ ™„™”‹œ‚จ๋‹ค.

1.10. Known Uses

ET++WGM88™€ THINK C class librarySm93b๋Š” ๋‹–ผ๋กœ—„œ widget๋“ค ‚ฌ— mediator๋กœ„œ director™€ œ ‚ฌ•œ ฒด๋ฅผ ‚ฌšฉ•œ‹ค.

œˆ๋„šฐšฉ Smalltalk/V˜ applicationตฌกฐ๋Š” mediator ตฌกฐ— ฐ€๋ฐ˜„‘  žˆ๋‹ค.LaL94 ธ๋Ÿฐ ™˜ฒฝ—„œ application€ œˆ๋„šฐ๋ฅผ pane๋“ค˜ ๋ชจŒœผ๋กœ ตฌ„•˜  žˆ๋‹ค. library๋Š” ๋ช‡๋ช‡˜ ด๋ฏธ  •˜๋œ pane๋“ค„ ฐ€ง€  žˆ๋‹ค. ˜ˆ๋ฅผ ๋“คž๋ฉด TextPane, ListBox, Button๋“ฑ๋“ฑฌ•จ๋œ‹ค. ด๋Ÿฌ•œ pane๋“ค€ subclassing—†šฉ๋  ˆ˜ žˆ๋‹ค. Application œ๋ฐœž๋Š” ๋‹ง€ inter-pane coordination•  ฑ…ž„žˆ๋Š” ViewManager๋งŒ subclassing•  ˆ˜ žˆ๋‹ค. ViewManage๋Š” Mediator  ฐฐ˜ pane๋“ค€ ž‹ ˜ owner๋กœ„œ‹ง€ ž‹ ˜ ViewManager๋ฅผ •Œ  žˆ๋‹ค. pane๋“ค€ ง ‘ œผ๋กœ „œ๋กœ กฐšŒ•˜ง€ •Š๋Š”๋‹ค.

‹Œ object diagram€ run-time— application˜ snapshot„ ๋ณด—ฌฃผ  žˆ๋‹ค.


SmallTalk/V๋Š” Pane-ViewManager †ต‹ „ œ„•ด event ธฐ๋ฒ•„ ‚ฌšฉ•˜  žˆ๋‹ค. –ด๋–ค pane€ –ด๋–ค  •๋ณด๋ฅผ mediator๋กœ ๋ถ€„–ปธฐ ›•˜ฑฐ๋‚˜ –ด๋–ค ˜๋ฏธžˆ๋Š” ด ๋ฐœƒ•„œ ด๋ฅผ mediator—ฒŒ •Œ๋ ฃผธฐ œ„•„œ event๋ฅผ ƒ„•œ‹ค. •˜๋‚˜˜ event๋Š” ธ event๋ฅผ ‹๋ณ„•˜๋Š” symbol„  •˜•œ‹ค. ธ event๋ฅผ ๋‹ค๋ฃจธฐ œ„•„œ ViewManager๋Š” pane— method selector๋ฅผ ๋“ฑ๋ก•œ‹ค. ด selector๋Š” event˜ handlerด๋‹ค. ฒƒ€ eventฐ€ ๋ฐœƒ•œ•Œ๋ฉด –ธ œ๋“ ง€ ˆ˜–‰๋  ฒƒด๋‹ค.

‹Œ ฝ”๋“œ šฉ€ ListBoxฐ€ ViewManager subclass ๋‚ด—„œ ๋งŒ๋“ค–ดง€๋Š” ๋ฐฉ๋ฒ•ณผ #select event๋ฅผ œ„•ViewManagerฐ€ event handler๋ฅผ ๋“ฑ๋ก•˜๋Š” ๋ฐฉ๋ฒ•„ ๋ณด—ฌฃผ  žˆ๋‹ค.
~cpp 
     self addSubpane: (ListPane new
          paneName: 'myListPane';
          owner: self;
          when: #select perform: #listSlet:).

MediatorPattern˜˜๋‹ค๋ฅธ application€ coordinating complex updates— žˆ๋‹ค. •˜๋‚˜˜ ˜ˆ๋Š” Observer๋กœ„œ –ธธ‰๋˜–ดง€๋Š” ChangeManager classด๋‹ค. ChangeManager๋Š” ‘๋ณต update๋ฅผ ”ผ•˜ธฐ œ„•„œ subjectsณผ observers‘„— œ„˜•œ‹ค. ฒดฐ€ ๋ณ€• •Œ, ChangeManager—ฒŒ •Œ๋ฆฐ๋‹ค. ธ๋ž˜„œ ChangeManager๋Š” ฒด˜ dependecy๋ฅผ •Œ๋ฆฌ๋Š” ฒƒœผ๋กœ update๋ฅผ กฐ ••œ‹ค.

œ ‚ฌ•œ application€ Unidraw drawing framework—„œ ๋‚˜ƒ€๋‚˜ VL90 connectors‚ฌ— —ฐฒฐ„ œ•ฝ๋“ค„  šฉ•˜๋Š” CSolverผ ๋ถˆ๋ฆฌ๋Š” class๋ฅผ ‚ฌšฉ•œ‹ค. ธ๋ž˜”ฝ Žธ‘ธฐ—„œ ฒด๋“ค€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•œผ๋กœ „œ๋กœ‹ค๋ฅธ ฒด๋“ค„ œ‘๋Š” ฒƒœผ๋กœ ๋ณดˆ˜ žˆ๋‹ค. connector๋“ค€ —ฐฒฐ„ž๋™ œผ๋กœ ด€๋ฆฌ๋˜๋Š” ธ๋ฆผ Žธ‘ธฐ๋‚˜ šŒ๋กœ „„ ‹œŠค…œณผ ฐ™€ application๋“ค—„œ œ šฉ•˜‹ค. CSolver๋Š” ฒด๋“ค ‚ฌ— mediatorด๋‹ค. ฒƒ€ —ฐฒฐ œ•„ •ฒฐ•˜ , connector๋“ค˜ œ„˜๋ฅผ ฒƒ๋“ค„ ๋ฐ˜˜•˜ธฐ œ„•„œ update•œ‹ค.

1.11. Related Patterns

FacadePattern(185)€ ๋ณด๋‹Žธ๋ฆฌ•œ „Ž˜Šค๋ฅผ  œณต•˜ ž subsystem˜ ฒด๋“ค„ ถ”ƒ™”‹œ‚จ Mediator™€ ๋‹ค๋ฅด๋‹ค. ฒƒ˜ protocol€ „ ‘ ด๋‹ค. ๋‹‹œ ๋ง•˜๋ฉด Facade ฒด๋“ค€ subsystem˜ š”ฒญ๋“ค„ ๋งŒ๋“คง€๋งŒ ๋ฐ˜๋Œ€˜ ฒฝšฐ๋Š” ธ๋ ‡ง€ ๋ชป•˜‹ค. ๋Œ€กฐ œผ๋กœ Mediator๋Š” colleague๋“ค œณต•˜ง€ ๋ชป•˜ฑฐ๋‚˜ •  ˆ˜ —†๋Š” ˜‘๋™ –‰œ„๋ฅผ ฐ€๋Šฅ•˜ฒŒ •ค€๋‹ค. ธ๋ž˜„œ ธ protocol€ multidirectional•˜‹ค.

ธฐ๋ณธ œผ๋กœ FacadePattern€ ด๋ž˜Šค ‘‹žˆ , ด๋ž˜Šค ‘‹„ ‚ฌšฉ•˜๋Š” ™ธ๋ถ€ ด๋ž˜Šค˜ ž…žฅ—„œ •„š”•œ Œจ„ , MediatorPattern€ ด๋ž˜Šค ‘‹žˆ , ด๋ž˜Šค ‘‹จ ๋‚ด๋ถ€—„œ „œ๋กœ๋ฅผ ‚ฌšฉ•˜ธฐ œ„•œ Œจ„ด๋‹ค.

˜ˆปจ๋Œ€, Seminar:ElevatorSimulation— —ฌ๋Ÿฌฐ€ง€ ๋ฐฐšฐ(—˜ ˆ๋ฒ „ฐ, ‚ฌ๋žŒ, ธต, ...)๋“คกดžฌ•  ฒฝšฐ, ‚ฌ๋žŒ€ ธต„ ฐธกฐ, ‚ฌšฉ•˜ , ธต€ ๋‹‹œ ฐ–  žˆ๋Š” ‚ฌ๋žŒ„ ฐธกฐ•˜ , —˜ ˆ๋ฒ „ฐ๋Š” ‚ฌ๋žŒ„ ฐธกฐ, ‚ฌšฉ•˜  •˜๋Š” ‹œผ๋กœ ๋ณตžก•œ (ˆœ™˜) ˜กดด€„ฐ€ กดžฌ•œ‹ค. ด๋Ÿด ๋•Œ MediatorPattern„ “ฐฒŒ๋˜๋ฉด ด ๋ณตžก•œ ˜กด ๋ฆฌ๋ฅผ ๋Š„ ˆ˜ žˆ๋‹ค.

colleague๋“ค€ observer(293) pattern„ šฉ•˜๋Š” Mediator™€ †ต‹ •  ˆ˜ žˆ๋‹ค.


Facade ™€ Mediator ๋ฅผ ฐ€๋” ˜ผ๋™–ˆ—ˆ๋Š”๋ฐ. ฌ๋ก˜• ฐ‚ฌฐ‚ฌš”~~ --1002



Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:18
Processing time 0.0502 sec