컴퍼지트 패턴(Composite Pattern)은 구조 패턴 중 하나로 이는 소프트웨어에서 특정한 문제를 해결하기 위해 반복적으로 발생하는 구조를 식별하고, 그 구조에 따라 일반화된 해결책을 제시하는 것을 의미합니다.
한마디로 일괄적으로 관리할 수 있도록 만드는 패턴입니다.
컴포지트 패턴이란?
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴입니다. 사용자는 이 복합체 패턴을 통해 단일 객체와 복합 객체 모두 동일하게 다룰 수 있습니다.

컴포넌트는 클라이언트가 composition내의 오브젝트들을 다루기 위해 제공되는 인터페이스를 말한다.
컴포넌트는 인터페이스 또는 추상 클래스로 정의되며 모든 오브젝트들에게 공통되는 메소드를 정의해야한다.
composition내 오브젝트들의 행동을 정의한다. 이는 복합체를 구성하는데 중요한 요소이며, 베이스 컴포넌트를 구현한다.
Leaf는 다른 컴포넌트에 대해 참조를 가지면 안된다.
Leaf객체들로 이루어져 있으며 컴포넌트 내 명령들을 구현한다.
컴퍼지트 패턴 코드
public interface Shape {
public void draw(String paintColor);
}
public class Triangle implements Shape {
public void draw(String paintColor) {
System.out.println("삼각형이 다음 색상으로 색칠되었습니다. : " + paintColor);
}
}
~~~java
public class Square implements Shape {
public void draw(String paintColor) {
System.out.println("사각형이 다음 색상으로 색칠되었습니다. : " + paintColor);
}
}
public class Circle implements Shape {
public void draw(String paintColor) {
System.out.println("동그라미가 다음 색상으로 색칠되었습니다. : " + paintColor);
}
}
public class Drawing implements Shape {
private List<Shape> shapes = new ArrayList<>();
@Override
public void draw(String paintColor) {
for(Shape shape : shapes) {
shape.draw(paintColor);
}
}
public void add(Shape s) {
this.shapes.add(s);
]
public void remove(Shape s) {
this.shapes.remove(s);
}
public void clear() {
System.out.println("모든 도형을 제거합니다.");
this.shapes.clear();
}
}
위 코드에서 중요한 것은 Composite의 객체 또한 Component를 구현해야한다는 것이다. 그렇게 해야만 클라이언트가 Composite객체에 대해 다른 Leaf와 동일하게 취급할 수 있기 때문이다.
public class CompositePattern {
public static void main(String args[]) {
Shape triangle = new Triangle();
Shape circle = new Circle();
Shape square = new Square();
Drawing drawing = new Drawing();
drawing.add(triangle);
drawing.add(circle);
drawing.add(square);
drawing.draw("빨간색");
List<Shape> shapes = new ArrayList<>();
shapes.add(drawing);
shapes.add(new Triangle());
shapes.add(new Circle());
for(Shape shape : shapes) {
shape.draw("초록색");
}
}
}

위의 코드에서 보았듯이, drawing객체를 통해 Triangle, Circle, Sqaure등 Leaf객체를 그룹으로 묶어서 한번에 동작할 수 있다.