U E D R , A S I H C RSS

Gof/Facade

From GoF.


1. FACADE

1.1. Intent

์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ง‘ํ•ฉ์— ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Facade๋Š” ๊ณ ๊ธ‰๋ ˆ๋ฒจ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์„œ ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๋” ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.

1.2. Motivation

์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๋ณต์žกํ•จ์„ ์ค„์ด๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ์˜ ๋ชฉ์ ์€ ๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ๊ฐ„์˜ ํ†ต์‹ ๊ณผ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ชฉ์ ์„ ์„ฑ์ทจํ•˜๊ธฐ ์œ„ํ•œ ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋‹จ์ผํ•˜๊ณ  ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” facade object๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


์˜ˆ๋ฅผ ๋“ค๊ธฐ ์œ„ํ•ด, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ์ปดํŒŒ์ผ๋Ÿฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ™˜๊ฒฝ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Scanner, Parser, ProgramNode, BytecodeStream, ๊ทธ๋ฆฌ๊ณ  ProgramNodeBuilder ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๋ช‡๋ช‡ ํŠน์ˆ˜ํ™”๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋“ค์„ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ๋ฌธ๋ถ„์„(Parsing)์ด๋‚˜ ์ฝ”๋“œ ๋ณ€ํ™˜ (Code generation) ์˜ ์„ธ๋ถ€์ ์ธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค.(๊ทธ๋“ค์€ ๋‹จ์ง€ ์•ฝ๊ฐ„์˜ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ธฐ ์›ํ• ๋ฟ์ด์ง€ ๋‹ค๋ฅธ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.) ๊ทธ๋Ÿฌํ•œ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์ €๊ธ‰๋ ˆ๋ฒจ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹จ์ง€ ๊ทธ๋“ค์˜ ์ž‘์—…์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ๋ฟ์ด๋‹ค.

์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋“ค๋กœ๋ถ€ํ„ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ๊ธ‰๋ ˆ๋ฒจ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์€ facade ๋กœ์„œ Compiler class๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฐ ๊ธฐ๋Šฅ์„ฑ๋“ค์— ๋Œ€ํ•œ ๋‹จ์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. Compiler class๋Š” facade (์›๋ž˜์˜ ๋‹จ์–ด ๋œป์€ ๊ฑด๋ฌผ์˜ ์ „๋ฉด. ์™ธ๊ด€, ๊ฒ‰๋ณด๊ธฐ..) ๋กœ์„œ ์ž‘์šฉํ•œ๋‹ค. Compiler class๋Š” ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ์ปดํŒŒ์ผ๋Ÿฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋‹จ์ผํ•˜๊ณ  ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Compiler class๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ฐ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋“ค์„ ์™„๋ฒฝํ•˜๊ฒŒ ์€ํ์‹œํ‚ค์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ํฌํ•จ์‹œ์ผœ์„œ ๋ถ™์ธ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ facade ๋Š”์ €๊ธ‰๋ ˆ๋ฒจ์˜ ๊ธฐ๋Šฅ๋“ค์˜ ์€ํ์—†์ด ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ ํŽธ๋ฆฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.


1.3. Applicabilty

