본문 바로가기
Programming/DesignPattern

[디자인 패턴] 컴포지트(Composite) 패턴

by Blemish 2021. 6. 4.

Goal

  • 컴포지트 패턴을 이해한다.

 

컴포지트(Composite) 패턴

 

전체 - 부분의 관계를 갖는 객체들 사이의 관계를 정의할 때 유용한 패턴

 

 

클래스 다이어그램

 

  • Component : 구체적인 부분, 즉 Leaf 클래스와 전체에 해당하는 Composite 클래스에 공통 인터페이스를 정의
  • Leaf : 구체적인 부분 클래스
  • Composite : 전체 클래스로 복수 개의 Component를 갖도록 정의. 복수 개의 Leaf를 가질 수 있다.

 

컴포지트 패턴은 부분 - 전체의 관계를 갖는 객체들을 정의할 때 유용하다. 예를 들어서 컴퓨터(전체)와 [모니터, 마우스, 스피커](부분)의 관계를 정의할 때 사용할 수 있다.

 

 

컴퓨터와 컴퓨터에 추가 장치를 지원하는 기능을 구현해보자

 

우선 컴퓨터를 모델링할 때 기본적으로 키보드, 본체, 모니터를 구성장치로 구현할 수 있다. 따라서 클래스 다이어그램에는 컴퓨터(Computer) 클래스와 그 외 구성 장치 사이의 관계를 합성 관계로 표현할 수 있다.

 

클래스 다어이그램

 

클래스 다이어그램을 통해서 Computer 클래스와 Keyboard, body, monitor 클래스는 서로 연관관계가 있음을 알 수 있다. 각 구성장치는 가격과 전력 소비량을 속성으로 갖는다. 그리고 Computer 클래스에서 각 구성 장치의 가격과 전력 소비량을 종합하여 계산한다.

 

 

Question

  • 새로운 구성 장치를 추가해야한다면(스피커, 헤드셋, 마우스 등)                                                                           -> 기존 방식처럼 새로운 구성 장치에 대한 클래스를 구현한 다음 Computer 클래스에 추가하면 된다. 하지만 이러한 방식으로 계속할 경우 Computer 클래스를 계속 수정해야 하기 때문에 OCP에 위배된다.

 

클래스 다이어그램

위의 클래스 다이어그램은 위의 질문(Question)에 대한 문제점을 해결할 수 있도록 개선한 클래스 다이어그램이다.

 구성장치들의 공통적인 속성을 포함하고 있는 상위 클래스(ComputerDevice)를 정의하여 기존 구성 장치 클래스들과 일반화 관계를 형성하게 하였으며 Speaker 클래스를 추가하였다. 또한 Computer 클래스에서는 ComputerDevice 복수 개의 객체를 갖는 것으로 표현했다. 게다가 Computer 클래스는 ComputerDevice 클래스의 하위 클래스로 정의했다. Computer 클래스도 ComputerDevice 클래스의 일종이라고 볼 수 있다. 

 

 

 

결론적으로 Monitor, Body 등의 객체가 Computer 클래스 전체 객체의 일부분으로 정의되었다. 이런 경우 부분 객체의 추가나 삭제 등이 있어도 전체 객체의 클래스 코드를 변경하지 않으면 컴포지트 패턴은 유용하다.

 

댓글