Intro::
디자인 패턴중 구조 패턴인 컴포지트에 대해 알아봅시다.
컴포지트 패턴이란?
컴포지트 패턴의 목적은 개별 객체와 객체의 집합을 트리 구조로 구성하여 클라이언트가 개별 객체와 집합을 동일하게 다룰 수 있도록 하는 것입니다. 즉, 클라이언트가 개별 객체와 그 객체들의 조합을 구분 없이 하나의 인터페이스를 통해 다룰 수 있게 해 줍니다.
컴포지트 패턴에서는 클래스의 공통적인 부분을 컴포넌트라고 하는 인터페이스 또는 추상 클래스로 정의하고, 이를 기반으로 하는 개별 객체(리프)와 이러한 객체들의 집합을 나타내는 컴포지트 클래스를 만듭니다.
구성 요소
1.
컴포넌트(Component): 모든 개별 객체와 복합 객체가 공통으로 상속받는 인터페이스 또는 추상 클래스입니다. 공통의 작업을 정의합니다.
2.
리프(Leaf): 컴포넌트 인터페이스를 구현하는 하위 클래스로, 컴포지트에서 가장 기본이 되는 객체를 나타냅니다. 다른 객체를 포함할 수 없습니다.
3.
컴포지트(Composite): 컴포넌트 인터페이스를 구현하거나 상속하는 클래스로, 하위 컴포넌트들을 포함할 수 있습니다. 일반적으로 리스트나 배열 등을 사용하여 하위 컴포넌트들을 관리합니다.
장점
•
투명성: 클라이언트는 개별 객체와 객체의 집합을 동일하게 취급할 수 있습니다. 이로 인해 코드의 일관성과 간결성이 유지됩니다.
•
재사용성: 이미 구성된 구조를 쉽게 재사용하고, 확장할 수 있습니다. 새로운 종류의 컴포넌트를 추가하기 쉽습니다.
단점
•
과도한 일반화: 모든 컴포넌트가 공통 인터페이스를 공유하기 때문에, 특정 컴포넌트에서만 의미 있는 메소드가 다른 컴포넌트에서도 노출될 수 있습니다. 이는 디자인을 혼란스럽게 만들 수 있습니다.
코드 예시
// 컴포넌트 인터페이스
interface Graphic {
void draw();
}
// 리프 컴포넌트
class Circle implements Graphic {
public void draw() {
System.out.println("원을 그립니다.");
}
}
class Square implements Graphic {
public void draw() {
System.out.println("사각형을 그립니다.");
}
}
// 컴포지트 컴포넌트
class CompositeGraphic implements Graphic {
private List<Graphic> children = new ArrayList<>();
public void add(Graphic graphic) {
children.add(graphic);
}
public void remove(Graphic graphic) {
children.remove(graphic);
}
public void draw() {
for (Graphic graphic : children) {
graphic.draw(); // 컴포넌트의 draw 메소드 호출
}
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
Circle circle = new Circle();
Square square = new Square();
CompositeGraphic graphic = new CompositeGraphic();
graphic.add(circle);
graphic.add(square);
graphic.draw(); // "원을 그립니다." 그리고 "사각형을 그립니다." 출력
}
}
Java
복사