์ด๋Ÿด๋•Œ Facade Pattern์„ ์‚ฌ์šฉํ•˜๋ผ.
  • ๋ณต์žกํ•œ ์„œ๋ธŒ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์›ํ• ๋•Œ. ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ์ข…์ข… ์‹œ์Šคํ…œ๋“ค์ด ๋ฐœ์ „๋˜์–ด๋‚˜๊ฐ€๋ฉด์„œ ๋”์šฑ ๋ณต์žก์„ฑ์„ ๋„๊ฒŒ ๋œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํŒจํ„ด๋“ค์€ ํŒจํ„ด์ด ์ ์šฉ๋œ ๊ฒฐ๊ณผ๋กœ ๋งŽ๊ณ  ์ž‘์€ ํด๋ž˜์Šค๋“ค์ด ๋˜๊ฒŒ ํ•œ๋‹ค. ํŒจํ„ด์˜ ์ ์šฉ์€ ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์ด ๋” ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜์ง€๋งŒ, ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ํด๋ผ์ด์–ธํŠธ๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. Facade๋Š” ์„œ๋ธŒ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋‹จ์ˆœํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์‹œ๊ฐ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์‹œ๊ฐ์€ ๋Œ€๋ถ€๋ถ„์˜ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ์ถฉ๋ถ„ํ•˜๋‹ค. ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ๊ฐ€ ํ•„์š”ํ•œ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ๋งŒ์ด facade๋ฅผ ๋„˜์–ด์„œ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋“ค๊ณผ ์ถ”์ƒ ํด๋ž˜์Šค๋“ค์˜ ๊ตฌํ˜„ ์‚ฌ์ด์—๋Š” ๋งŽ์€ ์˜์กด์„ฑ์ด ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ธŒ์‹œ์Šคํ…œ ์‚ฌ์ด๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ค๊ธฐ ์œ„ํ•ด facade๋ฅผ ๋„์ž…ํ•˜๋ผ. ๊ทธ๋Ÿฌํ•จ์œผ๋กœ์„œ ์„œ๋ธŒํด๋ž˜์Šค์˜ ๋…๋ฆฝ์„ฑ๊ณผ Portability๋ฅผ ์ฆ์ง„์‹œํ‚จ๋‹ค.
  • ์„œ๋ธŒ์‹œ์Šคํ…œ์— ๊ณ„์ธต์„ ๋‘๊ณ  ์‹ถ์„ ๋•Œ. ๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์˜ entry point๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด facade๋ฅผ ์‚ฌ์šฉํ•˜๋ผ. ๋งŒ์ผ ๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์ด ์„œ๋กœ ์˜์กด์ ์ด๋ผ๋ฉด ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค๊ฐ„์˜ ๋Œ€ํ™”๋ฅผ ๊ฐ ์‹œ์Šคํ…œ๊ฐ„์˜ facade๋กœ ๋‹จ์ผํ™” ์‹œํ‚ด์œผ๋กœ์„œ ๊ทธ ์˜์กด์„ฑ์„ ๋‹จ์ˆœํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.



1.4. Participant

Facade (Compiler)
- ๊ฐ ์„œ๋ธŒ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋Š” ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ๋‹ค.
- ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ ํ•ฉํ•œ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.
subsystem classes (Scanner, Parser, ProgramNode, etc.)
- ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ๋“ค์ด ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค.
- Facade ๊ฐ์ฒด์— ์˜ํ•ด ์ •์˜๋œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
- facade ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”์—†๋‹ค. facade object์— ๋Œ€ํ•œ reference๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

1.5. Collaborations

  • ํด๋ผ์ด์–ธํŠธ๋Š” Facade์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋ƒ„์œผ๋กœ์„œ ์„œ๋ธŒ์‹œ์Šคํ…œ๊ณผ ๋Œ€ํ™”ํ•œ๋‹ค. Facade ๊ฐ์ฒด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ ํ•ฉํ•œ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด์—๊ฒŒ ๋„˜๊ธด๋‹ค. ๋น„๋ก ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, facade ๋Š” facade ์˜ ์ธํผํŽ˜์ด์Šค๋ฅผ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ์˜ ์ž‘์—…์„ ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.
    facade ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ์ง์ ‘ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

1.6. Consequences

