U E D R , A S I H C RSS

Gof/Composite

1. Composite

1.1. Intent

๋ถ€๋ถ„- „ฒด ๊ณ„ธต๊ตฌกฐ๋ฅผ ‘œ˜„•˜๊ธฐ œ„•ด ๊ฐฒด๋“ค„ Šธ๋ฆฌ๊ตฌกฐ๋กœ ๊ตฌ„•œ๋‹ค. Composite ๋Š” ด๋ผด–ธŠธ๋กœ •˜—ฌ๊ธˆ ๊ฐ๊ฐ˜ ๊ฐฒด๋“ค๊ณผ ๊ฐฒด˜ ๋ฌถŒ„ ๋™ผ•œ ๋ฐฉ๋ฒ•œผ๋กœ ฒ˜๋ฆฌ•˜๊ฒŒ •ดค€๋‹ค.

1.2. Motivation

๋“œ๋กœšฐ —๋””„ฐ๋‚˜ šŒ๋กœ„ค๊ณ„ ‹œŠค…œ๊ณผ ๊ฐ™€ ๊ทธ๋ž˜”ฝ –ด”Œ๋ฆฌผ€ด…˜€ ๋‹จˆœ•œ ปดฌ๋„ŒŠธ๋“ค˜ ฐจ›„„˜–ด„œ ๋ณตžก•œ ๋„‘œ๋“ค„ ๋งŒ๋“ค–ด๋‚ด๋Š”๋ฐ ดšฉ๋œ๋‹ค. ‚ฌšฉž๋Š” ๋” ฐ ปดฌ๋„ŒŠธ๋“ค„ ˜•„•˜๊ธฐ œ„•ด ปดฌ๋„ŒŠธ๋“ค„ ๊ทธ๋ฃน™”•  ˆ˜ žˆ๊ณ , ๋” ฐ ปดฌ๋„ŒŠธ๋“ค„ ˜•„•˜๊ธฐ œ„•ด ๋˜ ๊ทธ๋ฃน™” •  ˆ˜ žˆ๋‹ค. ๋‹จˆœ•œ ๊ตฌ˜„๋ฐฉ๋ฒ•œผ๋กœ๋Š” Text ๋‚˜ Line ๊ฐ™€ ๊ทธ๋ž˜”ฝ˜ ๊ธฐ๋ณธš”†Œ๋“ค— ๋Œ€•œ ด๋ž˜Šค๋“ค„  •˜•œ ๋’ค, ด๋Ÿฌ•œ ๊ธฐ๋ณธš”†Œ๋“ค— ๋Œ€•ด ปจ…Œด๋„ˆ —ญ• „ •˜๋Š” ๋‹ค๋ฅธ ด๋ž˜Šค— ถ”๊ฐ€•˜๋Š” ๋ฐฉ๋ฒ•ด žˆ๋‹ค.

•˜ง€๋งŒ, ด๋Ÿฌ•œ  ‘๊ทผ๋ฐฉ๋ฒ•—๋Š” ๋ฌธ œ ด žˆ๋‹ค. ๋น„๋ก ๋Œ€๋ถ€๋ถ„˜ ‹œ๊ฐ„๋™•ˆ ‚ฌšฉž๊ฐ€ ๊ฐœ๊ฐœ˜ ๊ฐฒด๋“ค„ ๋™ผ•˜๊ฒŒ ทจ๊ธ‰•œ๋‹ค •˜๋”๋ผ๋„, ด๋Ÿฌ•œ ด๋ž˜Šค๋“ค„ ดšฉ•˜๋Š” ฝ”๋“œ๋Š” ๋ฐ˜๋“œ‹œ ๊ธฐ๋ณธ๊ฐฒด™€ ปจ…Œด๋„ˆ ๊ฐฒด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ทจ๊ธ‰•˜—ฌ ฝ”๋”ฉ•ด•ผ •œ๋‹ค๋Š”  ด๋‹ค. ด๋Ÿฌ•œ ๊ฐฒด๋“ค˜ ๊ตฌ๋ณ„€ –ด”Œ๋ฆฌผ€ด…˜„ ๋ณตžก•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. CompositePattern€ ๊ฐฒด๋“ค— ๋Œ€•œ žฌ๊ท€  กฐ•ฉ ๋ฐฉ๋ฒ•„ „œˆ •จœผ๋กœ„œ, ด๋ผด–ธŠธ๋“ค๋กœ •˜—ฌ๊ธˆ ด๋Ÿฌ•œ ๊ตฌ๋ถ„„ •  •„š”๊ฐ€ —†๋„๋ก •ดค€๋‹ค.


