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.0447 sec