디자인 패턴 - 컴포지트 패턴(Composite pattern)

정의 : 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만드는 것.

 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있다. 개별 객체와 다른 개별객체들을 포함하는 복합 객체를 구분할 필요 없이 똑같은 작업이 가능하다.
 예를 들어 파일시스템의 트리 구조. GUI 시스템의 캔버스-패널-버튼-텍스트 등의 트리 구조.

 부분-전체 관계를 가진 객체 컬렉션이 있으며, 이 객체들을 모두 똑같은 방식으로 다루고 싶을 때 사용한다.

 Component 인터페이스는 자신의 구성요소로서의 역할을 수행하는 메소드인 Operation과, 자신의 하위에 다른 Component를 추가/삭제하거나 조회하는 메소드를 제공한다.

 컴포넌트 인터페이스를 만들고, 이를 복합(Composite) 객체와 리프 객체에서 모두 구현한다. 각자 용도에 맞는 메소드만 구현하고, 그 외 쓸모없는 메소드는 기본 메소드를 그대로 쓸 수 있도록 한다. 컴포넌트는 각기 자신의 Operation을 구현한다. 추가로 자식 컴포넌트를 관리하는 메소드를 구현할 수도 있다.
 리프 노드는 자식이 0개인 복합 객체로 볼 수 있으며 사실상 자식이 없기 때문에 굳이 자신의 하위 컴포넌트를 관리하는 메소드를 오버라이드해서 구현하지 않고 기본 메소드를 쓰는 것이라 볼 수 있다.

 복합객체의 Operation 자신의 할 일 뿐 아니라 자신이 가지고 있는 개별객체들의 Operation을 재귀적으로 호출한다. 이로써 최상위 객체의 Operation를 실행한다면 트리 구조로 가지고 있는 모든 자식 객체들의 Operation이 계층적으로 실행된다.

 컴포지트 패턴은 단일 역할 원칙을 깨는 대신 투명성을 확보한다.
클라이언트에서는, 컴포넌트 인터페이스를 구현하는 객체가 개별 리프 노드인지 최상위 복합 노드인지를 구분하지 않고 똑같은 방식으로 처리할 수 있다. 클라이언트를 단순화할 수 있는 것이 장점.

예시 :
Component { Op(); Add(); }
FileSystem : Component { Op(); Add(); }
Directory : Component { Op(); Add(); }
File : Component { Op(); Add(); }

FileSystem.Op(){ iter = LeafComponent.Iterator(); while(iter.Next()) { iter.Op(); } }
FileSystem.Add(){ LeafComponent.Add(something); }
...
//Same at Directory.
//Can be overrided default methods of Component interface.
//Additional methods can be overrided.

Client.main
FileSystem fs;
Directory[10] dir;
File[20] files;
fs = new FileSystem();
fs.Add( dir );
dir.Add( Some files of files );

fs.Op(); // FileSystem/All Directories at each line/All Files of each directory
          // FileSystem
          // FileSystem/ Dir1
          // FileSystem/ Dir1 / File1
          // FileSystem/ Dir1 / File2
          // FileSystem/ Dir2
          // FileSystem/ Dir2 / File3
          // FileSystem/ ... / ...



복합 반복자(Composite Iterator)
 스택을 이용해 이터레이터를 컴포지트 패턴으로 사용할 수 있다. 이터레이터가 다음 요소를 스택에 계속 넣으면서 컴포지트 패턴을 이용한다.

널 반복자(Null Iterator)
 아무것도 하지 않는 객체에 대해서는 MoveNext()에 대해 null을 반환하고, HasNext()에는 false를 반환하면 된다. 

댓글

이 블로그의 인기 게시물

디자인 패턴 - 더티 플래그(Dirty flag)

디자인 패턴 - 서비스 중개자 패턴(Service locator pattern)

인공지능 - 유한 상태 기계(Finite state machine)