PSD( Private-Self-Development )

복합체 패턴 본문

Backend/디자인패턴

복합체 패턴

chjysm 2023. 5. 19. 15:36

복합체 패턴?

객체를 트리 구조로 구성 하고, 이를 재귀적으로 순회하며 작업 하기 위한 패턴입니다.

 

4가지 구성 요소

  • Component : Composite 과 Leaf 에 공통적으로 적용되는 인터페이스 입니다. (투명성 제공을 위함)
  • Composite(복합 객체) : 자식을 가지는 요소입니다. (ex. 폴더)
  • Leaf(일반 객체) : 자식을 가지지 않는 요소입니다. (ex. 파일)
  • Client : 복합체를 사용하는 곳 Composite 이든 Leaf 든 동일한 방식으로 사용 가능 하다.

 

투명성? 

두 가지 서로 다른 구성 요소를 동일한 형태로 투명하게 사용하기 위해 일반화 작업을 실행한다. (주로, 동일한 추상 클래스나 인터페이스 를 상속 받는다.)

이러한 투명성은 사용자에게 동일한 방법으로 객체에 접근할 수 있도록 합니다.

 

복합체 패턴의 장점 

  • 사용자가 트리 구조의 복잡한 세부 사항을 몰라도 사용 가능하다.
  • 개방/패쇄 원칙

 

복합체 패턴의 단점 

  • Component 구성 요소는 투명성 제공을 위해 단일 책임 원칙을 위반한다.(Leaf 관련 기능, Composite 관련 기능 이 같이 존재)
  • 기능이 너무 다른 클래스들은 적용이 제한적.
  • 혹은 인터페이스를 과도하게 일반화 하여 이해하기 어려울 수 있다.

 

// Component
public abstract class FileRoot {
    public abstract String getData();
}

// Composite(복합 객체)
public class Directory extends FileRoot{

    private final List<FileRoot> files = new ArrayList<FileRoot>();

    public List<FileRoot> add(FileRoot file){
        files.add(file);
        return files;
    }

    public List<FileRoot> remove(FileRoot file){
        files.remove(file);
        return files;
    }
    public List<FileRoot> getFile(){
        return files;
    }

    @Override
    public String getData() {
        StringBuilder sb = new StringBuilder();
        for( FileRoot file : files ){
            sb.append(file.getData());
        }
        return sb.toString();
    }
}

// Leaf(일반 객체)
@Getter
@Setter
public class File extends FileRoot{

    private String data;

    @Override
    public String getData() {
        return data;
    }
}

 

언제 사용해야 할까?

  • 객체들을 트리 구조로 묶을 수 있을 때
  • 일반 객체 와 이를 포함하는 복합 객체를 모두 균일하게 처리하고 싶을 때

 

 


참조

https://refactoring.guru/ko/design-patterns/composite

'Backend > 디자인패턴' 카테고리의 다른 글

파사드 패턴  (0) 2023.05.23
장식자 패턴  (0) 2023.05.22
브리지 패턴  (0) 2023.05.15
디자인 패턴  (0) 2023.05.15
어댑터 패턴  (0) 2023.05.15