Facade Pattern์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ต์„ ์ œ๊ณตํ•ด์ค€๋‹ค.
  1. ์„œ๋ธŒ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ํด๋ผ์ด์–ธํŠธ๋“ค์„ ๋ณดํ˜ธํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•จ์œผ๋กœ์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋‹ค๋ฃจ๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ณ , ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์ค€๋‹ค.
  2. ์„œ๋ธŒ์‹œ์Šคํ…œ๊ณผ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ์•ฝํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ์ข…์ข… ์„œ๋ธŒ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ•ํ•œ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ธฐ๋„ ํ•œ๋‹ค. ์•ฝํ•œ ์—ฐ๊ฒฐ๊ด€๊ณ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉด์„œ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋‹ค์–‘ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค. Facade ๋Š” ์‹œ์Šคํ…œ๊ณผ ๊ฐ์ฒด๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ณ„์ธตํ™” ํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. Facade๋Š” ๋ณต์žกํ•จ์ด๋‚˜ ์ˆœํ™˜์˜์กด์„ฑ์„ ์—†์• ์ค€๋‹ค. ์ด๊ฒƒ์€ ํดํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ธŒ์‹œ์Šคํ…œ์ด ๋น„์˜์กด์ ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์„๋•Œ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒฐ๊ณผ์ผ ๊ฒƒ์ด๋‹ค.
  3. ๊ทธ๋Ÿฌํ•˜๋ฉด์„œ๋„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—ฌ์ „ํžˆ ์„œ์Šค์‹œ์Šคํ…œ ํด๋ž˜์Šค๋“ค์„ ์‚ฌ์šฉํ•  ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์‚ฌ์šฉ์˜ ํŽธ๋ฆฌ์„ฑ๊ณผ ์ผ๋ฐ˜์„ฑ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

1.7. Implementation

facade๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ issue๋ฅผ ์ƒ๊ฐํ•˜๋ผ.
  1. ํด๋ผ์ด์–ธํŠธ-์„œ๋ธŒ์‹œ์Šคํ…œ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ์ค„์—ฌ๋ผ.
ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ธŒ์‹œ์Šคํ…œ๊ฐ„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋Š” Facade๋ฅผ ์ถ”์ƒํด๋ž˜์Šค๋กœ ๋งŒ๋“ฌ์œผ๋กœ์„œ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์ถ”์ƒ Facade class์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์„œ๋ธŒ์‹œ์Šคํ…œ๊ณผ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒํด๋ž˜์Šค์™€์˜ ์—ฐ๊ฒฐ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ๊ตฌํ˜„์„ ์•Œ์•„์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ์„ ์—†์• ์ค€๋‹ค.
์„œ๋ธŒํด๋ž˜์‹ฑ์˜ ๋Œ€์ฒด๋Š” ๋‹ค๋ฅธ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„ Facade ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. facade๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๋ ค๋ฉด ๋‹จ์ˆœํžˆ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๊ตํ™˜ํ•œ๋‹ค.

2. public vs private ์„œ๋ธŒ์‹œ์Šคํ…œ ํด๋ž˜์Šค.
์„œ๋ธŒ์‹œ์Šคํ…œ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ์ ๊ณผ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ (ํด๋ž˜์Šค๋Š” state์™€ operation์„ ์บก์Аํ™”ํ•˜๋Š” ๋ฐ˜๋ฉด, ์„œ๋ธŒ์‹œ์Šคํ…œ์€ classes๋ฅผ ์บก์Аํ™”ํ•œ๋‹ค.) ์บก์Аํ™”ํ•œ๋‹ค๋Š” ์ ์—์„œ class ์™€ ๋น„์Šทํ•˜๋‹ค. class ์—์„œ public ๊ณผ private interface๋ฅผ ์ƒ๊ฐํ•˜๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ์„œ๋ธŒ์‹œ์Šคํ…œ์—์„œ public ๊ณผ private interface ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์„œ๋ธŒ์‹œ์Šคํ…œ์œผ๋กœ์˜ public interface๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋“ค์ด ์ ‘์†๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค๋“ค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ. ์ด๋•Œ ์„œ๋ธŒ์‹œ์Šคํ…œ์œผ๋กœ์˜ private interface๋Š” ๋‹จ์ง€ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์ž๋“ค์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๋”ฐ๋ผ์„œ facade class๋Š” public interface์˜ ์ผ๋ถ€์ด๋‹ค. ํ•˜์ง€๋งŒ, ์œ ์ผํ•œ ์ผ๋ถ€์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„œ๋ธŒ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋“ค ์—ญ์‹œ ๋Œ€๊ฒŒ public interface์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ Parser class๋‚˜ Scanner class๋“ค์€ public interface์˜ ์ผ๋ถ€์ด๋‹ค.
์„œ๋ธŒ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋ฅผ private ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์œ ์šฉํ•˜์ง€๋งŒ, ์ผ๋ถ€์˜ OOP Language๊ฐ€ ์ง€์›ํ•œ๋‹ค. C++๊ณผ Smalltalk ๋Š” ์ „ํ†ต์ ์œผ๋กœ class์— ๋Œ€ํ•œ namespace๋ฅผ globalํ•˜๊ฒŒ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๊ทผ์— C++ ํ‘œ์ค€ํšŒ์˜์—์„œ namespace๊ฐ€ ์ถ”๊ฐ€๋จ์œผ๋กœ์„œ Str94, public ์„œ๋ธŒ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋ฅผ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.Str94 (์ถฉ๋Œ์˜ ์—ฌ์ง€๋ฅผ ์ค„์˜€๋‹ค๋Š” ํŽธ์ด ๋งž์„๋“ฏ..)

