👀 학습 목표
- 컴포지트 패턴을 이해한다.
- 컴포지트 패턴 예제를 이해한다.
1. 컴포지트 패턴 정의
1-1. 컴포지트 패턴이란
객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있습니다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법을 다룰 수 있습니다.
- 부분과 전체 계층구조: 폴더-파일, 디저트메뉴-초코케이크 등
2. 컴포지트 패턴 적용하기
2-1. 객체마을 식당에서 메뉴 안에 들어가는 서브메뉴를 만들어 달라고 한다…
디저트 메뉴가 있고, 그 아래에 서브메뉴를 넣고 싶다고 합니다. 기존에는 단순히 메뉴만 관리해서 넣어서 리팩토링이 필요해 졌습니다.
- MenuComponent
- Component로 복합노드(폴더) + 잎 노드(파일) 정의 인터페이스
- Menu
- 복합 객체 클래스
- MenuItem
- leaf 클래스로 예를들면, 파일에 해당
- Waitress
- 클라이언트로 MenuComponent를 사용
- MenuTestDrive
- 아래와 같은 구성으로 메뉴를 구성
head first design patterns 책 이미지 참고
2-2. 두가지 역할을 하는 MenuComponent
원래 한 클래스에서 한 역할만 맡아야 한다. 그런데 컴포지트 패턴에서는 단일 역할 원칙을 깨고, 대신에 투명성을 확보하기 위한 패턴이다.
- MenuComponent은 복합 노드, 잎 노드의 역할 모두 한다.
- 투명성: 클라이언트가 복합 객체와 잎 노드를 똑같은 방식으로 처리할 수 있도록 하는 것이다.
참고
- Head first design patterns 책