CompositePattern˜ •ต‹ฌ€ ๊ธฐ๋ณธš”†Œ๋“ค๊ณผ ๊ธฐ๋ณธš”†Œ๋“ค˜ ปจ…Œด๋„ˆ๋ฅผ ๋‘˜ ๋‹ค ‘œ˜„•˜๋Š” ถ”ƒ ด๋ž˜Šค— žˆ๋‹ค. ๊ทธ๋ž˜”ฝ ‹œŠค…œ—„œ —ฌ๊ธฐ Graphic class๋ฅผ ˜ˆ๋กœ ๋“ค ˆ˜ žˆ๊ฒ ๋‹ค. Graphic € Draw ™€ ๊ฐ™€ ๊ทธ๋ž˜”ฝ ๊ฐฒด๋“ค„ ๊ตฌฒด™”•˜๋Š” ๋ช…๋ น๋“ค„ „ –ธ•œ๋‹ค. ๋˜•œ Graphic € Graphic ˜ ž‹ด๋ž˜Šค๋“ค (tree ๊ตฌกฐ—„œ˜ parent-child ๊ด€๊ณ„)— ๋Œ€•ด  ‘๊ทผ•˜๊ณ  ๊ด€๋ฆฌ•˜๋Š” ๋ช…๋ น๋“ค๊ณผ ๊ฐ™€ ๋ชจ๋“  composite ๊ฐฒด๋“คด ๊ณตœ •˜๋Š” ๋ช…๋ น–ด๋“ค„ „ –ธ•œ๋‹ค.

Line, Rectangle, Text ™€ ๊ฐ™€ „œ๋ธŒ ด๋ž˜Šค๋“ค€ (•ž˜ class diagram ฐธกฐ) ๊ธฐ๋ณธ ๊ทธ๋ž˜”ฝ ๊ฐฒด๋“ค„  •˜•œ๋‹ค. ด๋Ÿฌ•œ ด๋ž˜Šค๋“ค€ ๊ฐ๊ฐ „ ด๋‚˜ ‚ฌ๊ฐ˜•, …ŠคŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” 'Draw' operation„ ๊ตฌ˜„•œ๋‹ค. ๊ธฐ๋ณธ ธ ๊ทธ๋ž˜”ฝ ๊ตฌ„š”†Œ๋“ค€ ž‹š”†Œ๋“ค„ ๊ฐ€ง€ง€ •Šœผ๋ฏ€๋กœ, ด „œ๋ธŒ ด๋ž˜Šค๋“ค€ ž‹š”†Œ๊ณผ ๊ด€๋ จ๋œ ๋ช…๋ น๋“ค„ ๊ตฌ˜„•˜ง€ •Š๋Š”๋‹ค.

Picture ด๋ž˜Šค๋Š” Graphic ๊ฐฒด— ๋Œ€•œ ฌ•จ๊ด€๊ณ„๋ฅผ  •˜•œ๋‹ค. Picture ๋Š” Picture˜ children˜ Draw ๋ฉ”†Œ๋“œ๋ฅผ ˜ธถœ•˜๊ฒŒ๋” Draw ๋ฉ”†Œ๋“œ๋ฅผ ๊ตฌ˜„•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Picture๋Š” child™€ ๊ด€๋ จ•œ ๋ช…๋ น–ด๋“ค„ •Œ๋งž๊ฒŒ ๊ตฌ˜„•œ๋‹ค. Picture ธ„Ž˜ดŠค๋Š” Graphic˜ ธ„Ž˜ดŠค๋ฅผ ˜•„•˜๋ฏ€๋กœ, Picture ๊ฐฒด๋Š” ๋‹ค๋ฅธ Pricture๋“ค„ žฌ๊ท€ œผ๋กœ กฐ•ฉ•  ˆ˜ žˆ๋‹ค.

๋‹คŒ ๋‹คด–ด๊ทธ๋žจ€ žฌ๊ท€ œผ๋กœ Graphic ๊ฐฒด๋“คด กฐ•ฉ๋œ ผ๋ฐ˜ ธ composite ๊ฐฒด˜ ๊ตฌกฐ๋ฅผ ๋ณด—ฌค€๋‹ค.


1.3. Applicability

