์ปดํฌ์งํธ ํจํด(Composite Pattern)
์ปดํฌ์งํธ
OOP์์ ์ปดํฌ์งํธ๋ ํ๋ ์ด์์ ์ ์ฌํ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ์งํฉ ๊ฐ์ฒด๋ก ๋ชจ๋ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํ๋ธ๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฒด ๊ทธ๋ฃน์ ์กฐ์ํ๋ ๊ฒ์ฒ๋ผ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ ์ ์๋ค.
์ปดํฌ์งํธ ํจํด
์ปดํฌ์งํธ ํจํด์ ๋ณตํฉ ๊ฐ์ฒด๋ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋์ผํ๊ฒ ์ทจ๊ธํ๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ค. ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์์ฑํ์ฌ ์ ์ฒด-๋ถ๋ถ(whole-part) ๊ด๊ณ๋ฅผ ํํํ๋ค.
1. ๊ตฌํ
์ฌ์ฉ์๋ Leaf์ Composite ํด๋์ค๋ฅผ ์ง์ ์ฐธ์กฐํ์ง ์๊ณ , ๊ณตํต ์ธํฐํ์ด์ค Component๋ฅผ ์ฐธ์กฐํ๋ค.
1) Component
- ๋ชจ๋ Component๋ค์ ์ํ ์ถ์ํ๋ ๊ฐ๋ ์ด๋ค.
- Leaf์ Composite ํด๋์ค์ ์ธํฐํ์ด์ค์ด๋ค.
interface Graphic {
public void print();
}
2) Leaf
- Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- ๊ตฌ์ฒด ํด๋์ค๋ฅผ ๋ํ๋ธ๋ค.
class Ellipse implements Graphic {
public void print() {
System.out.println("Ellipse");
}
}
3) Composite
- Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
- ๊ตฌํ๋๋ ์์๋ค์ ๊ฐ์ง๊ณ ์ด๋ฌํ ์์๋ค์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฉ์๋(add, remove ๋ฑ)๋ฅผ ๊ตฌํํ๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ธํฐํ์ด์ค์ ์์ฑ๋ ๋ฉ์๋๋ ์์์๊ฒ ์์ํ๋ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
class CompositeGraphic implements Graphic {
// Collection of child graphics.
private List<Graphic> childGraphics = new ArrayList<Graphic>();
public void print() {
for (Graphic graphic : childGraphics) {
graphic.print();
}
}
public void add(Graphic graphic) {
childGraphics.add(graphic);
}
public void remove(Graphic graphic) {
childGraphics.remove(graphic);
}
}
4) Client
ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ง๋ค์ด์ง๋ฉด์ print()์ ๊ฐ์ด ๋จ์ผ ๊ฐ์ฒด์ ๋ณตํฉ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌ๋๋ ํํ๊ฐ ๋ง๋ค์ด์ง๋ค.
public class Program {
public static void main(String[] args) {
//Initialize four ellipses
Ellipse ellipse1 = new Ellipse();
Ellipse ellipse2 = new Ellipse();
Ellipse ellipse3 = new Ellipse();
Ellipse ellipse4 = new Ellipse();
//Initialize three composite graphics
CompositeGraphic graphic = new CompositeGraphic();
CompositeGraphic graphic1 = new CompositeGraphic();
CompositeGraphic graphic2 = new CompositeGraphic();
//Composes the graphics
graphic1.add(ellipse1); // children - leaf
graphic1.add(ellipse2); // children - leaf
graphic1.add(ellipse3); // children - leaf
graphic2.add(ellipse4); // children - leaf
graphic.add(graphic1); // children - composite
graphic.add(graphic2); // children - composite
//Prints the complete graphic (Four times the string "Ellipse").
graphic.print();
}
}
2. ์ฌ์ฉ
Client์์ ํธ๋ฆฌ ๊ตฌ์กฐ์์์ top-level์ ์กด์ฌํ๋ Composite1์ ์์ฒญ์ ๋ณด๋ธ๋ค. ๊ทธ๋ฌ๋ฉด Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ ๋๋ก ์์์ ์๋ ๋ฐฉํฅ์ผ๋ก ๋ชจ๋ ์์ ์์์๊ฒ ์ ๋ฌํ๊ฒ ๋๋ค. ์ด๊ฒ์ ์ค์ ๋ก ๋ฐํ์์์ ์ผ์ด๋๋ ํ์๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
3. ์ฐธ๊ณ
https://mygumi.tistory.com/343