에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다
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() { /* 상태 출력 */ }
}
'Java > Design Pattern' 카테고리의 다른 글
[헤드퍼스트 디자인 패턴] 11. 프록시 패턴 (0) | 2024.12.18 |
---|---|
[헤드퍼스트 디자인 패턴] 10. 상태 패턴 (0) | 2024.12.18 |
[헤드퍼스트 디자인 패턴] 9-1. 반복자 패턴 (0) | 2024.12.18 |
[헤드퍼스트 디자인 패턴] 8. 템플릿 메서드 패턴 (0) | 2024.12.18 |
[헤드퍼스트 디자인 패턴] 7-2. 퍼사드 패턴 (0) | 2024.12.17 |