๋‹คŒ๊ณผ ๊ฐ™€ ๊ฒฝšฐ— CompositePattern „ ดšฉ•  ˆ˜ žˆ๋‹ค.
  • ๊ฐฒด๋“ค˜ ๋ถ€๋ถ„- „ฒด ๊ณ„ธต ๊ตฌกฐ๋ฅผ ‘œ˜„•˜๊ณ  ‹ถ„๋•Œ
  • ด๋ผด–ธŠธ๋“คด ๊ฐœ๊ฐœ๋ณ„ ๊ฐฒด๋“ค๊ณผ ๊ฐฒด๋“ค˜ กฐ•ฉ๋“ค˜ ฐจด — ‹ ๊ฒฝ“ฐง€ •Š๋„๋ก •˜๊ณ  ‹ถ„ ๊ฒฝšฐ. Composite๋ฅผ ดšฉ•จœผ๋กœจ, ด๋ผด–ธŠธ๋“ค€ composite ๊ตฌกฐ˜ ๋ชจ๋“  ๊ฐฒด๋“ค„ ๋™๋“•˜๊ฒŒ ทจ๊ธ‰•  ๊ฒƒด๋‹ค.

1.4. Structure


A typical Composite object structure might look like this:
ผ๋ฐ˜ ธ Composite ๊ฐฒด๊ตฌกฐ๋Š” ๋‹คŒ๊ณผ ๊ฐ™€ ๋ชจŠต„ ๋ˆ๋‹ค.

1.5. Participants

  • Component (Graphic)
    • composition —˜ ๊ฐฒด๋“ค— ๋Œ€•œ ธ„Ž˜ดŠค๋ฅผ „ –ธ•œ๋‹ค.
    • ๋ชจ๋“  ด๋ž˜Šค๋“ค—˜ ๊ธฐ๋ณธ ธ ธ„Ž˜ดŠค— ๋Œ€•œ ๊ธฐ๋ณธ –‰œ„๋ฅผ ๊ตฌ˜„•œ๋‹ค.
    • ž‹ ปดฌ๋„ŒŠธ๋“ค„  ‘๊ทผ•˜๊ณ  ๊ด€๋ฆฌ•˜๊ธฐ œ„•œ ธ„Ž˜ดŠค๋ฅผ „ –ธ•œ๋‹ค.
    • (optional) žฌ๊ท€ ๊ตฌกฐ—„œ˜ •ด๋‹น ปดฌ๋„ŒŠธ˜ ๋ถ€๋ชจ ด๋ž˜Šค๋กœ  ‘๊ทผ•˜๊ธฐ œ„•œ ธ„Ž˜ดŠค๋ฅผ  •˜•˜๊ณ ,   ˆ•˜๊ฒŒ ๊ตฌ˜„•œ๋‹ค.
  • Leaf (Rectangle, Line, Text, etc.)
    • composition˜ leaf ๊ฐฒด๋ฅผ ‘œ˜„•œ๋‹ค. leaf ๋Š” children๋ฅผ ๊ฐ€ง€ง€ •Š๋Š”๋‹ค.
    • composition ˜ ๊ธฐ๋ณธ ๊ฐฒด๋“ค˜ –‰œ„๋ฅผ  •˜•œ๋‹ค.
  • Composite (Picture)
    • children„ ๊ฐ€ง€๋Š” ปดฌ๋„ŒŠธ๋“ค„ œ„•œ –‰œ„๋ฅผ  •˜•œ๋‹ค.
    • ž‹ ปดฌ๋„ŒŠธ๋“ค„  €žฅ•œ๋‹ค.
    • Component ธ„Ž˜ดŠคค‘ ž‹ปดฌ๋„ŒŠธ ๊ด€๋ จ ๋ช…๋ น๋“ค„ ๊ตฌ˜„•œ๋‹ค.
  • Client
    • Component˜ ธ„Ž˜ดŠค๋ฅผ †ต•ด composition˜ ๊ฐฒด๋“ค„ กฐž‘•œ๋‹ค.

1.6. Collaborations

  • ด๋ผด–ธŠธ๋“ค€ Component ด๋ž˜Šค˜ ธ„Ž˜ดŠค๋ฅผ ดšฉ, composite ๊ตฌกฐ˜ ๊ฐฒด๋“ค๊ณผ ƒ˜ธž‘šฉ„ •œ๋‹ค. ๋งŒผ ƒ˜ธž‘šฉ•˜๋Š” ๊ฐฒด๊ฐ€ Leafธ ๊ฒฝšฐ, •ด๋‹น š”ฒญ€ ง ‘ œผ๋กœ ฒ˜๋ฆฌ๋œ๋‹ค. ๋งŒผ ƒ˜ธž‘šฉ•˜๋Š” ๊ฐฒด๊ฐ€ Compositeธ ๊ฒฝšฐ, Composite๋Š” •ด๋‹น š”ฒญ„ ž‹ ปดฌ๋„ŒŠธ๋“ค—๊ฒŒ  „๋‹ฌ•˜๋Š”๋ฐ, ž‹ ปดฌ๋„ŒŠธ๋“ค—๊ฒŒ •ด๋‹น š”ฒญ„  „๋‹ฌ•˜๊ธฐ  „ ๋˜๋Š” ›„— ถ”๊ฐ€ ธ ๋ช…๋ น๋“ค„ ˆ˜–‰•  ˆ˜ žˆ๋‹ค.

