컴퍼지트 패턴은 단일 객체와 그 객체들을 가지는 집합 객체를 같은 타입으로 취급하며, 트리 구조로 객체들을 엮는 패턴이다.
[ 해당 패턴을 사용하는 경우 ]
- 복합 객체와 단일 객체의 처리 방법이 동일한 경우, 전체-부분 관계를 정의할 수 있다.
- 객체들 간에 계급 및 계층 구조가 있고 이를 표현해야 할 경우,
- 대표적으로 Directory-File 관계가 존재한다.
Component
Leaf와 Composite 가 구현해야하는 Interface 로, Leaf 와 Composite 는 모두 Component 라는 같은 타입으로 다뤄진다.
Leaf
단일 객체로 Composite 의 부분(자식) 객체로 들어가게 된다.
이 때, Component 의 형태로 들어간다.
Composite
집합 객체로 Leaf 객체나 Composite 를 부분(자식)으로 둔다.
이 때, Component 의 형태로 들어간다.
클라이언트는 이 Composite 를 통해 부분 객체들 (Leaf 나 Composite) 을 다룰 수 있다.
Node
표현할 요소들이 선언되는 추상 메소드 집합 💨 인터페이스
interface Node{
public String getName();
}
File
Node에서 지정된 요소를 구현한 leaf요소.
class File2 implements Node{
private String name;
@Override
public String getName(){
return name;
}
}
Directory
leaf 요소를 관리하기위한 컴포지트 클래스
class Directory2 implements Node{
private String name;
private List<Node>children;
@Override
public String getName() {
return name;
}
public void add(Node node){
children.add(node);
}
}
Main
폴더에 file을 추가하듯 leaf 요소를 추가
public static void main(String[] args) {
Directory2 dir = new Directory2();
dir.add(new File2()); // 디렉토리에 파일 하나를 삽입!
dir.add(new File2()); // 디렉토리에 파일 하나를 삽입!
dir.add(new Directory2()); // 디렉토리에 디렉토리를 삽입!
Directory2 secondDir = new Directory2();
secondDir.add(dir);
secondDir.add(dir);
}
}
⭕장점
복잡한 트리 구조를보다 편리하게 사용할 수 있다.
다형성 재귀를 유리하게 사용한다.
오픈 / 클로즈 원칙.
기존의 코드를 건드리지 않고 새로운 요소 유형을 응용 프로그램에 도입 할 수 있다.
기존의 코드는 객체 트리에서 기능 할 수있게 되었다.
❌단점
기능이 크게 다른 클래스에 공통 인터페이스를 제공하는 것은 어려울 수 있다.
특정 시나리오에서는 구성 요소 인터페이스를 지나치게 일반화해야 이해하기 어려울 수 있다.