Skip to content

Latest commit

 

History

History
73 lines (56 loc) · 2.39 KB

File metadata and controls

73 lines (56 loc) · 2.39 KB

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


예시 코드

대표적인 컴포짓 패턴의 예시는 파일 디렉토리 구조이다. 내가 있는 폴더가 다른 폴더의 자식 폴더인지, 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이 전체든, 일부든, 상관없이 동일하게 실행된다.

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