클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다. 개별 객체와 복합 객체는 서로 포함 관계인데, 객체를 트리구조로 구성해서 부분-전체 계층 구조를 구현한다.
계층 구조가 있는 자료구조의 아이템에 대해 공통된 인터페이스로 접근할 때 사용한다. 컴포지트 패턴을 사용하면 클라이언트에게는 계층 구조가 보이지 않기 때문에 클라이언트의 사용 코드가 매우 단순해진다는 장점이 있다.
개별 객체(leaf)와 복합 객체(composite)가 존재하는 상황. 클라이언트는 개별 객체와 복합 객체를 동일한 방법으로 사용하고자 하므로 개별 객체와 복합 객체를 공통으로 묶는 인터페이스인 Component를 둔다. Component는 객체가 원래 가진 책임과 함께 계층구조를 관리하는 책임을 가진다.
Composite와 반복자
Composite는 복합 객체이다. 복합 객체는 자식으로 개별 객체를 두거나 또다른 복합 객체를 둘 수 있다. 따라서 Composite는 개별객체와 복합객체를 둘다 가질 수 있는 컬렉션을 가진다. Component 타입의 컬렉션을 구성으로 두면 된다. 복합 객체가 자신의 모든 자식들에 접근하려고 할 때, 컬렉션이 제공하는 Iterator이 있다면 향상된 for 순환문을 사용할 수 있다.
Component 메소드 구현
모든 구성 요소는 Component 인터페이스를 구현한다. 하지만 잎과 노드는 각각 역할이 다르므로, 모든 메소드에 알맞는 기본 메소드 구현은 불가능하다. 그래서 자기 역할에 맞지 않는 상황을 기준으로 예외를 던지는 코드를 기본 구현으로 제공할 수 있다.