Java/Design Pattern

[헤드퍼스트 디자인 패턴] 9-2. 컴포지트 패턴

noahkim_ 2024. 12. 18. 21:11

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다

 

1. 컴포지트 패턴

  • 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한 패턴

 

장점
  • 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있음
  • 투명성이 확보됨
    • 어떤 노드가 내부노드인지, 리프노드인지 바로 확인 가능
  • 확장성
    • 새로운 리프 노드나 복합 객체를 쉽게 추가할 수 있음

 

단점
  • 단일 책임 원칙 위반
    • 계층 구조 관리 + 데이터 보관

 

2. MenuComponent

public abstract class MenuComponent {
    public void add(MenuComponent menuComponent) throw new UnsupportedOperationException();
    public void remove(MenuComponent menuComponent) throw new UnsupportedOperationException();    
    public MenuComponent getChild(int i) throw new UnsupportedOperationException();
    public String getName() throw new UnsupportedOperationException();
    public String getDescription() throw new UnsupportedOperationException();
    public String getPrice() throw new UnsupportedOperationException();
    public String isVegitarian() throw new UnsupportedOperationException();
    public void print() throw new UnsupportedOperationException();
}
  • 노드의 추상클래스
  • 내부 노드와 리프 노드가 서로 역할이 다르므로 기본적으로 예외를 던지도록 함

 

Menu

public class Menu extends MenuComponent {
    List<MenuComponent> menuComponents = new ArrayList<>();    
    String name, description;
    
    // constructor
    // getter, setter
    public void print() { /* 상태 출력 */ }

    public void add(MenuComponent menuComponent) { menuComponents.add(menuComponent); }
    public void remove(MenuComponent menuComponent) { menuComponents.remove(menuComponent); }
    public MenuComponent getChild(int i) { menuComponents.get(i); }    
}

 

MeunItem (Leaf)

public class MenuItem extends MenuComponent {
    String name, description;
    boolean vegetarian;
    double price;
    
    // constructor
    // getter, setter
    
    public void print() { /* 상태 출력 */ }
}