본문 바로가기
디자인패턴

복합체 패턴 (Composite Pattern)

by 이석준석이 2021. 6. 19.

사용 의도

  • 사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 하는 패턴입니다.

예시

  • 쇼핑몰에서 어떤 상품을 봤을 때
    • 그 단일상품을 볼 수도있고
    • 단일상품으로 이뤄진 하나의 상품도 볼 수 있을때
단일상품 복합상품
RAM, GPU, CPU 컴퓨터
하의, 상의, 신발 마네킹이 입고있는 옷 상품

위와같은 경우, 쇼핑몰에서 단일상품과 복합상품을 하나로 인지할 수 있도록 복합체 패턴을 사용하여 구현합니다.

 


구현

 

아래와 같이 구현합니다.

public abstract class ProductComponent {
    public void addChild(ProductComponent productComponent) {
        throw new UnsupportedOperationException();
    }

    public void removeChild(int idx) {
        throw new UnsupportedOperationException();
    }

    public ProductComponent getChild(int idx) {
        throw new UnsupportedOperationException();
    }

    public abstract void showProduct();
}
public class UniProduct extends ProductComponent {

    private String name;
    private int price;

    @Override
    public void showProduct() {
        System.out.println("name = " + name);
        System.out.println("price = " + price);
    }
}
public class CompositeProduct extends ProductComponent {

    private List<ProductComponent> productList = new ArrayList<>();

    private String name;
    private int price;

    @Override
    public void addChild(ProductComponent productComponent) {
        productList.add(productComponent);
    }

    @Override
    public void removeChild(int idx) {
        productList.remove(idx);
    }

    @Override
    public ProductComponent getChild(int idx) {
        return productList.get(idx);
    }

    @Override
    public void showProduct() {
        System.out.println("name = " + name);
        System.out.println("price = " + price);
        productList.stream()
                .forEach(each -> each.showProduct());
    }
}

 

위처럼 구현하면 클라이언트는 ProductComponent 만을 이용하여 

  • 공통적으로 제공되는 showProduct() 를 사용하여 개별객체와 복합객체를 모두 동일하게 다룰 수 있습니다.

복합객체에서만 사용되는 함수들에 대해서는

  • UnsupportedOperationException 등을 사용하여 개별객체에서의 사용을 막는 부분을 추가합니다.

public static void main(String[] args) {
    UniProduct ram = new UniProduct("RAM", 100000);
    UniProduct gpu = new UniProduct("GPU", 200000);
    UniProduct cpu = new UniProduct("CPU", 300000);

    CompositeProduct computer = new CompositeProduct("Computer", 550000);
    computer.addChild(ram);
    computer.addChild(gpu);
    computer.addChild(cpu);

    CompositeProduct shoppingMall = new CompositeProduct("ShoppingMall", -1);
    shoppingMall.addChild(ram);
    shoppingMall.addChild(gpu);
    shoppingMall.addChild(cpu);
    shoppingMall.addChild(computer);

    shoppingMall.showProduct();
}

'디자인패턴' 카테고리의 다른 글

퍼사드 패턴 (Facade Pattern)  (0) 2021.07.10
장식자 패턴 (Decorator Pattern)  (0) 2021.07.10
브릿지 패턴 (Bridge Pattern)  (0) 2021.06.18
어댑터 패턴 (Adapter pattern)  (0) 2021.06.12
단일체 패턴 (Singleton Pattern)  (0) 2021.06.05