1.7. Consequences

CompositePattern €
  • ๊ธฐ๋ณธ ๊ฐฒด๋“ค๊ณผ ๋ณต•ฉ ๊ฐฒด๋“ค๋กœ ๊ตฌ„๋œ ด๋ž˜Šค ๊ณ„ธต ๊ตฌกฐ๋ฅผ  •˜•œ๋‹ค. (ƒ†๊ด€๊ณ„๊ฐ€ •„๋‹˜. —ฌ๊ธฐ„œ๋Š” ผข…˜ data-structure˜ ๊ด€ ) ๊ธฐ๋ณธ ๊ฐฒด๋“ค€ ๋” ๋ณตžก•œ ๊ฐฒด๋“ค„ ๊ตฌ„•  ˆ˜ žˆ๊ณ , ๊ณ„† ด๊ณ  žฌ๊ท€ œผ๋กœ กฐ•ฉ๋  ˆ˜ žˆ๋‹ค. ด๋ผด–ธŠธ ฝ”๋“œ๊ฐ€ ๊ธฐ๋ณธ ๊ฐฒด๋ฅผ ›• ๋•Œ –ด๋””„œ๋“ ง€ ๋ณต•ฉ ๊ฐฒด๋ฅผ ทจ•  ˆ˜ žˆ๋‹ค.
  • ด๋ผด–ธŠธ๋ฅผ ๋‹จˆœ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ด๋ผด–ธŠธ๋Š” ๊ฐ๊ฐ˜ ๊ฐฒด™€ ๋ณต•ฉ ๊ตฌกฐฒด๋ฅผ ๋™๋“•˜๊ฒŒ ทจ๊ธ‰•  ˆ˜ žˆ๋‹ค. ด๋ผด–ธŠธ๋Š” ๊ทธ๋“คด ๋‹ค๋ฃจ๋ ค๋Š” ๊ฐฒด๊ฐ€ Composite ธง€ Leaf ธง€ •Œ •„š”๊ฐ€ —†๋‹ค. ด๋Ÿฌ•จ€ composition „  •˜•˜๋Š” ด๋ž˜Šค๋“ค— ๋Œ€•ด ƒ๊ด€—†ด •จˆ˜๋“ค„ ๋‹จˆœ•˜๊ฒŒ •ดค€๋‹ค.
  • ƒˆ๋กœšด ข…๋ฅ˜˜ ปดฌ๋„ŒŠธ๋“ค„ ถ”๊ฐ€•˜๊ธฐ ‰ฝ๊ฒŒ •ดค€๋‹ค. ƒˆ๋กœ  •˜๋œ Composite ๋‚˜ Leaf ˜ „œ๋ธŒด๋ž˜Šค๋“ค€ ž๋™ œผ๋กœ ˜„žฌ˜ ๊ตฌกฐ๋“ค๊ณผ ด๋ผด–ธŠธ ฝ”๋“œ๋“ค๊ณผ ž‘šฉ•œ๋‹ค. ด๋ผด–ธŠธ ฝ”๋“œ๋“ค€ ƒˆ๋กœšด Component ด๋ž˜Šค๋“ค— ๋Œ€•ด„œ ˆ˜ •๋  •„š”๊ฐ€ —†๋‹ค.
  • ๋””žธ€ ข€ ๋” ผ๋ฐ˜™”‹œผœค€๋‹ค. ƒˆ๋กœšด ปดฌ๋„ŒŠธ๋ฅผ ถ”๊ฐ€•˜๊ธฐ ‰ฝ๋‹ค๋Š”  ด ๋‹จ œผ๋กœ ž‘šฉ•˜๋Š” ๊ฒฝšฐ๋Š” composite˜ ปดฌ„Šธ๋“ค๋กœ •˜—ฌ๊ธˆ  œ•œ„ ๋‘๊ธฐ ž˜๋“ค๋‹ค๋Š”  ด žˆ๋‹ค. ๋•Œ๋•Œ๋กœ Šน • ปดฌ๋„ŒŠธ๋“ค๋งŒ„ ๊ฐ€ง€๋Š” composite๋ฅผ ›•  ๋•Œ๊ฐ€ žˆ„ ๊ฒƒด๋‹ค. Composite ธ ๊ฒฝšฐ, ด๋Ÿฌ•œ  œ•œ„ ๊ฐ• œ๋„ ๋‘๊ธฐ œ„•ด type system— ˜กด•  ˆ˜ —†๊ฒŒ ๋œ๋‹ค. ๊ทธ ๋Œ€‹  ‹ค‹œ๊ฐ„ ฒดฌ๋ฅผ ดšฉ•ด•ผ •  ๊ฒƒด๋‹ค.

