자바 컴포지트 패턴은 구조(Structural) 디자인 패턴 중 하나로, 객체들을 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴입니다. 이 패턴은 단일 객체와 그 객체들을 포함하는 복합 객체를 동일한 인터페이스로 다룰 수 있게 합니다.
주요 구성 요소:
- Component: 컴포지트 패턴에서 계층 구조의 모든 객체들이 구현하는 인터페이스 또는 추상 클래스입니다. 단일 객체와 복합 객체를 동일한 방식으로 다루기 위해 필요한 메서드들을 정의합니다.
- Leaf: 컴포지트 패턴에서 단일 객체를 나타내는 클래스입니다. Leaf 클래스는 Component 인터페이스를 구현하며, 자식 객체를 가질 수 없습니다.
- Composite: 컴포지트 패턴에서 복합 객체를 나타내는 클래스입니다. Composite 클래스는 Component 인터페이스를 구현하며, 자식 객체들을 관리하고 자식 객체와 관련된 동작을 수행합니다.
컴포지트 패턴의 동작 방식은 다음과 같습니다:
- Component를 구현하는 Leaf 클래스는 자식 객체를 가질 수 없으므로, 주로 단일 객체를 나타냅니다.
- Composite 클래스는 자식 객체들을 관리하기 위한 컬렉션(예: 리스트)을 유지하며, Component를 구현하는 Leaf와 자기 자신(Composite)을 포함할 수 있습니다.
- Composite 객체는 자식 객체에 대해 동일한 작업을 재귀적으로 수행하며, 자식 객체들에 대해 반복적인 동작을 수행할 수 있습니다.
컴포지트 패턴은 다음과 같은 장점을 가지고 있습니다:
- 단일 객체와 복합 객체를 일관되게 처리할 수 있습니다.
- 계층 구조를 통해 복잡한 구조를 간결하게 표현할 수 있습니다.
- 새로운 구성 요소를 추가하기 쉽고 유연성이 높습니다.
컴포지트 패턴은 파일 시스템, GUI 컴포넌트 등 계층 구조를 가지는 구성 요소를 다루는 경우에 유용하게 사용될 수 있습니다.

import java.util.ArrayList;
import java.util.List;
// Component
interface Component {
void operation();
}
// Leaf
class Leaf implements Component {
@Override
public void operation() {
System.out.println("Leaf operation");
}
}
// Composite
class Composite implements Component {
private List<Component> components = new ArrayList<>();
public void add(Component component) {
components.add(component);
}
public void remove(Component component) {
components.remove(component);
}
public Component getChild(int index) {
return components.get(index);
}
@Override
public void operation() {
System.out.println("Composite operation");
for (Component component : components) {
component.operation();
}
}
}
// 예시 사용
public class CompositePatternExample {
public static void main(String[] args) {
// 복합 객체 생성
Composite composite = new Composite();
// 단일 객체 생성
Leaf leaf1 = new Leaf();
Leaf leaf2 = new Leaf();
// 복합 객체에 단일 객체 추가
composite.add(leaf1);
composite.add(leaf2);
// 복합 객체 동작 수행
composite.operation();
}
}
위의 예시 코드에서는 컴포지트 패턴을 구현하기 위해 Component 인터페이스를 정의하고, Leaf 클래스와 Composite 클래스에서 이를 구현합니다. Composite 클래스는 자식 객체들을 관리하기 위한 add(), remove(), getChild() 메서드를 구현하며, operation() 메서드에서는 자식 객체들에 대해 반복적으로 동작을 수행합니다.
CompositePatternExample 클래스에서는 예시로 복합 객체를 생성하고, 단일 객체를 생성한 후 복합 객체에 추가한 뒤, 복합 객체의 동작을 수행하는 방법을 보여줍니다.
'JAVA > GOF Design Pattern' 카테고리의 다른 글
GOF 자바 프록시 패턴 (0) | 2023.05.15 |
---|---|
GOF 플라이웨이트 패턴 (0) | 2023.05.13 |
GOF 파사드 패턴 (0) | 2023.05.10 |
GOF 어댑터 패턴 (0) | 2023.05.10 |
GOF 프로토타입 패턴 (0) | 2023.05.10 |