본문 바로가기
Design Pattern

[Design Pattern] 컴포지트 패턴(Composite Pattern)에 대해 알아보자

by 개발자J의일상 2022. 7. 16.
반응형

Definition

컴포지트 패턴(Composite Pattern)으로 객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한다. 컴포지트 패턴을 사용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다.

 

복합 구조(Composite Structure)를 사용하면 복합 객체와 개별 객체를 대상으로 똑같은 작업을 적용할 수 있다. 즉, 복합 객체와 개별 객체를 구분할 필요가 거의 없어진다.

 

Composite 패턴은 공통 인터페이스를 공유하는 두 가지 기본 요소 유형인 단순 Leaf와 복합 컨테이너를 제공한다.

컨테이너는 Leaf와 다른 컨테이너로 구성될 수 있다. 이를 통해 Tree와 유사한 중첩된 재귀 객체 구조를 구성할 수 있다.

Situation

- 객체의 계층적 표현이 필요할 때

- 단일 객체와 복합 객체 모두 동일하게 다룰때

- Tree와 같은 객체 구조를 구현해야 하는 경우

- 클라이언트 코드가 단순 요소와 복합 요소를 모두 균일하게 처리해야하는 경우

 

Structure

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

Pros

- 복합 구조나 단일 객체나 동일한 코드로 작성되기 때문에 사용자 코드가 단순해진다.

- 복잡한 트리 구조를 보다 편리하게 사용할 수 있다. (다형성 재귀를 통해)

- Open/Close Principle. 객체 트리에서 작동하는 기존 코드를 손상시키지 않고 앱에 새 요소 유형을 도입할 수 있다.

Cons

- 기능이 너무 다른 클래스에 대해 공통 인터페이스를 제공하는 것은 어려울 수 있다. 특정 시나리오에서는 구성 요소 인터페이스를 과도하게 일반화하여 이해하기 어렵게 만들어야 한다.

- 설계가 지나치게 범용성을 많이 가진다. 복합체의 구성 요소에 제약을 가하기 힘들다.

비슷한 패턴

- 재귀적으로 작동하도록 구성(construction) 단계를 프로그래밍 할 수 있으므로 복잡한 Composite 트리를 만들 때 Builder를 사용할 수 있다.

 

- Chain of Responsibility는 종종 Composite와 함께 사용된다. 이 경우 Leaf 구성 요소가 요청을 받으면 모든 상위 구성 요소의 체인을 통해 개체 트리의 root까지 전달할 수 있다.

 

- Iterator를 사용하여 Composite 트리를 탐색할 수 있다.

 

- Visitor를 사용하여 전체 Composite 트리에 대해 작업을 실행할 수 있다.

 

- Composite 트리의 공유 Leaf 노드를 Flyweight로 구현하여 RAM을 절약할 수 있다.

 

- CompositeDecorator는 둘 다 재귀 합성에 의존하여 제한을 두지 않은 객체 수를 구성하기 때문에 유사한 구조 다이어그램을 갖는다.

- DecoratorComposite와 비슷하지만 하나의 자식 구성요소만 있다. 또한 Decorator는 래핑된 객체에 추가 책임을 추가하는 반면 Composite은 자식 객체의 결과를 "요약"한다.

- Decorator를 사용하여 Composite 트리에서 특정 객체의 동작을 확장할 수 있다.

- CompositeDecorator를 많이 사용하는 디자인은 종종 Prototype을 사용하여 이점을 얻을 수 있다. 패턴을 적용하면 복잡한 구조를 처음부터 재구성하는 대신 복제할 수 있다.

 

https://refactoring.guru/design-patterns/composite
헤드 퍼스트 디자인 패턴 개정판 - 에릭 프리먼, 엘리자베스 롭슨

 

300x250

댓글