1.8. Implementation

CompositePattern„ ๊ตฌ˜„•  ๋•Œ ๊ณ ๋ ค•ด•ผ •  —ฌ๋Ÿฌ๊ฐ€ง€ ‚ฌ•ญ๋“คด žˆ๋‹ค.
  1. ๋ถ€๋ชจ˜ ฐธกฐž๋ฅผ ๋ช…‹œ•˜๋ผ.
  2. ปดฌ๋„ŒŠธ๋“ค˜ ๊ณตœ 
  3. Component ธ„Ž˜ดŠค˜ ตœ๋Œ€™”
  4. Child ๊ด€๋ฆฌ ๋ช…๋ น–ด๋“ค˜ „ –ธ
  5. Component๋Š” ปดฌ๋„ŒŠธ๋“ค˜ ๋ฆฌŠคŠธ๊ตฌกฐ๋ฅผ ๊ตฌ˜„•ด•ผ •˜๋Š”๊ฐ€?
  6. Child ordering
  7. „๋Šฅ–ฅƒ„ œ„•œ caching
  8. ˆ„๊ฐ€ ปดฌ๋„ŒŠธ๋“ค„ ‚ญ œ•ด•ผ •˜๋Š”๊ฐ€?
  9. ปดฌ๋„ŒŠธ๋“ค„  €žฅ•˜๊ธฐ œ„•œ ๊ฐ€žฅ ข‹€ ž๋ฃŒ๊ตฌกฐ๋Š” ๋ฌด—‡ธ๊ฐ€?

1.9. Sample Code

computer ™€ Šค…Œ๋ ˆ˜ค ปดฌ๋„ŒŠธ๋“ค๊ณผ ๊ฐ™€ žฅน˜๋“ค (Equipment) ๋Š” ๋ณด†ต ๊ฒฉ๋‚ฉ ๊ณ„ธต˜ ๋ถ€๋ถ„- „ฒด ‹œผ๋กœ ๊ตฌ„๋œ๋‹ค. ˜ˆ๋ฅผ ๋“ค–ด „€‹œ (chassis) ๋Š” ๋“œ๋ผด๋ธŒ๋“ค(•˜๋“œ๋””Šคฌ ๋“œ๋ผด๋ธŒ, ”Œ๋กœ”ผ ๋””Šคฌ ๋“œ๋ผด๋ธŒ ๋“) ๊ณผ ‰Œ๋“ค (ปด“จ„ผ€ดŠค˜ ๋„“€ Œ๋“ค) „ ฌ•จ•˜๊ณ , ๋ฒ„Šค๋Š” นด๋“œ๋“ค„ ฌ•จ•  ˆ˜ žˆ๊ณ , บ๋น„„€ „€‹œ™€ ๋ฒ„Šค ๋“๋“„ ฌ•จ•  ˆ˜ žˆ๋‹ค. ด๋Ÿฌ•œ ๊ตฌกฐ๋Š” ž—ฐŠค๋Ÿฝ๊ฒŒ CompositePatternœผ๋กœ ๋ชจ๋ธ๋ง๋  ˆ˜ žˆ๋‹ค.

Equipment ด๋ž˜Šค๋Š” ๋ถ€๋ถ„- „ฒด ๊ณ„ธต๊ตฌกฐ˜ ๋ชจ๋“  equipment๋“ค„ œ„•œ ธ„Ž˜ดŠค๋ฅผ  •˜•œ๋‹ค.
~cpp 
class Equipment {
public:
	virtual ~Equipment ();

	const char* Name () { return _name; }

	virtual Watt Power ();
	virtual Currency NetPrice ();
	virtual Currency DiscountPrice ();

	virtual void Add (Equipment* );
	virtual void Remove (Equipment* );
	virtual Iterator<Equipment*>* CreateIterator ();

protected:
	Equipment (const char*);

private:
	const char* _name;
};

