컴포짓 패턴이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다. 복합 객체와 단일 객체의 처리 방법이 다르지 않을 경우, 그 관계를 전체-부분 관계로 정의할 수 있는데, 이 전체-부분 관계를 효율적으로 처리하기 위한 디자인 패턴이 컴포짓 패턴이다.
예시 코드
대표적인 컴포짓 패턴의 예시는 파일 디렉토리 구조이다. 내가 있는 폴더가 다른 폴더의 자식 폴더인지, 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이 전체든, 일부든, 상관없이 동일하게 실행된다.
이 링크로 가면 코드를 볼 수 있다.