JAVA/DesignPattern

Design Pattern 디자인 패턴 Composite Pattern 컴포지트 패턴

호두밥 2021. 12. 18. 20:15

Composite Pattern 컴포지트 패턴

컴포지트 패턴은 구조 패턴으로, 객체를 트리 구조로 관리할 수 있도록 해줍니다.  

구성요소

  1. Component :
    •  Client가 Leaf와 Composite에게 접근할 수 있도록 해주는 인터페이스
  2. Leaf :
    • 내부에 다른 클래스 요소를 포함하지 않는, 가장 밑 계층 요소
  3. Composite : 
    • 내부에 다른 클래스 요소를 포함하고 있는 요소. (leaf를 포함하고 있는 요소)
  4. Client : Component를 통해 외부에서 메세지를 요청하는 객체.

장단점

장점

  • 복잡한 트리 구조의 클래스들을 편하게 관리할 수 있습니다. (다형성과 재귀)
  •  기존의 코드를 수정하지 않고도 구조에 포함되는 새로운 클래스를 추가할 수 있습니다. (개방/폐쇄원칙)

단점

  • 기능이 많은 클래스를 Component 인터페이스에 포함될 수 있도록 설계하는 것이 어려울 수 있습니다. 또는 Component 인터페이스가 과도하게 추상화(일반화)되어 있어 다른 클래스를 포함하기 어려울 수도 있습니다. 

Composite Pattern 컴포지트 패턴 구현

 

 

component 필통 인터페이스

public interface 필통 {

    void 연필넣기(연필 연필);
    void 지우개넣기(지우개 지우개);

}

Composite 필통구현

public class 필통구현 implements 필통{

    private List<연필> 연필들;
    private List<지우개> 지우개들;

    public 필통구현() {
        this.연필들 = new ArrayList<>();
        this.지우개들 = new ArrayList<>();
    }

    @Override
    public void 연필넣기(연필 연필) {
        연필들.add(연필);
    }

    @Override
    public void 지우개넣기(지우개 지우개) {
        지우개들.add(지우개);
    }

    @Override
    public String toString() {
        return "필통구현{" +
                "연필들=" + 연필들.size() +
                ", 지우개들=" + 지우개들.size() +
                '}';
    	}
    }

Leaf 연필

public class 연필 {
    @Override
    public String toString() {
        return "연필";
    }
}

Leaf 지우개

public class 지우개 {
    @Override
    public String toString() {
        return "지우개";
    }
}

Client

public class Client {

    public static void main(String[] args) {
        필통 필통 = new 필통구현() ;

        필통.연필넣기(new 연필());
        필통.지우개넣기(new 지우개());

        System.out.println("필통 = " + 필통);

    }
}
필통 = 필통구현{연필들=1, 지우개들=1}

출처