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