Sample Code
์ž, Compiler ์„œ๋ธŒ์‹œ์Šคํ…œ์— ์–ด๋–ป๊ฒŒ facade๊ฐ€ ์ž…ํ˜€์ง€๋Š”์ง€ ์ž์„ธํžˆ ๋ณด๋„๋ก ํ•˜์ž.

Compiler ์„œ๋ธŒ์‹œ์Šคํ…œ์€ BytecodeStream ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” Bytecode ๊ฐ์ฒด์˜ ์ŠคํŠธ๋ฆผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. Bytecode ๊ฐ์ฒด๋Š” ๋จธ์‹ ์ฝ”๋“œ๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๋Š” bytecode๋ฅผ ์บก์Аํ™”ํ•œ๋‹ค. ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ๋˜ํ•œ Token ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ, Token ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด๋‚ด์˜ token๋“ค์„ ์บก์Аํ™”ํ•œ๋‹ค.

Scanner ํด๋ž˜์Šค๋Š” character ์ŠคํŠธ๋ฆผ์„ ์–ป์–ด์„œ token์˜ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ ๋‹ค.

class Scanner {
public:
	Scanner (istream&);
	virtual ~Scanner ();

	virtual Token& Scan ();
private:
	istream& _inputStream;
};


Parser ํด๋ž˜์Šค๋Š” Scanner์˜ token๋กœ parse tree๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ProgramNodeBuilder ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 
class Parser {
public:
	Parser ();
	virtual ~Parser ();

	virtual void Parse (Scanner&, ProgramNodeBuilder &);
};

Parser๋Š” ์ ์ง„์ ์œผ๋กœ parse tree๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ProgramNodeBuilder ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋“ค์€ Builder pattern์— ๋”ฐ๋ผ ์ƒํ˜ธ์ž‘์šฉํ•œ๋‹ค.

 
class ProgramNodeBuilder {
public:
	ProgramNodeBuilder ();

	virtual ProgramNode* NewVariable (
		const char* variableName
	) const;

	virtual ProgramNode* NewAssignment (
		ProgramNode* variable, ProgramNode* expression
	) const;

	virtual ProgramNode* NewRetrunStatement (
		ProgramNode* value
	) const;

	virtual ProgramNode* NewCondition (
		ProgramNode* condition,
		ProgramNode* truePart, ProgramNode* falsePart
	) const;

	// ...

	ProgramNode* GetRootNode ();

private:
	ProgramNode* _node;
};

parser tree๋Š” StatementNode, ExpressionNode์™€ ๊ฐ™์€ ProgramNode์˜ subclass๋“ค์˜ ์ธ์Šคํ„ด์Šค๋“ค๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ProgramNode ๊ณ„์ธต ๊ตฌ์กฐ๋Š” Composite Pattern์˜ ์˜ˆ์ด๋‹ค. ProgramNode๋Š” program node ์™€ program node์˜ children์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

 
class ProgramNode {
public:
	// program node manipulation
	virtual void GetSourcePosition (int& line, int& index);
	// ...


	// child manipulation
	virtual void Add (ProgramNode*);
	virtual void Remove (ProgramNode*);
	// ...

	virtual void Traverse (CodeGenerator&);
protected:
	ProgramNode ();
};

