본문 바로가기

IT/디자인 패턴

[디자인 패턴] 컴포지트 패턴(Composite pattern)

1. Composite pattern이란?

단일 객체나 복수 객체의 타입을 동일하게 취급하는 패턴입니다.
즉, 단일 객체와 복합 객체의 처리방법이 차이가 없을 경우 사용합니다.

2. Composite pattern 예제

Composite pattern이 적용된 파일 시스템을 간단하게 구현해보겠습니다.

1) Node.java

public interface Node {

    public String getName();

    default public List<Node> getNodes() {
        return null;
    }
}
Node는 표현할 요소들의 추상적인 인터페이스 역할을 합니다.

2) File.java

public class File implements Node {

    private String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}
File은 Node 인터페이스를 구현한 요소입니다. 

3) Directory.java

public class Directory implements Node {

    private String name;

    private List<Node> nodes = new ArrayList<>();

    public Directory(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public List<Node> getNodes() {
        return nodes;
    }
}
Node List를 저장할 수 있습니다. Directory 또한 Node 인터페이스를 구현했기 때문에 Directory를 nodes에 저장할 수 있습니다. Directory안에 Directory가 저장되는 구조를 생각하면 이해하기 쉽습니다. 

4) Main.java

public class Main {
    public static void main(String[] args) {
        Directory videoDir = new Directory("video");
        Directory dramaDir = new Directory("drama");

        File drama01 = new File("drama01.mp4");
        File drama02 = new File("drama02.mp4");

        File memo = new File("readme.txt");

        dramaDir.getNodes().add(drama01);
        dramaDir.getNodes().add(drama02);

        videoDir.getNodes().add(dramaDir);
        videoDir.getNodes().add(memo);

        showAll(videoDir);
    }

    static public void showAll(Node node) {

        System.out.println(node.getName());
        if (Objects.nonNull(node.getNodes())) {
            System.out.println("----");
            node.getNodes().forEach(n -> showAll(n));
            System.out.println("----");
        }
    }
}

 

3. 출력

video
----
drama
----
drama01.mp4
drama02.mp4
----
readme.txt
----

참조 : 

jdm.kr/blog/228