-
구조(Structural) 패턴 - 복합체(Composite) 패턴Java/디자인패턴 2024. 11. 26. 13:15반응형
복합체(Composite) 패턴은 구조(Structural) 패턴에 속합니다. 이 패턴은 객체를 트리 구조로 구성하여 부분-전체 계층 구조를 표현하는 데 사용됩니다. 클라이언트가 개별 객체와 복합 객체(즉, 객체의 그룹)를 동일하게 취급할 수 있도록 설계됩니다.
복합체 패턴의 특징
- 트리 구조 관리:
- 객체를 트리 형태로 구성하여 개별 객체와 복합 객체를 동일하게 처리합니다.
- 재귀적 구성:
- 객체가 자신과 동일한 타입의 객체를 포함할 수 있습니다.
- 클라이언트의 단순화:
- 클라이언트는 개별 객체와 복합 객체를 구분하지 않고 동일한 방식으로 처리할 수 있습니다.
복합체 패턴의 구성요소
- Component (구성 요소):
- 개별 객체와 복합 객체를 동일하게 취급하기 위한 인터페이스를 정의합니다.
- Leaf (잎):
- 구성 요소의 기본 단위로, 실제 작업을 수행하는 개별 객체입니다.
- Composite (복합 객체):
- 다른 Component 객체를 포함하며, 이를 통해 트리 구조를 형성합니다.
- 자신의 구성 요소들에게 작업을 위임하거나 추가/삭제 작업을 수행할 수 있습니다.
- Client (클라이언트):
- Component를 통해 개별 객체와 복합 객체를 동일하게 처리합니다.
JAVA 예제
1. Component 인터페이스
// Component: 공통 인터페이스 interface Component { void showDetails(); }
2. Leaf 클래스
// Leaf: 트리의 말단 요소 class File implements Component { private String name; public File(String name) { this.name = name; } @Override public void showDetails() { System.out.println("File: " + name); } }
3. Composite 클래스
import java.util.ArrayList; import java.util.List; // Composite: 다른 Component를 포함하는 클래스 class Folder implements Component { private String name; private List<Component> components = new ArrayList<>(); public Folder(String name) { this.name = name; } public void addComponent(Component component) { components.add(component); } public void removeComponent(Component component) { components.remove(component); } @Override public void showDetails() { System.out.println("Folder: " + name); for (Component component : components) { component.showDetails(); } } }
4. 사용 예시
public class CompositePatternExample { public static void main(String[] args) { // Leaf 객체 생성 Component file1 = new File("File1.txt"); Component file2 = new File("File2.txt"); Component file3 = new File("File3.txt"); // Composite 객체 생성 Folder folder1 = new Folder("Folder1"); Folder folder2 = new Folder("Folder2"); // 트리 구조 형성 folder1.addComponent(file1); folder1.addComponent(file2); folder2.addComponent(file3); folder2.addComponent(folder1); // 클라이언트가 동일한 방식으로 처리 System.out.println("Displaying Folder2:"); folder2.showDetails(); } }
실행 결과
Displaying Folder2: Folder: Folder2 File: File3.txt Folder: Folder1 File: File1.txt File: File2.txt
복합체 패턴의 활용 사례
- 파일 시스템:
- 폴더와 파일 간 계층 구조를 표현.
- GUI 구성 요소:
- 버튼, 텍스트 필드, 패널 등과 같은 위젯의 계층 구조 관리.
- 조직 구조:
- 회사의 부서와 직원 간 계층 구조를 표현.
- 게임 엔진:
- 게임의 객체(캐릭터, 아이템 등)를 트리 형태로 관리.
장점
- 부분-전체 일관성:
- 개별 객체와 복합 객체를 동일하게 취급할 수 있습니다.
- 확장성:
- 새로운 Leaf 또는 Composite를 쉽게 추가할 수 있습니다.
- 클라이언트 코드 단순화:
- 복합 객체와 단일 객체를 구분하지 않고 처리할 수 있습니다.
- 재귀적 구조 표현:
- 트리 구조를 자연스럽게 표현할 수 있습니다.
단점
- 복잡성 증가:
- 트리 구조의 깊이가 깊어질수록 구조가 복잡해질 수 있습니다.
- 클래스 설계의 유연성 제한:
- 모든 구성 요소가 동일한 인터페이스를 구현해야 하므로 제한이 있을 수 있습니다.
- 불필요한 기능 노출:
- Leaf 객체에서 사용되지 않는 Composite 관련 메서드가 노출될 수 있습니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
행위 패턴(Behavioral Pattern) - 인터프리터(Interpreter) 패턴 (2) 2024.11.27 패턴은 행동(Behavioral) - 책임 연쇄(Chain of Responsibility) 패턴 (0) 2024.11.24 생성 패턴(Creational Pattern) - 프로토타입(Prototype) 패턴 (0) 2024.11.23 행동(Behavioral) - 메멘토(Memento) 패턴 (0) 2024.11.22 행동(Behavioral) - 커맨드(Command) 패턴 (0) 2024.11.21 - 트리 구조 관리: