정의
- Object group이 단일 object와 동일하게 다루는 것이다.
- client들이 단일 object와 복합체(composition)들을 동일하게 다룬다.
용도
- Client가 object들의 composition과 단일 object 사이 차이를 무시해야 할 때 사용한다.
- 여러 개의 object들을 같은 방법으로 사용하거나,
그 object들에게 비슷한 코드를 사용한다면 composite pattern을 생각해 볼 수 있다.
구조
- Composite
- 자식들을 다루는 메소드로 일반적으로 자식들에게 기능을 위임하여 component의 모든 method를 구현한다.
- Component
- composite 하나를 포함하는, 자신을 포함한 모든 component들의 추상화로 composite에서 object들을 위한 interface를 제공한다.
- 또한 선택적으로 component의 부모에 접근하기 위해 recursive structure의 interface를 구현하기도 한다.
- Leaf
- composition에서 leaf 객체들을 나타내며, component의 모든 method들을 구현한다.
소스코드
package CompositePattern;
public interface Component {
public void show();
}
package CompositePattern;
import java.util.ArrayList;
import java.util.List;
public class Composite implements Component {
private List<Component> childComponents = new ArrayList<Component>();
public void add(Component component){
childComponents.add(component);
}
public void remove(Component component){
childComponents.remove(component);
}
@Override
public void show() {
childComponents.forEach(Component::show);
}
}
package CompositePattern;
public class Leaf implements Component {
private String name;
public Leaf(String name){
this.name=name;
}
@Override
public void show() {
System.out.println(name);
}
}
package CompositePattern;
public class Main {
public static void main(String[] args){
Leaf leaf1 = new Leaf("leaf 1");
Leaf leaf2 = new Leaf("leaf 2");
Leaf leaf3 = new Leaf("leaf 3");
Composite composite1 = new Composite();
composite1.add(leaf1);
Composite composite2 = new Composite();
composite2.add(leaf2);
composite2.add(leaf3);
composite1.add(composite2);
composite1.show();
System.out.println("remove 1");
composite1.remove(leaf1);
composite1.show();
System.out.println("remove composite 2");
composite1.remove(composite2);
composite1.show();
System.out.println("print composite 2");
composite2.show();
}
}
결과화면
UML