단일객체와 복합객체를 같은 인터페이스로 다루고 싶을 때 사용하는 패턴으로 클라이언트는 단일, 복합 객체를 구분할 필요 없이 동일하게 취급할 수 있다.
컴포지트 패턴으로 클라이언트는 트리구조를 가진 복잡한 객체들을 보다 쉽게 다룰 수 있다.
1.Component
interface Component {
void operate();
void addComponent();
void removeComponent();
}
2. Leaf
class Leaf implements Component {
public void operate() {
//Do Something
}
public void addComponent() {}
public void removeComponent() {}
}
실제 기능을 구현하는 Leaf클래스는 행동에 대한 기능(operate)를 구현하지만 Composite객체에서 사용할 기능(addComponent,removeComponent)는 구현하지 않는다.
3. Composite
class Composite implements Component {
List<Component> cmps = new ArrayList<>();
public void operate() {
for(Component c : cmps) {
c.operate();
}
}
public void addComponent(Component c) {
cmps.add(c);
}
public void removeComponent(Component c) {
cmps.remove(c);
}
}
복합객체를 구현한다. 실제 기능에 해당하는 operate()는 하위에 있는 Component에 메시지를 전파하는 역할을 한다.
4. Client
public class Client {
public static void main(String[] args) {
Leaf c1 = new Leaf();
Leaf c2 = new Leaf();
Leaf c3 = new Leaf();
Composite composite1 = new Composite();
composite1.addComponent(c1);
composite1.addComponent(c2);
Composite composite2 = new Composite();
composite2.addComponent(c3);
composite2.addComponent(composite1);
composite2.operate();
}
}
Client는 최상위 복합객체인 composite2에 operate명령을 내림으로 하위에 있는 컴포넌트객체들(c1,c2,c3,composite1)에 대한 결과를 얻을 수 있다.
컴포지트 패턴은 트리구조를 가진 복잡한 객체
들을 다루기 위해서 단일 객체와 복합 객체의 인터페이스를 일관되게 함으로 구현한다.
컴포지트 패턴으로 트리구조를 만드는 것과 헷갈리지 말자!
위의 구조를 보면 Component클래스에 addComponent, removeComponent를 선언해놓았는데, 이는 클라이언트의 편의성을 위한 것이다.