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 ๋ก ์ ๋ฌ๋๊ณ ์๋ ์ด๋ฒคํธ๋ค์ ํ๋ฆ์ด ์๋ค.
์ฌ๊ธฐ์๋ list box์์์ ์ ํ์ด entry field ๋ก ์ ๋ฌ๋๊ณ ์๋ ์ด๋ฒคํธ๋ค์ ํ๋ฆ์ด ์๋ค.
- ๋ฆฌ์คํธ ๋ฐ์ค๊ฐ ๊ทธ๊ฒ์ 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.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์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ๊ณผ ๋จ์ ์ ์ง๋๋ค.
- MediatorPattern์ subclassing์ ์ ํํ๋ค. mediator๋ ๋ค์๋งํด ๋ช๋ช๊ฐ์ ๊ฐ์ฒด๋ค ์ฌ์ด์ ๋ถ์ฐ๋์ด์ง ํ์๋ฅผ ์ง์คํ๋ค. ์ด๋ฐ ํ์๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ ๋จ์ง Mediator๋ฅผ subclassingํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. Colleague ํด๋์ค๋ค์ ์ฌ์ฌ์ฉ๋์ด์ง ์ ์๋ค.
- MediatorPattern์ colleague๋ค์ ๋ผ์ด๋๋๋ค. Mediator๋ colleague๋ค ์ฌ์ด์์ loose coupling์ ์ด์งํ๋ค. colleagued์ Mediator๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ค์ํ๊ฒ ํ ์ ์๊ณ , ์ฌ์ฌ์ฉ ํ ์ ์๋ค.
- MediatorPattern์ ๊ฐ์ฒด protocols์ ๋จ์ํ ์ํจ๋ค. Mediator๋ ๋ค๋๋ค ์ํธ๊ด๊ณ๋ฅผ Mediator์ colleague๋ค ์ฌ์ด์ ์ผ๋๋ค ๊ด๊ณ๋ก ๋ฐ๊พธ์ด ๋๋๋ค. ์ผ๋๋ค ๊ด๊ณ๋ ์ดํด, ๊ด๋ฆฌ, ํ์ฅํ๋๋ฐ ๋ ์ฝ๋ค.
- MediatorPattern์ ๊ฐ์ฒด๊ฐ ํ๋ํ๋ ๋ฐฉ๋ฒ์ ์ถ์ํ ์ํจ๋ค. Mediation๋ฅผ ๋
๋ฆฝ์ ์ธ ๊ฐ๋
์ผ๋ก ๋ง๋ค๊ณ ํ๋์ ๊ฐ์ฒด์ ์บก์ํํ๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์ผ๋ก ํ์ฌ๊ธ ๊ฐ์ฒด์ ํ์๋ ์ ์ณ๋๊ณ ๊ทธ interaction์ ์ง์คํ๊ฒ ํด์ค๋ค. ์ด๋ ๊ฐ์ฒด๊ฐ ์์คํ
๋ด์์ ์ด๋ป๊ฒ interactํ๋ ๋ฐฉ๋ฒ์ ๋ช
ํํ ํ๋๋ฐ ๋์์ ์ค๋ค.
- MediatorPattern์ ์ ์ด๋ฅผ ์ง์คํํ๋ค. Mediator๋ interaction์ ๋ณต์ก๋๋ฅผ mediator์ ๋ณต์ก๋์ ๋ง๋ฐ๊ฟจ๋ค. Mediator๊ฐ protocol๋ค์ encapsulateํ๊ธฐ ๋๋ฌธ์ colleague๊ฐ์ฒด๋ค ๋ณด๋ค ๋ ๋ณต์กํ๊ฒ ๋์ด์ง ์ ์๋ค. ์ด๊ฒ์ด mediator๋ฅผ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ด monolith ํํ๋ฅผ ๋ฐ๊ฒ ๋ง๋ค ์ ์๋ค.
1.8. Implementation ¶
๋ค์ ๊ตฌํ๊ณผ ๊ด๋ จ๋ issue๋ค์ MediatorPattern๊ณผ ๊ด๋ จ์ด ์๋ค.
- ์ถ์ Mediator ํด๋์ค ์๋ตํ๊ธฐ. ์ถ์ Mediator ํด๋์ค๋ฅผ ์ ์ธํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ colleague๋ค์ด ๋จ์ง ํ๋์ mediator์๋ง ์์
์ ํ ๋์ด๋ค. Mediatorํด๋์ค๊ฐ ์ ๊ณตํ๋ ์ถ์์ ์ธ coupling์ colleague๋ค์ด ๋ค๋ฅธ mediator subclass๋ค๊ณผ ์๋ํ๊ฒ ํด์ฃผ๋ฉฐ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๊ทธ๋ ๋ค.
- Colleague-Mediator communication. colleague๋ค์ ๊ทธ๋ค์ mediator์ ํฅ๋ฏธ๋ก์ด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ํต์ ์ ํด์ผํ๋ค. ํ๊ฐ์ง ๋ฐฉ๋ฒ์ mediator๋ฅผ Observer๋ก์(ObserverPattern์ ์ด์ฉํด์) ๊ตฌํํ๋ ๊ฒ์ด๋ค. colleague ๊ฐ์ฒด๋ค์ Subject๋ค๋ก์ ์๋ํ๊ณ , ์์ ์ ์ํ๊ฐ ๋ณํ์ ๋, ์ง์๋ฅผ Mediator์๊ฒ ์ ๋ฌํ๋ค. Mediator๋ ๋ณํ์ ํจ๊ณผ๋ฅผ ๋ค๋ฅธ colleague๋ค์๊ฒ ์ ๋ฌํ๋ ๋ฐ์์ ํ๋ค.
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์ ํด๋์ค ์ง๋จ์ด ์๊ณ , ๊ทธ ํด๋์ค ์ง๋จ ๋ด๋ถ์์ ์๋ก๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํจํด์ด๋ค.
์์ปจ๋,
ElevatorSimulation์ ์ฌ๋ฌ๊ฐ์ง ๋ฐฐ์ฐ(์๋ ๋ฒ ์ดํฐ, ์ฌ๋, ์ธต, ...)๋ค์ด ์กด์ฌํ ๊ฒฝ์ฐ, ์ฌ๋์ ์ธต์ ์ฐธ์กฐ, ์ฌ์ฉํ๊ณ , ์ธต์ ๋ค์ ๊ฐ๊ณ ์๋ ์ฌ๋์ ์ฐธ์กฐํ๊ณ , ์๋ ๋ฒ ์ดํฐ๋ ์ฌ๋์ ์ฐธ์กฐ, ์ฌ์ฉํ๊ณ ํ๋ ์์ผ๋ก ๋ณต์กํ (์ํ) ์์กด๊ด๊ณ๊ฐ ์กด์ฌํ๋ค. ์ด๋ด ๋ MediatorPattern์ ์ฐ๊ฒ๋๋ฉด ์ด ๋ณต์กํ ์์กด๊ณ ๋ฆฌ๋ฅผ ๋์ ์ ์๋ค.

colleague๋ค์ observer(293) pattern์ ์ด์ฉํ๋ Mediator์ ํต์ ํ ์ ์๋ค.
Facade ์ Mediator ๋ฅผ ๊ฐ๋ ํผ๋ํ์๋๋ฐ. ํฌ๋ก์ดํ ๊ฐ์ฌ๊ฐ์ฌ์~~ --1002