Composite
What is❔
Composite 패턴은 여러 개의 객체들로 구성된 복합 객체(Composite)와 단일 객체(Leaf)를 동일한 인터페이스로 다룰 수 있도록 해주는 디자인 패턴입니다.
+----------------+
| Graphic | <-- 공통 인터페이스
+----------------+
/ \
/ \
/ \
+---------------+ +--------------------+
| Ellipse | | CompositeGraphic |
| (Leaf) | | (Composite) |
+---------------+ +--------------------+
/ | \
/ | \
/ | \
+----------+ +----------+ +----------+
| Graphic | | Graphic | | Graphic |
| (Leaf or | | (Leaf or | | (Leaf or |
| Composite)| | Composite)| | Composite)|
+----------+ +----------+ +----------+
즉, 사용자는 개별 객체와 복합 객체를 구분하지 않고 동일한 연산을 수행할 수 있게 됩니다.
이 패턴은 전체-부분 관계를 표현할 때 유용하며, 트리 구조의 계층을 구성하는 데 적합합니다.
How do Code❔
장점: 구현이 간단하며 멀티스레드 환경에서도 안전합니다.
단점: 사용하지 않더라도 인스턴스가 생성되어 메모리 낭비가 발생할 수 있습니다.
// 공통 인터페이스: Leaf와 Composite 모두 동일한 인터페이스를 구현합니다.
public interface Graphic {
void draw();
}
// Leaf 클래스: 더 이상 구성요소가 없는 개별 객체입니다.
public class Ellipse implements Graphic {
private final String name;
public Ellipse(String name) {
this.name = name;
}
@Override
public void draw() {
System.out.println("Ellipse 그리기: " + name);
}
}
// Composite 클래스: 하나 이상의 Graphic 객체를 포함하는 복합 객체입니다.
public class CompositeGraphic implements Graphic {
private final List<Graphic> children = new ArrayList<>();
// 자식 추가
public void add(Graphic graphic) {
children.add(graphic);
}
// 자식 제거
public void remove(Graphic graphic) {
children.remove(graphic);
}
@Override
public void draw() {
System.out.println("CompositeGraphic 그리기 시작");
for (Graphic graphic : children) {
graphic.draw();
}
System.out.println("CompositeGraphic 그리기 종료");
}
}
// 사용 예제
public class CompositePatternDemo {
public static void main(String[] args) {
// Leaf 객체 생성
Ellipse ellipse1 = new Ellipse("Ellipse 1");
Ellipse ellipse2 = new Ellipse("Ellipse 2");
Ellipse ellipse3 = new Ellipse("Ellipse 3");
// Composite 객체 생성 및 Leaf 객체 추가
CompositeGraphic compositeGraphic = new CompositeGraphic();
compositeGraphic.add(ellipse1);
compositeGraphic.add(ellipse2);
// 또 다른 Composite 객체 생성 및 Leaf, Composite 추가
CompositeGraphic complexGraphic = new CompositeGraphic();
complexGraphic.add(ellipse3);
complexGraphic.add(compositeGraphic);
// 전체 구성 요소에 대해 draw() 호출
complexGraphic.draw();
}
}
목적: 전체-부분 관계를 표현하여, 단일 객체와 복합 객체를 동일한 방식으로 다룰 수 있도록 함
장점: 클라이언트가 복합 구조의 내부 구성에 대해 신경 쓰지 않고 동일한 인터페이스로 연산 수행 가능
적용 예: 그래픽, 파일 시스템, UI 컴포넌트 등 계층적인 구조를 다룰 때 유용함
Last updated