2009. 9. 18. 14:58 Programming/Design Pattern
1. 컨텍스트
Composite 패턴은 클라이언트가 트리 구조(tree structures)를 형성하는 개별 객체들과 이들이 모여서 만들어진 구성체를을 동일하게 취급하는 것을 가능하게 한다.

그래픽 컴포넌트를 이용하여 그림을 그리는 예를 생각해보자. 선, 원, 문자 및 사각형과 같은 기본적인 그래픽 컴포넌트를 다루는 것은, 이들이 모여서 형성되는 구성체(Composite)를 다루는 방법과 동일하다. 즉, 선을 화면에 표시하는 작업이나, 선과 원이 합쳐진 객체를 화면에 표현하는 것이나 근본적으로 동일한 행위라는 것에서 고안된 패턴이 Composite 패턴이다.

J2SE SDK에 포함된 java.awt 패키지를 사용해본 개발자라면 이미 Composite 패턴에 익숙해져 있다고 할 수 있다. java.awt.Component 객체를 포함할 수 있는 Container 객체 역시 Component 클래스에 속하기 때문에 동일한 인터페이스를 갖고 있다. 다시 말해서 Container에 Component를 붙이는 방법이나, Container를 붙이는 방법이나 동일한 것과 같이 Component 클래스에 정의된 인터페이스를 이용할 수 있다는 것이다.


<정리>

컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다.
이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다.


2. 적용 영역
■ 객체의 부분과 전체 계층 관계(part-whole hierarchies)를 표현하고자 하는 경우
■ 클라이언트가 구성체(Composite)와 이들을 구성하는 개별 객체의 차이점을 인지할 필요가 없게 하고자 하는 경우

3. 구조

4. 적용 결과
■ Composite 패턴은 기본 객체(primitive object)와 이들의 구성체로 이루어진 객체(composite object)로 이루어지는 클래스 계층 구조를 정의한다.
■ 클라이언트는 구성체로 이루어진 경우나 개별 객체의 경우 모두 동일한 형태로 취급하기 때문에, 클라이언트가 단순해진다.
■ 새로운 종류의 컴포넌트 추가가 용이하다. Composite나 Leaf를 상속하기만 하면 현재의 계층 구조와 클라이언트에서 그대로 사용될 수 있다.
■ 남용하는 경우는 너무 일반적인 설계를 초래할 수도 있다.

5. 관련 패턴
■ Chain of Responsibility 패턴을 위해 컴포넌트-부모 연결(component-parent link)이 사용된다.
■ Decorator 패턴은 종종 Composite 패턴과 함께 사용되어, 공통의 부모 클래스를 갖는다. 이때, Decorator가 add, remove 및 getChild와 같은 Component 인터페이스를 지원해야 한다.
■ Flyweight 패턴은 컴포넌트를 공유하지만, 부모 객체를 참조할 수가 없다.
■ Iterator 패턴은 Composite 객체를 순회(traverse)하는데 사용될 수 있다.
■ Visitor 패턴은 Composite과 Leaf 클래스를 넘나들면 분포하게 되는 오퍼레이션과 행위들을 로컬화(localization)할 수 있다.
posted by 부풍