📢 객체들을 트리 구조로 구성한 다음, 이러한 구조를 개별 객체인 것처럼 사용할 수 있는 패턴이다.
사용 상황 : 서비스의 핵심 모델을 트리로 나타낼 수 있는 경우에만 의미가 있다.
구조
Component
: 트리의 단일 객체와 복합 객체 모두에게 공통적인 인터페이스를 제공한다. Leaf
: 일반적인 트리구조에서의 Leaf Node와 같은 의미이다. Leaf
는 단일 객체로만 이루어져 있어 대부분의 실제 작업을 수행한다. Container
: 컴포지트와 같은 의미이다. 하위 요소들을 모두 포함하는 요소이다. 대신 자식들의 구체적인 클래스까지는 알지 못하고 공통 인터페이스를 통해서 모든 하위 요소와 함께 작동한다. 하위 요소중 자신과 같은 Container가 있다면 자식 Container에게 작업을 위임하여 결과를 리턴받고 결과를 종합하여 응답한다.Client
: Component
인터페이스를 통해 모든 구성요소와 함께 작동한다. 결과적으로 트리 내으 모든 요소에 대해서 동일한 작업을 수행한다.예시
Product
와 Box
라는 두 가지 유형의 객체가 있다.
Product
: 박스 포장이 없어 가격을 바로 알 수 있다.
Box
: 박스포장이 되어 있어 해당 주문의 총 가격을 바로 알 수 없다. Box
내에 는 여러 Product
와 작은 Box
로 이루어져 있을 수 있기 때문이다. 따라서 총 가격을 알기 위해서는 모든 포장된 상자를 풀어 살펴보아야 알 수 있다.
즉, 제품의 총 가격은 재귀적으로 접근하여 작은 Box 또한 자신이 담겨있는 큰 Box와 동일한 매커니즘으로 가격을 구할 수 있다.
Product
인터페이스, 클래스public interface Products{
int getPrice();
}
public class Product implements Products{
int price = 110;
@Override
public int getPrice(){
return this.price;
}
}
Box
클래스public class Box implements Products{
List<Products> products = new ArrayList<Products>();
int price;
public void addProducts(Products product){
products.add(product);
}
@Override
public int getPrice(){
for(Products product : products){
this.price += product.getPrice();
}
return this.price;
}
}
public class Main{
public static void main(String[] args) {
Box box1 = new Box();
box1.addProduct(new Product());
box1.addProduct(new Product());
box1.addProduct(new Product());
Box box2 = new Box();
box2.addProduct(new Product());
box2.addProduct(new Product());
box2.addProduct(box1);
System.out.println(box2.getPrice());
}
}