Traverse operaton์€ CodeGenerator ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ์ทจํ•œ๋‹ค. ProgramNode subclass๋“ค์€ BytecodeStream์— ์žˆ๋Š” Bytecode๊ฐ์ฒด๋“ค์„ machine code๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด CodeGenerator ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. CodeGenerator ํด๋ž˜๋Š” visitor์ด๋‹ค. (VisitorPattern์„ ์ฐธ์กฐํ•˜๋ผ)

class CodeGenerator {
public:
	virtual void Visit (StatementNode*);
	virtual void Visit (ExpressionNode*);
	// ...
protected:
	CodeGenerator (BytecodeStream&);
protected:
	BytecodeStream& _output;
};

CodeGenerator ๋Š” subclass๋ฅผ ๊ฐ€์ง„๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด StackMachineCodeGenerator sk RISCCodeGenerator ๋“ฑ. ๊ฐ๊ฐ์˜ ๋‹ค๋ฅธ ํ•˜๋“œ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ machine code๋กœ ๋ณ€ํ™˜ํ•˜๋Š” subclass๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

ProgramNode์˜ ๊ฐ subclass๋“ค์€ ProgramNode์˜ child์ธ ProgramNode ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด Traverse operation์„ ๊ตฌํ˜„ํ•œ๋‹ค. ๋งค๋ฒˆ ๊ฐ child๋Š” children์—๊ฒŒ ๊ฐ™์€ ์ผ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ExpressionNode๋Š” Traverse๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.
void ExpressionNode::Traverse (CodeGenerator& cg) {
	cg.Visit (this);

	ListIterator <ProgramNode*> i (_children);

	for (i.First (); !i.IsDone (); i.Next ()) {
		i.CurrentItem ()->Traverse (cg);
	}
}

์šฐ๋ฆฌ๊ฐ€ ํ† ๋ก ํ•ด์˜จ ํด๋ž˜์Šค๋“ค์€ ๊ณง Compiler ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ด๋ฃฐ ๊ฒƒ์ด๋‹ค. ์ž ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ์กฐ๊ฐ๋“ค์„ ํ•จ๊ป˜ ๋ฌถ์€ facade ์ธ Compiler ํด๋ž˜์Šค๋ฅผ ์†Œ๊ฐœํ•  ๊ฒƒ์ด๋‹ค. Compiler๋Š” ์†Œ์Šค ์ปดํŒŒ์ผ๊ณผ ํŠน์ • machine์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ณ€ํ™˜๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‹จ์ˆœํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

class Compiler {
public:
	Compiler ();

	virtual void Compile (istream&, BytecodeStream&);
};

void Compiler::Compile (
	istream& input, BytecodeStream& output
) {
	Scanner scanner (input);
	ProgramNodeBuilder builder;
	Parser parser;

	parser.Parse (scanner, builder);

	RISCCodeGenerator generator (output);
	ProgramNode* parseTree = builder.GetRootNode ();
	parseTree->Traverse (generator);
}

์ด ๊ตฌํ˜„์—์„œ๋Š” ์‚ฌ์šฉํ•˜๋ ค๋Š” code-generator์˜ ํ˜•ํƒœ์— ๋Œ€ํ•ด์„œ hard-codes (์ง์ ‘ ํŠน์ •ํ˜•ํƒœ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ž…๋ ฅ)๋ฅผ ํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋ชฉ์ ์ด ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌ์ฒดํ™”์‹œํ‚ค๋„๋ก ์š”๊ตฌ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์ผ ๋ชฉ์ ์ด ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋‹จ ํ•˜๋‚˜๋ผ๋ฉด ๊ทธ๊ฒƒ์€ ์•„๋งˆ ์ด์„ฑ์ ์ธ ํŒ๋‹จ์ผ ๊ฒƒ์ด๋‹ค. ๋งŒ์ผ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์šฐ๋ฆฌ๋Š” Compiler ์˜ constructor ์— CodeGenerator ๋ฅผ ์ธ์ž๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ ์›ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” Compiler๋ฅผ instanceํ™” ํ• ๋•Œ ์‚ฌ์šฉํ•  generator๋ฅผ ๊ตฌ์ฒดํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. Compiler facade๋Š” ๋˜ํ•œ Scanner๋‚˜ ProgramNodeBuilder ๋“ฑ์˜ ๋‹ค๋ฅธ ํ˜‘๋™ํ•˜๋Š” ์„œ๋ธŒ์‹œ์Šคํ…œํด๋ž˜์Šค๋ฅผ ์ธ์žํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์œ ์—ฐ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค์ง€๋งŒ, ๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉํ˜•ํƒœ์— ๋Œ€ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹จ์ˆœํ•จ์„ ์ œ๊ณตํ•˜๋Š” Facade pattern์˜ ์˜์˜๋ฅผ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค.

