의도

부분과 전체의 계층을 표현하기 위해 객체들을 모아 트리 구조로 구성합니다.

전체와 부분을 하나로 추상화해야 하는 경우에 사용할 수 있는 패턴이다.

클라이언트 입장에서 메시지 수신자가 부분인지, 전체인지 상관 없이 동일한 메시지를 이용해 동일한 방식으로 대상과 상호작용하고싶을 때 사용할 수 있는 패턴이다.

동기

그래픽 편집기 같은 경우를 보면 구성 요소들을 그룹으로 만들고 이 그룹이 다시 더 큰 그룹을 형성하기도 한다. 이 경우 간단하게 텍스트, 라인 등 클래스를 정의하고 이를 포함한 컨테이너로 동작하는 클래스를 추가로 정의하는 방법이 있다.

하지만 이 경우 각 클래스와 컨테이너를 구분하기 위한 속성들을 정의해야하고 처리 대상이 무엇인지에 대해 추가로 구현해야 하는 문제가 있다.

이를 위한 COMPOSITE 패턴의 중요한 요소는 기본 클래스와 컨테이너 클래스를 모두 표현할 수 있는 하나의 추상화 클래스를 정의하는 것이다.

Untitled

이런 방식으로 설계해 다루는 대상이 그룹인지, 각각의 그림인지를 구분하지 않을 채 Draw()를 요청할 수 있다. 연산을 수행하는 객체가 Line의 인스턴스이면 Line 클래스에 정의된 Draw가 호출될 것이고 그룹이었다면 Picture 클래스에 정의된 Draw가 호출된다. 허나 사용자 입장에서는 동일하게 Graphic 클래스에 정의된 연산으로만 접근하는 일관성을 가지게된다.

활용성

구조

참여자