OOP/Design Pattern

08. 컴포지트(Composite) 패턴

지구우중 2023. 2. 14. 13:43

컴포지트(Composite) 패턴: 구조패턴


 

객체들의 관계를 트리 구조로 구성하여 사용자로 하여금 복합 객체와 단일 객체를 구분없이 다룰 수 있도록 하는 패턴

위키백과

  • Component
    - Leaf 클래스와 전체에 해당하는 Composite 클래스에 공통 인터페이스를 정의
  • Leaf
    - 부분 클래스
    - Composite 객체의 부품으로 설정
  • Composite
    - 전체 클래스
    - 복수 개의 Leaf, 심지어 복수 개의 Composite 객체를 부분으로 가질 수 있음

 

정의에 나와있는 대로 객체들의 관계를 위의 내용을 토대로 하여 트리 구조로 만드는 것이 컴포지트 패턴!

대표적으로 폴더구조를 생각하면 이해하기 쉬울 것이다.

 

장점:

  • 객체들이 모두 같은 타입으로 취급되기 때문에 새로운 클래스 추가가 용이하다.
  • 단일객체, 집합객체 구분하지 않고 코드 작성이 가능하다.

단점:

  • 설계를 일반화 시켜 객체간의 구분, 제약이 힘들다.

FileSystem

public interface FileSystem {
    public int getSize();
    public void remove();
}

File

public class File implements FileSystem{
    private String name;
    private int size;

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

    @Override
    public int getSize() {
        System.out.println("파일 사이즈 : " + this.size);
        return this.size;
    }

    @Override
    public void remove() {
        System.out.println("삭제합니다");
    }
}

Folder

import java.util.ArrayList;

public class Folder implements FileSystem{
    private String name;
    private ArrayList<FileSystem> fileList;
    public Folder(String name){
        fileList = new ArrayList<>();
        this.name = name;
    }
    public void add(FileSystem fileSystem){
        this.fileList.add(fileSystem);
    }
    @Override
    public int getSize() {
        // 파일 리스트 돌면서 사이즈 get
        return 0;
    }

    @Override
    public void remove() {
        // 파일 리스트 돌면서 삭제
    }
}

파일 리스트안에 또 폴더가 있을 수 있다. 그 폴더안에는 자신만의 파일 리스트를 가질 수도 있고.

이런 식으로 트리구조를 만들 수 있다는 것!

 

 

Reference

https://magpienote.tistory.com/138