Skip to content

컴포짓 패턴이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다. 복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 그 관계를 전체-부분 관계로 정의할 수 있는데, 이 전체-부분 관계를 효율적으로 처리하기 위한 디자인 패턴이 컴포짓 패턴이다.


예시 코드

대표적인 컴포짓 패턴의 예시는 파일 디렉토리 구조이다. 내가 있는 폴더가 다른 폴더의 자식 폴더인지, root 폴더인지에 상관없이 똑같이 다룰 수 있다.

컴포짓 패턴을 사용하면 재귀적인 트리 구조를 구현할 수 있다.

public interface Composite {
String getName();
String getTree(String tab);
}
public class File implements Composite{
private String name;
public File(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public String getTree(String tab) {
return "\n"
+ tab + "File : " + this.getName() + "\n"
+ tab.substring(2);
}
}
public class Folder implements Composite {
private String name;
private List<Composite> composites;
public Folder(String name, Composite... composites) {
this.name = name;
this.composites = Arrays.stream(composites)
.collect(Collectors.toList());
}
@Override
public String getName() {
return name;
}
@Override
public String getTree(String tab) {
return "\n" +
tab + "Folder(" + name + ") { \n" +
tab + " " + composites.stream().map(o -> o.getTree(tab + " "))
.collect(Collectors.toList()) + "\n" +
tab + "} \n" +
tab.substring(2);
}
}

트리 구조를 확인하기 위해 재귀적인 getTree 메서드를 구현했다. 해당 Composite이 전체든, 일부든, 상관없이 동일하게 실행된다.

링크로 가면 코드를 볼 수 있다.