Composite Pattern

개념
- 그룻과 내용물을 동일시해서 재귀적인 구조를 만드는 패턴

I. 의도

     클라이언트에서 개별 객체와 복합 객체를 동일하게 다룰 수 있도록 함

     정의: 그룻과 내용물을 동일시해서 재귀적인 구조를 만드는 패턴
II. 활용

  • 부분-집합 관계의 계층도를 표현해야 하고 복합 관계와 단일 객체 간의 사용을 동일하게 하고자 할 때

III. 결과

  • 기본 객체와 복합 객체로 합성돤 클래스로 하나의 일관된 계층도를 정의
  • 프레임워크 사용자의 코드를 간단히 할수 있다
  • 새로운 요소를 쉽게 추가 가능
  • 범용성있는 설계

관련패턴: 컴포넌트-부모 간의 연결은 Chain of Responsibility 패턴에서 많이 사용된다.

Decorator 패턴에 Composite 패턴을 사용하는데, 이 두 패턴이 함께 사용되는 것은 매우 일반적이다. 둘 다 동일한 하나의 부모 클래스를 상속받고, Decorator는 Add(), Remove(), GetChild() 등의 오퍼레이션을 통해서 Component의 인터페이스를 지원해야 한다.

Flyweight 패턴을 통해서 컴포넌트의 공유 방법을 얻을 수 있다

Iterator 패턴을 이용하면 컴포넌트를 순회하는 방법을 얻을 수 있다.

Visitor 패턴을 이용하면 Composite와 leaf 클래스에 걸쳐 분산된 행위를 다소 제한할 수 있다

 

  • Component: 집합 관계에 정의될 모든 객체에 대한 인터페이스를 정의한다. 모든 클래스에 해당하는 인터페이스에 대해서는 공통의 행위를 구현한다. 전체 클래스에 속한 요소들을 관리하는데 필요한 인터페이스를 정의한다. 순환 구조에서 요소들을 표함하는 전체 클래스로의 접근에 필요한 인터페이스를 정의한다. 필요하다면 공통의 행위는 구현할 수 있다.
  • Leaf: 집합 관계에서의 다른 객체를 포함할 수는 없고 포함되기만 하는 객체로 객체에 가장 기본이 되는 행위를 정의한다.
  • Composite: 포함된 요소들을 갖는 복합 객체에 대한 행위를 정의한다. 자신이 합성하고 있는 요소들을 저장하고 있으면서, 각 합성 요소를 다루는데 관련된 오퍼레이션을 구현한다.
  • Client: Component 인터페이스를 통해 집합 관계에 있는 객체들을 관리한다.

 

소스

Class AClient {
             …
             Node rootDir_;
             …
             void list() {
                           for(int i=0; i < rootDir_.getSize(); i++) {
                                        System.out.println((rootDir_.getChild(i)).getName());
                           }
             }
             …
}

댓글