아무거나

[Design Pattern] Composite Pattern 본문

Java & Kotlin/Java

[Design Pattern] Composite Pattern

전봉근 2019. 12. 21. 13:47
반응형

컴포지트 패턴(Composite Pattern)

객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴

Component: 설계(인터페이스)
Leaf: 상속받은 내용물
Composite: Leaf를 담는 Composite 즉, Component가 만들어야할 공통적인 것들을 가지고있다.

컴포지트 패턴은 일반적으로 파일시스템에 자주 사용한다.

컴포지트 패턴 예시 - 1

[요구사항]

  • 파일 시스템을 만들자.

Component를 만들자.
[Component.java]

package com.bkjeon.composite;

abstract public class Component {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

File 클래스를 만들자.(=Leaf)
[File.java]

public class File extends Component {

    private Object data;

    public File(String name) {
        super(name);
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

}

기능을 수행할 수 있는 Folder 관련 클래스를 만들자.(=Composite)
[Folder.java]

package com.bkjeon.composite;

import java.util.ArrayList;
import java.util.List;

public class Folder extends Component {

    List<Component> children = new ArrayList<>();

    public Folder(String name) {
        super(name);
    }

    public List<Component> getChildren() {
        return children;
    }

    public boolean addComponent(Component component) {
        return children.add(component);
    }

    public boolean removeComponent(Component component) {
        return children.remove(component);
    }

}

이제 메인클래스에서 사용해보자.
[Main.java]

package com.bkjeon.composite;

public class Main {

    public static void main(String[] args) {
        Folder
            root = new Folder("root"),
            home = new Folder("home"),
            garam = new Folder("garam"),
            music = new Folder("music"),
            picture = new Folder("picture"),
            doc = new Folder("doc"),
            usr = new Folder("usr");
        File
            track1 = new File("track1"),
            track2 = new File("track2"),
            pic1 = new File("pic1"),
            doc1 = new File("doc1"),
            java = new File("java");

        root.addComponent(home);
            home.addComponent(garam);
                garam.addComponent(music);
                    music.addComponent(track1);
                    music.addComponent(track2);
                garam.addComponent(picture);
                    picture.addComponent(pic1);
                garam.addComponent(doc);
                    doc.addComponent(doc1);
        root.addComponent(usr);
            usr.addComponent(java);

        show(root);
    }

    // 출력
    private static void show(Component component) {
        System.out.println(component.getClass().getName() + " | " + component.getName());
        if (component instanceof Folder) {
            for (Component c: ((Folder) component).getChildren()) {
                show(c);
            }
        }
    }

}

실행결과를 확인하면 폴더 구조를 볼 수 있다.

com.bkjeon.composite.Folder | root
com.bkjeon.composite.Folder | home
com.bkjeon.composite.Folder | garam
com.bkjeon.composite.Folder | music
com.bkjeon.composite.File | track1
com.bkjeon.composite.File | track2
com.bkjeon.composite.Folder | picture
com.bkjeon.composite.File | pic1
com.bkjeon.composite.Folder | doc
com.bkjeon.composite.File | doc1
com.bkjeon.composite.Folder | usr
com.bkjeon.composite.File | java

 

참고

- https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4
- https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

yyyy-MM-dd 형태의 날짜 조회 방법  (0) 2019.12.26
<![CDATA[ ]]> 사용 이유  (0) 2019.12.24
[Design Pattern] Bridge Pattern  (0) 2019.12.12
[Design Pattern] Abstract Factory Pattern  (0) 2019.12.10
[Design Pattern] Builder Pattern  (0) 2019.12.08
Comments