๋ฐ์ํ
Composite Pattern
์ปดํฌ์งํธ ํจํด(Composite Pattern)์ ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ฌ ๋ถ๋ถ-์ ์ฒด ๊ณ์ธต์ ๊ตฌํํ๋ ํจํด์ ๋๋ค.
- ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ๋จ์ผ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ปดํฌ์งํธ ํจํด์ ๊ตฌ์กฐ ํจํด(Structural Pattern)์ ์ผ์ข ์ผ๋ก, ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ํ๋์ ๊ฐ์ฒด์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ํฉ๋๋ค.
- ์ปดํจํฐ์ ํ์ผ ์์คํ ์์๋ Directory ๋ผ๋ ๊ฒ์ด ์๊ณ , Directory์์๋ ํ์ผ์ด๋ ๋ค๋ฅธ ํ์ Directory๊ฐ ์๊ธฐ๋ ํฉ๋๋ค.
- ๋ง์น “์์ ์์ ์์” ๊ฐ์ ๊ตฌ์กฐ, ์ฆ ์ฌ๊ท์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
- Directory ์ํธ๋ฆฌ๋ฅผ ์ฐจ๋ก๋๋ก ์กฐ์ฌํ ๋, ๊ทธ๋ฆ๊ณผ ๋ด์ฉ๋ฌผ์ ๊ฐ์ ์ข ๋ฅ๋ก ์ทจ๊ธํ๋ฉด ํธ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ด ๊ทธ๋ฆ์ ๋ด์ฉ๋ฌผ๊ณผ ๋์ผ์ ํ์ฌ ์ฌ๊ท์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํ Design Pattern์ Composite Pattern ์ด๋ผ๊ณ ํฉ๋๋ค.
- Leaf์ ์ญํ : leaf๋ ๋ด์ฉ๋ฌผ์ ํ์ํ๋ ์ญํ ์ ํ๋ฉฐ ๋ด๋ถ์๋ ๋ค๋ฅธ๊ฒ์ ๋ฃ์ ์ ์์ต๋๋ค.
- Composite์ ์ญํ : ๊ทธ๋ฆ์ ๋ํ๋ด๋ ์ญํ ์ ํ๋ฉฐ leaf์ญํ ์ด๋ Composite ์ญํ ์ ๋ฃ์ ์ ์์ต๋๋ค.
- Component์ ์ญํ : leaf์ญํ ๊ณผ Composite ์ญํ ์ ๋์ผ์ํ๊ธฐ ์ํ ์ญํ ์ ํ๋ฉฐ, component๋ leaf์ญํ ๊ณผ composite ์ญํ ์ ๊ณตํต์ ์ธ ์์ ํด๋์ค๋ก ์คํํฉ๋๋ค.
- “Object์ ๊ทธ๋ฃน”๊ณผ “Object์ Single Instance”๊ฐ ๊ฐ์ ํ์ ์ผ๋ก ์ทจ๊ธ๋๋ ํจํด์ ๋๋ค.
- Composite Pattern์ ํตํด Object๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ํ๋์ Object๊ฐ ๊ทธ Object๊ฐ ๋ค์ด์๋ Group์ ๊ฐ์ ํ์ ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
- Group์ ๋ค๋ชจ ์นธ๋ค์ ๋ฆฌ์คํธ๋ก ์์ Object๊ฐ ๋ค์ด๊ฐ๋๋ค.
- ์ด ๋์ ๊ฐ์ ํ์ ์ผ๋ก ์ทจ๊ธํ๋ค๋ ๋ง์ ๋์ด ๊ฐ์ interface๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ๋ป์ ๋๋ค.
- Composite Pattern์์๋ ์ด๋ฌํ Base Interface๋ฅผ Component, ์์๋ฐ์ ๊ฐ์ฒด๋ฅผ Leaf, ์ด๋ฅผ ์์๋ฐ์ ๊ทธ๋ฃน์ Composite์ด๋ผ๊ณ ํฉ๋๋ค.
- Composite์์ List์๋ Component ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ๋๋ค.
- Component๊ฐ ๋ค์ด๊ฐ ์ ์๋ค๋ฉด ์ด ๋ฆฌ์คํธ ์์๋ ๊ฒฐ๊ตญ Leaf, Composite ๋ชจ๋ ๋ค์ด๊ฐ ์ ์์ต๋๋ค. (Component๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.)
- Component๋ฅผ ์์๋ฐ์ leaf์ composite์ Component์ ๊ฐ์ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค.
class Component:
def fn(self):
pass
class Leaf(Component):
def fn(self):
print('leaf')
class Composite(Component):
def __init__(self):
self.components = []
def add(self, component: Component):
self.components.append(component)
def fn(self):
print('composite')
for component in self.components:
component.fn()
- Component class
- Base Interface
- fn ํจ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- Leaf class
- Component๋ฅผ ์์๋ฐ์ต๋๋ค.
- fn์ ํตํด "leaf" ์ถ๋ ฅํฉ๋๋ค.
- Composite class
- Component๋ฅผ ์์๋ฐ์ต๋๋ค.
- Component ๊ฐ์ฒด์ ๋ฆฌ์คํธ์ธ components ๊ฐ ์กด์ฌํฉ๋๋ค.
- add(): components ๋ฆฌ์คํธ์ component ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
- fn์ "composite" ์ถ๋ ฅํ๊ณ components ๋ฆฌ์คํธ ๋ด๋ถ์ ์๋ element ํ๋์ฉ ๋ถ๋ฌ์ ๊ฐ ๊ฐ์ฒด์ ๋ํด fn ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
composite1 = Composite()
composite2 = Composite()
composite1.add(leaf1)
composite1.add(leaf2)
composite2.add(composite1)
composite2.fn()
- Composite Object์ธ composite1๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ทธ ์์ Leaf 2๊ฐ๋ฅผ ์ฝ์ ํฉ๋๋ค.
- Composite Object์ธ composite0๋ฅผ ์์ฑํฉ๋๋ค.
- composite0์ Leaf 1๊ฐ์ composite1์ ์์ ํ๊ณ ์์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก composite0์์ fn ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
composite
leaf
composite
leaf
leaf
- composite0 ์์ ์๋ ๋ชจ๋ Object์ ๋ํด์ fnํจ์๊ฐ ํธ์ถ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- ํธ๋ฆฌ ๊ตฌ์กฐ์์ ๋ฃจํธ๋ฅผ ๊ธฐ์ ์ผ๋ก ํจ์ fn์ ํธ์ถํ์ฌ ๊ทธ ์์ ๋ค์ด์๋ ๋ชจ๋ Object์ ๋ํด ํจ์ fn์ด ํธ์ถ๋๋ ํํ์ ๋๋ค.
Composite Pattern์ ์ฅ์ ์ ํธ๋ฆฌ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๋ณต์กํ ๋ ํธ๋ฆฌ ๋ฃจํธ์์ ํจ์ ํ๋๋ง ํธ์ถํ๋ฉด Composite Pattern์ ๋ฐ๋ผ์ Leaf๊น์ง ๊ทธ ํจ์๊ฐ ์๋์ผ๋ก ํธ์ถ๋ฉ๋๋ค.
Composite Pattern Example
class Animal:
def speak(self):
pass
class Cat(Animal):
def speak(self):
print("meow")
class Dog(Animal):
def speak(self):
print("bark")
class AnimalGroup(Animal):
def __init__(self):
self.animals = []
def add(self, animal: Animal):
self.animals.append(animal)
def speak(self):
print("group speaking..")
for animal in self.animals:
animal.speak()
- Animal class
- Base Interface
- speak ํจ์๋ฅผ ๊ฐ์ง๊ณ ์์ค๋น๋ค.
- Cat class
- Animal์ ์์๋ฐ์์ต๋๋ค.
- speak๋ฅผ ํตํด "meow" ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- Dog class
- Animal์ ์์ ๋ฐ์์ต๋๋ค.
- speak๋ฅผ ํตํด "bark" ์ ์ถ๋ ฅํฉ๋๋ค.
- AnimalGroup class
- Animal๋ฅผ ์์๋ฐ์์ต๋๋ค.
- Animal ๊ฐ์ฒด์ ๋ฆฌ์คํธ์ธ animals ์ด ์กด์ฌํฉ๋๋ค.
- add(): animals ๋ฆฌ์คํธ์ Animal ๊ฐ์ฒด ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
- speak(): "group speaking.." ์ถ๋ ฅํ๊ณ animals ๋ฆฌ์คํธ ๋ด๋ถ์ ์๋ element ํ๋์ฉ ๋ถ๋ฌ์ ๊ฐ ๊ฐ์ฒด์ ๋ํด speak ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
# ์ฌ์ฉ ์์
cat_group = AnimalGroup()
cat_group.add(Cat())
cat_group.add(Cat())
cat_group.add(Cat())
dog_group = AnimalGroup()
dog_group.add(Dog())
dog_group.add(Dog())
zoo = AnimalGroup()
zoo.add(cat_group)
zoo.add(dog_group)
zoo.speak()
- at_group์ AnimalGroup์ ๊ฐ์ฒด๋ก ๋ฆฌ์คํธ ํํ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- add ํจ์๋ฅผ ํตํด Cat ๊ฐ์ฒด 3๋ง๋ฆฌ ์ถ๊ฐํฉ๋๋ค.
- dog_group์ AnimalGroup์ ๊ฐ์ฒด๋ก ๋ฆฌ์คํธ ํํ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- add ํจ์๋ฅผ ํตํด Dog ๊ฐ์ฒด 2๋ง๋ฆฌ ์ถ๊ฐํฉ๋๋ค.
- zoo๋ AnimalGroup์ ๊ฐ์ฒด๋ก ๋ฆฌ์คํธ ํํ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- add ํจ์๋ฅผ ํตํด cat_group๊ณผ dog_group ์ ์ถ๊ฐํฉ๋๋ค.
- zoo์์ speak() ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
group speaking..
group speaking..
meow
meow
meow
group speaking..
bark
bark
- zoo์์ speak ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ทธ ๋ด๋ถ์ ๋ค์ด์๋ ๋ชจ๋ object์ ๋ํด์ speak ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
Composite Pattern์ ํต์ฌ์ Group๊ณผ Object๊ฐ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๋ฃจํธ์์๋ถํฐ ์์ํ์ฌ ํจ์๊ฐ ํธ๋ฆฌ์์ ์๋ ๋ชจ๋ ํจ์๋ก ํผ์ง๋ ๊ตฌ์กฐ์ ๋๋ค.
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Command Pattern - ์ปค๋งจ๋ ํจํด (0) | 2024.06.09 |
---|---|
[Design Pattern] Strategy Pattern - ์ ๋ต ํจํด (0) | 2024.06.08 |
[Design Pattern] Flyweight Pattern - ํ๋ผ์ด์จ์ดํธ ํจํด (0) | 2024.06.06 |
[Design Pattern] Bridge Pattern - ๋ธ๋ฆฟ์ง ํจํด (0) | 2024.06.06 |
[Design Pattern] Facade Pattern - ํ์ฌ๋ ํจํด (0) | 2024.06.06 |