1.8. Known Uses

Sample Code์˜ compiler ์˜ ์˜ˆ๋Š” ObjectWorksSmalltalk compiler system์—์„œ ์˜๊ฐ์„ ์–ป์€ ๊ฒƒ์ด๋‹ค.Par90
ET++ application framework WGM88 ์—์„œ, application์€ run-time ์ƒ์—์„œ application์˜ ๊ฐ์ฒด๋“ค์„ ์‚ดํ•„ ์ˆ˜ ์ˆ˜ ์žˆ๋Š” built-in browsing tools๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.์ด๋Ÿฌํ•œ browsing tools๋Š” "ProgrammingEnvironment'๋ผ ๋ถˆ๋ฆฌ๋Š” facade class๋ฅผ ๊ฐ€์ง„ ๊ตฌ๋ถ„๋œ ์„œ๋ธŒ์‹œ์Šคํ…œ์— ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. ์ด facade๋Š” browser์— ์ ‘๊ทผ ํ•˜๊ธฐ ์œ„ํ•œ InspectObject๋‚˜ InspectClass๊ฐ™์€ operation์„ ์ •์˜ํ•œ๋‹ค.
ET++ application์€ ๋˜ํ•œ built-in browsing support๋ฅผ ์—†์•จ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ProgrammingEnvironment๋Š” ์ด ์š”์ฒญ์— ๋Œ€ํ•ด null-operation์œผ๋กœ์„œ ๊ตฌํ˜„ํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ null-operation๋Š” ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ ETProgrammingEnvironment subclass๋Š” ๊ฐ๊ฐ ๋Œ€์‘ํ•˜๋Š” browser์— ํ‘œ์‹œํ•ด์ฃผ๋Š” operation์„ ๊ฐ€์ง€๊ณ  ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ๊ตฌํ˜„ํ•œ๋‹ค. application์€ browsing environment๊ฐ€ ์กด์žฌํ•˜๋˜์ง€ ๊ทธ๋ ‡์ง€ ์•Š๋˜์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค. application ๊ณผ browsing ์„œ๋ธŒ์‹œ์Šคํ…œ ์‚ฌ์ด์—๋Š” ์ถ”์ƒ์ ์ธ ๊ฒฐํ•ฉ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.

Choices operating system CIRM93 ์€ ๋งŽ์€ framework๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ธฐ ์œ„ํ•ด facade๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Choices์—์„œ์˜ key๊ฐ€ ๋˜๋Š” ์ถ”์ƒ๊ฐ์ฒด๋“ค์€ process์™€ storge, ๊ทธ๋ฆฌ๊ณ  adress spaces ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ์ถ”์ƒ๊ฐ์ฒด๋“ค์—๋Š” ๊ฐ๊ฐ์— ๋Œ€์‘๋˜๋Š” ์„œ๋ธŒ์‹œ์Šคํ…œ์ด ์žˆ์œผ๋ฉฐ, framework๋กœ์„œ ๊ตฌํ˜„๋œ๋‹ค. ์ด framework๋Š” ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด ํ”Œ๋žซํผ์— ๋Œ€ํ•ด Choices์— ๋Œ€ํ•œ porting์„ ์ง€์›ํ•œ๋‹ค. ์ด ๋‘ ์„œ๋ธŒ์‹œ์Šคํ…œ์€ '๋Œ€ํ‘œ์ž'๋ฅผ ๊ฐ€์ง„๋‹ค. (์ฆ‰, facade) ์ด ๋Œ€ํ‘œ์ž๋“ค์€ FileSystemInterface (storage) ์™€ Domain (address spaces)์ด๋‹ค.



