단일 객체와 여러 개의 단일 객체들로 구성된 복합 객체를 클라이언트 입장에서 구별없이 다루게 해주는 패턴
public interface Component {
void operation();
}
public class Leaf implements Component {
@Override
public void operation() {}
}
import java.util.ArrayList;
import java.util.List;
public class Composite implements Component {
private List<Component> componentList;
public Composite() {
componentList = new ArrayList<Component>();
}
@Override
public void operation() {
for (Component component : componentList) {
component.operation();
}
}
public void add(Component component) {
componentList.add(component);
}
public void remove(Component component) {
componentList.remove(component);
}
}
Leaf 클래스와 Composite 클래스가 공유하고 있는 추상체에 따라 두가지 형태가 가능하다.
인터페이스로 구현하여 자식을 관리하는 메서드를 Composite 클래스에 선언하는 방법이다. 따라서 클라이언트는 Leaf 클래스와 Composite 클래스를 다르게 취급한다. 하지만 클라이언트가 Leaf 객체가 자식을 관리하는 메서드를 호출하지 못하도록 설계하였기 때문에 안정성을 얻게 된다.
추상클래스로 구현하여 자식을 관리하는 메서드를 Component 클래스 내에 선언하는 방법이다. 이로 인해 클라이언트는 Leaf 클래스와 Composite 클래스를 일관되게 취급할 수 있다. 하지만 클라이언트는 Leaf 객체가 자식을 관리하는 메서드를 호출할 수 있기 때문에 안정성을 잃게 된다.
Component leaf = new Leaf();
Component composite = new Composite();
다음과 같이 컴포지트 패턴의 정의와 같이 클라이언트가 단일 객체와 복합 객체를 구별없이 다루기 위해서는 추상 클래스를 통한 구현이 적절하다고 생각한다. (저의 생각..입니다..)
https://mygumi.tistory.com/343
https://gmlwjd9405.github.io/2018/08/10/composite-pattern.html