사용 의도
- 사용자로 하여금 개별 객체와 복합 객체를 모두 동일하게 다룰 수 있도록 하는 패턴입니다.
예시
- 쇼핑몰에서 어떤 상품을 봤을 때
- 그 단일상품을 볼 수도있고
- 단일상품으로 이뤄진 하나의 상품도 볼 수 있을때
단일상품 | 복합상품 |
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 |