도서 요약 / / 2023. 1. 15. 21:14

[JAVA 언어로 배우는 디자인 패턴 입문] Composite 패턴

'JAVA 언어로 배우는 디자인 패턴 입문'의 내용을 정리한 것입니다.

Composite 패턴

  • 디렉터리는 중첩된 구조, 재귀적인 구조를 만들어 낸다.
  • 그릇과 내용물을 같은 종류로 취급하면 편리한 경우가 있다. 작은 그릇 안에 더 작은 그릇을 넣는 식으로 중첩된 구조, 재귀적인 구조를 만들 수 있다.

예제 프로그램

  • 파일을 나타내는 File 클래스, 디렉터리를 나타내는 클래스인 Directory 클래스, 그 둘을 취합하는 상위 클래스인 Entry 클래스


Entry 클래스

public abstract class Entry {

    public abstract String getName();

    public abstract int getSize();

    public void printList() {
        printList("");
    }

    protected abstract void printList(String prefix);

    @Override
    public String toString() {
        return getName() + " (" + getSize()+ ")";
    }
}

File 클래스

public class File extends Entry {

    private String name;

    private int size;

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

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

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

    @Override
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }
}

Directory 클래스

public class Directory extends Entry {

    private String name;

    private List<Entry> directory = new ArrayList<>();

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

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

    @Override
    public int getSize() {
        int size = 0;
        for (Entry entry: directory) {
            size += entry.getSize();
        }
        return size;
    }

    @Override
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
        for (Entry entry: directory) {
            entry.printList(prefix + "/" + name);
        }
    }

    public Entry add(Entry entry) {
        directory.add(entry);
        return this;
    }
}

Main 클래스

public class Main {

    public static void main(String[] args) {
        System.out.println("Making root entries...");
        Directory rootdir = new Directory("root");
        Directory bindir = new Directory("bin");
        Directory tmpdir = new Directory("tmp");
        Directory usrdir = new Directory("usr");
        rootdir.add(bindir);
        rootdir.add(tmpdir);
        rootdir.add(usrdir);
        bindir.add(new File("vi", 10000));
        bindir.add(new File("latex", 20000));
        rootdir.printList();
        System.out.println();
    }
}

실행 결과

Making root entries...
/root (30000)
/root/bin (30000)
/root/bin/vi (10000)
/root/bin/latex (20000)
/root/tmp (0)
/root/usr (0)

Leaf(잎) 역

  • 내용물을 나타낸다. 이 안에는 다른 것을 넣을 수 없다.
  • File 클래스가 이 역할

Composite(복합체) 역

  • 그릇을 나타내며 Leaf 역이나 Composite 역을 넣을 수 있다.
  • Directory 클래스가 이 역할

Component 역

  • Leaf 역과 Composite 역을 동일시하기 위한 역할
  • Entry 클래스가 이 역할

Client(의뢰자) 역

  • Composite 패턴의 사용자
  • Main 클래스가 이 역할

정리

  • Composite 패턴은 그릇과 그 내용물을 동일시하는 패턴이다. 그릇 안에 무엇이 들어있던 간에 하나의 컴포넌트로 취급하여 클라이언트에서 사용한다.
  • 일반적으로 재귀구조에서 많이 사용한다. (윈도 시스템)



반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유