์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ framework๋Š” Domain์„ facade๋กœ์„œ ๊ฐ€์ง„๋‹ค. Domain์€ address space๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. Domain์€ virtual addresses ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด, ํ™”์ผ, ์ €์žฅ์†Œ์˜ offset์— ๋งคํ•‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. Domain์˜ main operation์€ ํŠน์ • ์ฃผ์†Œ์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์‚ญ์ œํ•˜๋„ˆ๊ฐ€ page fault๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์•ž์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋ณด์—ฌ์ฃผ๋“ฏ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • MemoryObject ๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • MemoryObjectCache๋Š” ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ MemoryObject์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‰ฌํ•œ๋‹ค.
    MemoryObjectCache๋Š” ์‹ค์ œ๋กœ๋Š” ์บ์‰ฌ ์ •์ฑ…์„ ์ง€์—ญํ™”์‹œํ‚ค๋Š” Strategy Pattern์ด๋‹ค.
  • AddressTranslation ์€ address translation hardware ๋ฅผ ์บก์Аํ™”ํ•œ๋‹ค.

RepairFault ๋ช…๋ น์€ page fault ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์ผ์–ด๋‚ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. Domain์€ fault ๋ฅผ ์•ผ๊ธฐ์‹œํ‚จ ์ฃผ์†Œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ์ฒด๋ฅผ ์ฐพ์€๋’ค RepairFault์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ์ฒด๊ณผ ๊ด€๊ณ„๋œ ์บ์‰ฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค. Domain๋“ค์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ต์ฒดํ•จ์œผ๋กœ์„œ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ๋  ์ˆ˜ ์žˆ๋‹ค.

1.9. Related Patterns

AbstactFactory ๋Š” Facade๊ตฌํ˜„์‹œ ์„œ๋ธŒ์‹œ์Šคํ…œ ๋…๋ฆฝ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. Abstract Factory๋Š” ๋˜ํ•œ ํ”Œ๋žซํผ ๋น„๋…๋ฆฝ์  ํด๋ž˜์Šค๋ฅผ ๊ฐ์ถ”๊ธฐ ์œ„ํ•ด Facade์˜ ๋Œ€์•ˆ์œผ๋กœ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Mediator ๋Š” ์กด์žฌํ•˜๋Š” class๋“ค์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”์ƒํ™”์‹œํ‚จ๋‹ค๋Š” ์ ์—์„œ Facade์™€ ๋น„์Šทํ•˜๋‹ค. ํ•˜์ง€๋งŒ Mediator์˜ ๋ชฉ์ ์€ ์ •ํ•ด์ง€์ง€ ์•Š์€ ๋™๋ฃŒํด๋ž˜์Šค๊ฐ„์˜ ํ†ต์‹ ์„ ์ถ”์ƒํ™”์‹œํ‚ค๊ณ , ํ•ด๋‹น ๋™๋ฃŒํด๋ž˜์Šค๊ตฐ ์–ด๋””์—๋„ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ค‘์•™์œผ๋กœ ๋ชจ์€๋‹ค. Mediator์˜ ๋™๋ฃŒํด๋ž˜์Šค๋“ค์€ Mediator์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋ฉฐ ์„œ๋กœ ์ง์ ‘์ ์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋Œ€์‹  mediator๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•œ๋‹ค. ๋Œ€์กฐ์ ์œผ๋กœ facade๋Š” ๋‹จ์ง€ ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋ธŒ์‹œ์Šคํ…œ๋“ค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”์ƒํ™”์‹œํ‚ฌ ๋ฟ์ด๋‹ค. facade๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ƒˆ๋กœ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์„œ๋ธŒ์‹œ์Šคํ…œ ํด๋ž˜์Šค๋Š” facade์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋ณดํ†ต facade๋Š” ๋‹จ์ผ ์˜ค๋ธŒ์ ํŠธ๋กœ ์š”๊ตฌ๋œ๋‹ค. ๊ทธ๋ž˜์„œFacade ๊ฐ์ฒด๋Š” ์ข…์ข… SingletonPattern์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค.

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