Equipment ๋Š”  „›†Œ๋ชจ๋Ÿ‰ (power consumption)๊ณผ ๊ฐ€๊ฒฉ(cost) ๋“๊ณผ ๊ฐ™€ equipment˜ ผ๋ถ€˜ †„๋“ค„ ๋ฆฌ„•˜๋Š” ๋ช…๋ น๋“ค„ „ –ธ•œ๋‹ค. „œ๋ธŒด๋ž˜Šค๋“ค€ •ด๋‹น žฅ๋น„˜ ๊ตฌฒด  ข…๋ฅ˜— ๋”ฐ๋ผ ด ๋ช…๋ น๋“ค„ ๊ตฌ˜„•œ๋‹ค. Equipment ๋Š” ๋˜•œ Equipment˜ ผ๋ถ€๋ฅผ  ‘๊ทผ•  ˆ˜ žˆ๋Š” Iterator ๋ฅผ ๋ฆฌ„•˜๋Š” CreateIterator ๋ช…๋ น„ „ –ธ•œ๋‹ค. ด ๋ช…๋ น˜ ๊ธฐ๋ณธ ธ ๊ตฌ˜„๋ถ€๋Š” ๋น„–ดžˆ๋Š” ง‘•ฉ— ๋Œ€•œ NullIterator ๋ฅผ ๋ฆฌ„•œ๋‹ค.

Equipment ˜ „œ๋ธŒด๋ž˜Šค๋Š” ๋””Šคฌ ๋“œ๋ผด๋ธŒ๋‚˜ IC šŒ๋กœ, Šคœ„น˜ ๋“„ ‘œ˜„•˜๋Š” Leaf ด๋ž˜Šค๋ฅผ ฌ•จ•  ˆ˜ žˆ๋‹ค.
~cpp 
class FloppyDisk : public Equipment {
public:
	FloppyDisk (const char*);
	virtual ~FloppyDisk ();
	virtual Watt Power ();
	virtual Currency NetPrice ();
	virtual Currency DiscountPrice ();
};

CompositeEquipment ๋Š” ๋‹ค๋ฅธ equipment๋ฅผ ฌ•จ•˜๋Š” equipment˜ ๊ธฐ๋ณธด๋ž˜Šคด๋‹ค. ด๋Š” ๋˜•œ Equipment ˜ „œ๋ธŒด๋ž˜Šคด๋‹ค.

~cpp 
class CompositeEquipment : public Equipment {
public:
	virtual ~CompositeEquipment ();

	virtual Watt Power ();
	virtual Currency NetPrice ();
	virtual Currency DiscountPrice ();

	virtual void Add (Equipement* );
	virtual void Remove (Equipment* );
	virtual Iterator<Equipment*>* CreateIterator ();

protected:
	CompositeEquipment (const char*);
private:
	List<Equipment*>_equipment;
};

CompositeEquipment ๋Š” sub-equipment —  ‘๊ทผ•˜๊ณ  ๊ด€๋ฆฌ•˜๊ธฐ œ„•œ ๋ช…๋ น๋“ค„  •˜•œ๋‹ค. ด ๋ช…๋ น๋“คธ Add ™€ Remove๋Š” _equipment ๋ฉค๋ฒ„—  €žฅ๋œ equipment ˜ ๋ฆฌŠคŠธ๋กœ๋ถ€„ฐ equipment ๋ฅผ ถ”๊ฐ€•˜๊ฐ๋‚˜ ‚ญ œ•œ๋‹ค. CreateIterator ๋ช…๋ น€ ด ๋ฆฌŠคŠธ๋“ค„ ƒƒ‰•  ˆ˜ žˆ๋Š” iterator(๊ตฌฒด œผ๋กœ ListIterator˜ ธŠค„Šค) ๋ฅผ ๋ฆฌ„•œ๋‹ค.

NetPrice ˜ ๊ธฐ๋ณธ ๊ตฌ˜„๋ถ€๋Š” sub-equipment ˜ net price˜ •ฉ„ ๊ตฌ•˜๊ธฐ œ„•ด CreateIterator๋ฅผ ดšฉ•  ๊ฒƒด๋‹ค.
~cpp 
Currency CompositeEquipment::NetPrice () {
	Iterator<Equipment*>* i = CreateIterator ();
	Currency total = 0;

	for (i->first (); !i->IsDone (); i->Next ()) {
		total += i->CurrentItem ()->NetPrice ();
	}
	delete i;
	return total;
}

ž, šฐ๋ฆฌ๋Š” ปด“จ„„€‹œ๋ฅผ Chassis ๋ผ ๋ถˆ๋ฆฌ๋Š” CompositeEquipment˜ „œ๋ธŒด๋ž˜Šค๋กœ„œ ‘œ˜„•  ˆ˜ žˆ๋‹ค. Chassis๋Š” CompositeEquipment๋กœ๋ถ€„ž‹-๊ด€๋ จ ๋ช…๋ น–ด๋“ค„ ƒ†๋ฐ›๋Š”๋‹ค.
~cpp 
class Chassis : public CompositeEquipment {
public:
	Chassis (const char*);
	virtual ~Chassis ();

