문제 및 이론 정리/디자인패턴

[디자인패턴] Composite - 그릇과 내용물을 동일시한다

hail2y 2025. 2. 23. 00:59

책 [JAVA 언어로 배우는 디자인 패턴 입문 3판;유키 히로시 저]을 참고하여 작성하였습니다. 

 

그릇과 내용물을 동일시하여 재귀적인 구조를 형성

디렉토리(그릇), 파일(내용물)을 디렉토리 엔트리라는이름으로 같은 종류로 동일시

 

 

Leaf 내용물, 이 안에 다른 것을 넣을 수 없다, File 클래스

Composite 그릇, Leaf와 Composite을 넣을 수 있다, Directory 클래스

Component Leaf와 Composite을 동일시하기 위한 역할, 공통되는 상위 추상 클래스, Entry

Main

 

 

Directory클래스

public class Directory extends Entry { // Entry는 File과 Directory의 공통 추상 클래스
    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
    public void printList(String prefix) { // 재귀적 구조로 호출
        System.out.println(prefix + "/" + this);
        for (Entry entry: directory) {
            entry.printlist(prefix + "/" + name); // 넘기는 값이 name인 점을 다시 보자
        }
    }
    
    public Entry add(Entry entry) {
        directory.add(entry);
        return this;
    }
}

 

1. 복수와 단수의 동일시라고 볼 수 있다

- 여러 개를 모아 마치 하나의 것처럼 취급

- 여러 개를 모아 하나로 다루지만 그 안에서 개별적으로 처리 가능

 

2. 글머리기호, 일반적으로 트리 구조로 된 데이터 구조는 Composite 패턴에 해당한다

  • 항목
    • 이 안에 또 다른 항목을 추가하여 재귀적 구조 가능
    • 항목
      • 항목
  • 항목
  • 항목

 

Decorator 패턴은 장식틀과 내용물을 동일시하고, Composite 패턴은 그릇과 내용을 Component 역으로 동일시한다. 마찬가지로 Decorator 패턴도 재귀 구조를 활용하는데, Decorator 패턴은 유연하게 기능을 추가하기 위해 활용하고 Composite 패턴은 그릇과 내용물을 동일시하는 부분에 주안점을 둔다.