Free Lines Arrow
본문 바로가기
Design pattern/GoF(인강편)

[Design Pattern] Composite Pattern

by skahn1215 2022. 8. 15.
728x90
반응형

Composite pattern

컴포짓 패턴 이란?

  • composite 패턴은 Composite(디렉토리)과 Leaf(파일)을 동일시해서
    재귀적인 구조를 만들기 위한 설계 패턴이다.

 

어떻게 Composite(디렉토리)과 Leaf(파일)를 동일하게 여길까?

  • component 객체를 상속받아 Composite 와 Leaf 를 상속받도록 한다.
  • 그렇게 되면 다형성으로 Composite, Leaf 를 동일한 객체로 바라볼수 있다.

 

컴포짓 패턴 구조

  • Component : 최상의 객체
    -  다형성을 위해 최상의 객체를 하나 둔다.

  • Composite: 복합객체
    -  폴더를 담당한다.
    - 그렇기 때문에 List 가 존재하고 add, remove, getChild 메서드가 존재한다.

  • Leaf: 단일 객체
    - 파일 객체를 담당한다. 

 

컴포짓 패턴 구조 설명

  • 폴더 안에 폴더를 가지기 위해 다음과 같이 선언한다.
    - Composite 에 List<Component> 로 멤버변수를 선언한다.
  • 그렇게 되면 Leaf 도 담을수 있고 compsite 도 담을수 있게 된다.

 

컴포짓 패턴 구조 실습 예제

  • 위구조와 동일하다

 

 

Component Class

package patterns.composite;

public abstract class Component {
    protected String name; // 폴더 또는 파일 이름을 저장한다.

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

    public abstract String getName(); // 이름을 가져온다.
    public abstract int getSize();    // 폴더 및 파일의 사이즈를 구한다.
}

 

Directory Class

package patterns.composite;

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

public class Directory extends Component {
    List<Component> children = new ArrayList<>(); // 리스트를 가진다 상위 객체로 선언했기 때문에 
                                                  // Component 로 상속받은 모든 객체를 담을수 있다.
    public Directory(String name) {
        super(name);
    }

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

    @Override
    public int getSize() {
        int size = 0;
        for(Component component : children) {
            size += component.getSize();
        }
        return size;
    }

    public void add(Component component) {
        children.add(component);
    }


    public void remove(Component component) {
        children.remove(component);
    }

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

 

File Class

package patterns.composite;

public class File extends Component { // Component 	를 상속받아 구현한다.
    private int size = 0;
    public File(String name, int size) {
        super(name);
        this.size = size;
    }

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

    @Override
    public int getSize() {
        return size;
    }
}

 

Main class

package patterns.composite;

public class Main {
    public static void main(String[] args) {
        Directory root = new Directory("root");
        Directory music = new Directory("music");
        Directory downLoad = new Directory("Download");

        File song1 = new File("song1", 10);
        File song2 = new File("song2", 10);

        File zip1 = new File("zip1", 15);
        File zip2 = new File("zip2", 23);

        music.add(song1);
        music.add(song2);
        root.add(music);

        downLoad.add(zip1);
        downLoad.add(zip2);
        root.add(downLoad);

        System.out.println("RootFolderSize: " + root.getSize());
        System.out.println("DownLoadSize: " + downLoad.getSize());
        System.out.println("MusicFolderSize: " + music.getSize());

        PrintUtils.printList(downLoad);
    }
}

 

 

 

 

전체 소스코드:

https://github.com/rnrl1215/design-pattern/tree/main/src/main/java/patterns/composite

 

GitHub - rnrl1215/design-pattern

Contribute to rnrl1215/design-pattern development by creating an account on GitHub.

github.com

 

 

참고:
https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4

 

컴포지트 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

 

728x90
반응형

댓글