	virtual Watt Power ();
	virtual Currency NetPrice ();
	virtual Currency DiscountPrice ();
};

šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จ•œ ๋ฐฉ๋ฒ•œผ๋กœ Cabinet ๋‚˜ Bus ™€ ๊ฐ™€ ๋‹ค๋ฅธ equipment ปจ…Œด๋„ˆ๋ฅผ  •˜•  ˆ˜ žˆ๋‹ค. ด๋กœ„œ šฐ๋ฆฌ๊ฐ€ ๊ฐœธšฉ ปด“จ„— equipment๋“ค„ กฐ๋ฆฝ•˜๊ธฐ œ„•ด (๊ฝค ๊ฐ„๋‹จ•˜๊ฒŒ) •„š”๋กœ •˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“คด ฃผ–ดกŒ๋‹ค.
~cpp 
Cabinet* cabinet = new Cabinet ("PC Cabinet");
Chassis* chassis = new Chassis ("PC Chassis");

cabinet->Add (chassis);

Bus* bus = new Bus ("MCA Bus");
bus->Add (new Card("16Mbs Token Ring"));

chassis->Add (bus);
chassis->Add (new FloppyDisk ("3.5in Floppy"));

cout << "The net price is " << chassis->NetPrice () << endl;

1.10. Known Uses

CompositePattern˜ ˜ˆ๋Š” ๊˜ ๋ชจ๋“  ๊ฐฒดง€–ฅ ‹œŠค…œ—„œ ฐพ„ ˆ˜ žˆ๋‹ค. Smalltalk ˜ Model/View/Container KP88 ˜ original View ด๋ž˜Šค๋Š” Compositeด๋ฉฐ, ET++ (VObjects WGM88) ด๋‚˜ InterViews (Styles LCI+92, Graphics VL88, Glyphs CL90)๋“˜ ๋Œ€๋ถ€๋ถ„˜ œ  € ธ„Ž˜ดŠค ˆ‚ท๊ณผ ”„๋ ˆž„›Œฌ๊ฐ€ •ด๋‹น ๊ณผ •„ ๋”ฐ๋ฅธ๋‹ค. Model/View/Controller ˜ original View—„œ ฃผ๋ชฉ• ๋งŒ•œ  € subview ˜ ง‘•ฉ„ ๊ฐ€„๋‹ค๋Š” ๊ฒƒด๋‹ค. ๋‹ค‹œ ๋ง•˜๋ฉด, View๋Š” Component class ดž Composite class ด๋‹ค. Smalltalk-80 ˜ Release 4.0 € View ™€ CompositeView ˜ „œ๋ธŒด๋ž˜Šค๋ฅผ ๊ฐ€ง€๋Š” VisualComponent ด๋ž˜Šค๋กœ Model/View/Controller ๋ฅผ ๋ณ€๊ฒฝ–ˆ๋‹ค.

RTL Smalltalk ปดŒŒผ๋Ÿฌ ”„๋ ˆž„›Œฌ JML92 ๋Š” CompositePattern„„๋ฆฌ ‚ฌšฉ•œ๋‹ค. RTLExpression € parse tree๋ฅผ œ„•œ Component ด๋ž˜Šคด๋‹ค. RTLExpression € BinaryExpression ๊ณผ ๊ฐ™€ „œ๋ธŒด๋ž˜Šค๋ฅผ ๊ฐ€ง€๋Š”๋ฐ, ด๋Š” RTLExpression ๊ฐฒด๋“ค„ ž‹œผ๋กœ ฌ•จ•œ๋‹ค. ด ด๋ž˜Šค๋“ค€ parse tree๋ฅผ œ„•ด composite ๊ตฌกฐ๋ฅผ  •˜•œ๋‹ค. RegisterTransfer ๋Š” ”„๋กœ๊ทธ๋žจ˜ Single Static Assignment(SSA) ˜•ƒœ˜ ค‘๊ฐ„๋ฌผ„ œ„•œ Component ด๋ž˜Šคด๋‹ค. RegisterTransfer ˜ Leaf „œ๋ธŒด๋ž˜Šค๋“ค€ ๋‹คŒ๊ณผ ๊ฐ™€ ๋‹ค๋ฅธ ˜•ƒœ˜ static assignment ๋ฅผ  •˜•œ๋‹ค.
  • ๋‘๊ฐœ˜ ๋ ˆง€Šค„ฐ๋กœ ๋ช…๋ น„ ˆ˜–‰•˜๊ณ  „ธ๋ฒˆงธ ๋ ˆง€Šค„ฐ๋กœ ๊ฒฐ๊ณผ๊ฐ’„ • ๋‹น•˜๋Š” ๊ธฐ๋ณธ ธ assignment
  • source register ๋ฅผ ๊ฐ€ง€ง€๋งŒ, destination register ๋ฅผ ๊ฐ€ง€ง€ •Š๋Š”, register๊ฐ€ •ด๋‹น ๋ฃจ‹ดด ๋ฆฌ„ด ๋œ ๋’ค— ดšฉ๋˜๋Š” assignment
  • destination register ๋ฅผ ๊ฐ€ง€ง€๋งŒ, source register ๋ฅผ ๊ฐ€ง€ง€ •Š๋Š”, •ด๋‹น ๋ฃจ‹ดด ‹œž‘๋˜๊ธฐ  „— register ๊ฐ€ assign๋˜๋Š” assignment

