컴포지트 패턴

문딤·2022년 7월 26일
0

컴포지트 패턴

컴포지트 패턴이란?

컴퍼지트 패턴은 단일 객체와 그 객체들을 가지는 집합 객체를 같은 타입으로 취급하며, 트리 구조로 객체들을 엮는 패턴이다.

[ 해당 패턴을 사용하는 경우 ]

  1. 복합 객체와 단일 객체의 처리 방법이 동일한 경우, 전체-부분 관계를 정의할 수 있다.
  2. 객체들 간에 계급 및 계층 구조가 있고 이를 표현해야 할 경우,
  3. 대표적으로 Directory-File 관계가 존재한다.

Component

Leaf와 Composite 가 구현해야하는 Interface 로, Leaf 와 Composite 는 모두 Component 라는 같은 타입으로 다뤄진다.

Leaf

단일 객체로 Composite 의 부분(자식) 객체로 들어가게 된다.
이 때, Component 의 형태로 들어간다.

Composite

집합 객체로 Leaf 객체나 Composite 를 부분(자식)으로 둔다.
이 때, Component 의 형태로 들어간다.
클라이언트는 이 Composite 를 통해 부분 객체들 (Leaf 나 Composite) 을 다룰 수 있다.

예시

Node
표현할 요소들이 선언되는 추상 메소드 집합 💨 인터페이스

interface Node{
    public String getName();
}

File
Node에서 지정된 요소를 구현한 leaf요소.

class File2 implements Node{
    private String name;
    @Override
    public String getName(){
        return name;
    }

}

Directory
leaf 요소를 관리하기위한 컴포지트 클래스

class Directory2 implements Node{
    private String name;
    private List<Node>children;

    @Override
    public String getName() {
        return name;
    }
    public void add(Node node){
        children.add(node);
    }
}

Main

폴더에 file을 추가하듯 leaf 요소를 추가

 public static void main(String[] args) {

        Directory2 dir = new Directory2();
          dir.add(new File2()); // 디렉토리에 파일 하나를 삽입!
          dir.add(new File2()); // 디렉토리에 파일 하나를 삽입!
          dir.add(new Directory2()); // 디렉토리에 디렉토리를 삽입!
        Directory2 secondDir = new Directory2();
          secondDir.add(dir);
          secondDir.add(dir);
    }
    }

컴포지트 패턴의 장단점

⭕장점

복잡한 트리 구조를보다 편리하게 사용할 수 있다.
다형성 재귀를 유리하게 사용한다.
오픈 / 클로즈 원칙.
기존의 코드를 건드리지 않고 새로운 요소 유형을 응용 프로그램에 도입 할 수 있다.
기존의 코드는 객체 트리에서 기능 할 수있게 되었다.

❌단점

기능이 크게 다른 클래스에 공통 인터페이스를 제공하는 것은 어려울 수 있다.
특정 시나리오에서는 구성 요소 인터페이스를 지나치게 일반화해야 이해하기 어려울 수 있다.

참고

https://jdm.kr/blog/228

https://mygumi.tistory.com/343

profile
풀스택개발자가 될래요

0개의 댓글