# Composite Pattern
# ๋ชฉ์
compositie pattern์ ์ฌ์ฉ ๋ชฉ์ ์ object์ hierarchies๋ฅผ ํํํ๊ณ ๊ฐ๊ฐ์ object๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ฒ๋ฆฌํ ์ ์๊ฒํ๋ค.
์๋ Composite pattern์ class diagram์ ๋ณด์
์์ ๊ทธ๋ฆผ์ Leaf ํด๋์ค์ Composite ํด๋์ค๋ฅผ ๊ฐ์ interface๋ก ์ ์ดํ๊ธฐ ์ํด์ Component abstract ํด๋์ค๋ฅผ ์์ฑํ์๋ค.
์์ ๊ทธ๋ฆผ์ ์ฝ๋๋ก ํํ ํ์๋ค.
Component ํด๋์ค
public class Component {
public void operation() {
throw new UnsupportedOperationException();
}
public void add(Component component) {
throw new UnsupportedOperationException();
}
public void remove(Component component) {
throw new UnsupportedOperationException();
}
public Component getChild(int i) {
throw new UnsupportedOperationException();
}
}
Leaf ํด๋์ค์ Compositie ํด๋์ค๊ฐ ์์ํ๋ Component ํด๋์ค๋ก Leaf ํด๋์ค์์ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋ ํธ์ถ ์ exception์ ๋ฐ์์ํค๊ฒ ๊ตฌํํ์๋ค.
Leaf ํด๋์ค
public class Leaf extends Component {
String name;
public Leaf(String name) {
...
}
public void operation() {
.. something ...
}
}
Composite class
public class Composite extends Component {
ArrayList components = new ArrayList();
String name;
public Composite(String name) {
....
}
public void operation() {
Iterator iter = components.iterator();
while (iter.hasNext()) {
Component component = (Component)iter.next();
component.operation();
}
}
public void add(Component component) {
components.add(component);
}
public void remove(Component component) {
components.remove(component);
}
public Component getChild(int i) {
return (Component)components.get(i);
}
}
# ๊ตฌํ ์ ๊ณ ๋ คํด์ผํ ์ฌํญ
- ์์ ์ฝ๋๋ parent๋ง์ด child๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. ๊ตฌํ ์ด์ ์ child๊ฐ parent๋ฅผ ์ฐธ์กฐํด์ผ ํ๋์ง ๊ณ ๋ คํด์ผ ํ๋ค.
- ์ด๋ค ํด๋์ค๊ฐ children์ ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ?
# Children ๊ด๋ฆฌ๋ฅผ ์ํ 2๊ฐ์ง Composite pattern
์์ ์์ ๋ก Component ํด๋์ค์ add, removem getChild ๊ฐ์ method๊ฐ ์ ์ธ์ด ๋์ด์์ผ๋ฉฐ Transparency๋ฅผ ์ ๊ณตํ๋ค.
์ฅ์ : Leaf ํด๋์ค์ Composite ํด๋์ค๋ฅผ ๊ตฌ๋ถํ ํ์์์ด Component Class๋ก ์๊ฐํ ์ ์๋ค.
๋จ์ : Leaf ํด๋์ค๊ฐ chidren ๊ด๋ฆฌ ํจ์ ํธ์ถ ์ run time์ exception์ด ๋ฐ์ํ๋ค.
์ด์ ์์ ์์ children์ ๊ด๋ฆฌํ๋ ํจ์๋ฅผ Composite ํด๋์ค์ ์ ์ธ ๋์ด์์ผ๋ฉฐ Safety๋ฅผ ์ ๊ณตํ๋ค.
์ฅ์ : Leaf ํด๋์ค๊ฐ chidren ๊ด๋ฆฌ ํจ์ ํธ์ถ ์ compile time์ ๋ฌธ์ ๋ฅผ ํ์ธํ ์ ์๋ค.
๋จ์ : Leaf ํด๋์ค์ Composite ํด๋์ค๋ฅผ ๊ตฌ๋ถํ์ฌ์ผ ํ๋ค.
# ๊ด๋ จ ํจํด
# Decorator
๊ณตํต์ : composition์ด ์ฌ๊ท์ ์ผ๋ก ๋ฐ์ํ๋ค.
์ฐจ์ด์ : decorator ํจํด์ responsibilites๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ชฉํ์ด์ง๋ง composite ํจํด์ hierarchy๋ฅผ ํํํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
# Iterator
๊ณตํต์ : aggregate object์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๋ค.
โ - ์คํธ๋ ํฐ์ง ํจํด - SOLID โ