Another subclass, RegisterTransferSet, is a Composite class for representing assignments that change several registers at once.
๋˜ ๋‹ค๋ฅธ „œ๋ธŒด๋ž˜Šค๋กœ„œ RegisterTransferSetด žˆ๋‹ค. RegisterTransferSet ๋Š” •œ๋ฒˆ— —ฌ๋Ÿฌ register๋ฅผ ๋ณ€๊ฒฝ•˜๋Š” assignment๋ฅผ ‘œ˜„•˜๊ธฐ œ„•œ Composite ด๋ž˜Šคด๋‹ค.

Another example of this pattern occurs in the financial domain, where a portfolio aggregates individual assets. You can support complex aggregations of assets by implementing a portfolio as a Composite that conforms to the interface of an individual asset BE93.

CompositePattern˜ ๋˜๋‹ค๋ฅธ ˜ˆ๋Š” ๊ฐ๊ฐ˜ ž‚ฐ๋“ค„ ฌ•จ•˜๋Š” portfolioธ financial domain —„œ ๋‚˜ƒ€๋‚œ๋‹ค. portfolio ๋ฅผ ๊ฐ๊ฐ˜ asset ˜ ธ„Ž˜ดŠค๋ฅผ ๊ตฌ„•˜๋Š” Composite ๋กœ ๊ตฌ˜„•จœผ๋กœจ ๋ณตžก•œ asset˜ ฌ•จ๊ด€๊ณ„๋ฅผ ง€›•  ˆ˜ žˆ๋‹ค.

CommandPattern€ MacroCommand Composite ด๋ž˜Šค๋กœ Command ๊ฐฒด๋“คด กฐ•ฉ๋˜๊ณ  ๋‚˜—ด•˜๋Š” ๋ฐฉ๋ฒ•— ๋Œ€•ด „œˆ •œ๋‹ค.

1.11. Related Patterns

  • ข…ข… ปดฌ๋„ŒŠธ-๋ถ€๋ชจ —ฐ๊ฒฐ€ ChainOfResponsibilityPattern— ดšฉ๋œ๋‹ค.
  • DecoratorPattern € ข…ข… Composite™€ •จ๊ป˜ ดšฉ๋œ๋‹ค. descorator ™€ composite ๊ฐ€ •จ๊ป˜ ดšฉ๋ ๋•Œ, ๊ทธ๊ฒƒ๋“ค€ ๋ณด†ต ๊ณต†ต๋œ ๋ถ€๋ชจ ด๋ž˜Šค๋ฅผ ๊ฐ€ˆ ๊ฒƒด๋‹ค. ๊ทธ๋Ÿฌ•œ ๊ฒฝšฐ decorator๋Š” Add, Remove, GetChild ™€ ๊ฐ™€ Compoent ˜ ธ„Ž˜ดŠค๋ฅผ ง€›•ด•ผ •œ๋‹ค.
  • FlyweightPattern lets you share components, but they can no longer refer to their parents.
  • FlyweightPattern € ปดฌ๋„ŒŠธ๋“ค„ ๊ณตœ •  ˆ˜ žˆ๋„๋ก •ดฃผง€๋งŒ, ๊ทธ๋“ค˜ ๋ถ€๋ชจ๊ฐฒด๋ฅผ ฐธกฐ•  ˆ˜ —†๋‹ค.
  • IteratorPattern € composite๋“ค„ ƒƒ‰•  ๋•Œ ดšฉ๋  ˆ˜ žˆ๋‹ค.
  • VisitorPattern€ ๋ช…๋ น๋“ค๊ณผ Composite ™€ Leaf ด๋ž˜Šค ‚ฌด๋ฅผ ๊ฐ€๋กœˆ๋Ÿฌ ๋ถ„ฌ๋  ˆ˜ žˆ๋Š” –‰œ„๋“ค„ ง€—ญ™”•œ๋‹ค.


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