코드/GOF

디자인 패턴 - 구조(Structural)패턴 (3)컴포지트 패턴(Composite Pattern)

미로처럼 2024. 3. 13. 09:54
728x90

객체들을 트리 구조로 구성하는 방법을 제공하며 개별 객체와 복합 객체를 일관된 방식으로 다룰 수 있게 해주고, 객체 간의 전체-부분 계층을 표현할 수 있도록 합니다.

 

이 패턴의 주요 아이디어는 단일 객체와 복합 객체를 동일한 인터페이스로 다루기 입니다.

 

이를 통해 클라이언트는 개별 객체와 복합 객체를 구별하지 않고 일관된 방식으,로 즉, 클라이언트는 개별 객체든 복합 객체든 동일한 방식으로 메소드를 호출하여 사용할 수 있습니다.

 

컴포지트 패턴 구조

 

Component: 복합 객체와 개별 객체를 동일한 인터페이스로 표현하는 역할이며 복합 객체와 단일 객체에 대한 공통 작업을 선언합니다. 

 

Composite: 복합 객체로서, Leaf 역할이나 Composite 역할을 넣어 관리하는 역할을 한다. 

Component 구현체들을 내부 리스트로 관리한다.

add와 remove 메소드는 내부 리스트에 단일 / 복합 객체를 저장

Component 인터페이스의 구현 메서드인 operation은 복합 객체에서 호출되면 재귀하여, 추가 단일 객체를 저장한 하위 복합 객체를 순회하게 된다.

 

Leaf: 단일 객체로서, 단순하게 낸용물을 푯기하는 역할을 한다.

Component 인터페이스의 구현 메서드인 operation은 단일 객체에서 호출되면 적절한 값만 반환 한다.

 

 

 

 

클라이언트에서 operratio 메서드를 호출하게되면, 단일 객체일 경우 값이 호출되고 복합체일 경우 자기 자신을 호출하는 재귀 함수에 의해 저장하고 있는 하위 leaf 객체들을 순회하여 호출하게 된다.

 

 

사용 시기

데이터를 다룰때 계층적 트리 표현을 다루어야 할때

복잡하고 난해한 단일/ 복합 객체 관계를 간편히 단순화하여 균일하게 처리하고 싶을때

 

 

장점

 

단일체와 복합체를 동일하게 여기기 때문에 묶어서 연산하거나 관리할 때 편하다.

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

수평적, 수직적 모든 방향으로 객체를 확장할 수 있다.

새로운 Leaf 클래스를 추가하더라도 클라이언트는 추상화된 인터페이스 만을 바라보기 떄문에 개방 폐쇄 원칙을 준수

 

 

단점

 

재귀 호출 특징 상 트리의 깊이가 깊어질 수록 디버깅에 어려움이 생긴다.

설계가 지나치게 범용성을 갖기때문에 새로운 요소를 추가할 때 복합 객체에서 구성요소에 제약을 갖기 힘들다.

예를 들어, 계층형 구조에서 leaf 객체와 composite 객체들을 모두 동일한 인터페이스로 다루어야 하는데, 이 공통 인터페이스 설계가 까다로울 수 있다.

복합 객체가 가지는 부분 객체의 종류를 제한할 필요가 있을때

수평적 방향으로만 확장이 가능하도록 Leaf 를 제한하는 Composite를 만들때 

 

 

728x90