-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Composite 패턴은 객체를 트리 구조로 구성하여 하나의 객체인 것처럼 작업할 수 있는 구조 패턴입니다. 폴더 구조가 복잡하게 얽혀 있고, 내부에 파일이 있는 것을 생각하면 이해하기 쉽습니다. 세 가지 유형을 사용합니다.
- component 프로토콜은 트리의 모든 객체가 사용가능한 인터페이스를 선언합니다
- 하위 객체에 접근하고 관리하기 위한 인터페이스를 선언합니다
- leaf는 하위 요소가 없는 가장 기본 단위의 구성 요소입니다
- 기본 객체에 대한 작업을 구현합니다
- composite는 leaf 객체와 다른 composite를 담을 수 있는 컨테이너입니다
- 하위 객체의 구체적인 클래스는 모르지만 모든 객체는 Component에서 정의한 인터페이스를 따르니까 상관없습니다.
- 하위 객체에 접근하고 무언가를 요청할 작업들을 구현합니다.
composite 노드와 leaf 노드 모두 component 프로토콜에서 파생됩니다. composite 객체 속에 여러 가지 leaf 클래스를 보유할 수도 있습니다.
예를 들어, 배열은 composite입니다. component는 배열 자체입니다. composite은 배열을 활용한 private 컨테이너로써 leaf 객체를 소유합니다. 각 leaf는 Int, String 등 배열에 추가할 수 있는 구체적인 유형을 따릅니다.
사용
앱의 클래스 계층 구조가 분기를 형성하는 경우 분기 및 노드에 대해 두 가지 타입의 클래스를 생성하려고 한다면, 해당 클래스가 통신하기 어려울 수 있습니다.
분기와 노드를 프로토콜을 따르게 하여 동일하게 처리함으로써 Composite 패턴을 통해 문제를 해결할 수 있습니다. 이렇게 하면 모델에 추상화 계층이 추가되고 궁극적으로 복잡성이 줄어듭니다.
주의 사항
Composite 패턴을 사용하기 전에 앱에 분기 구조가 있는지 확인해야합니다. 객체에 동일한 코드가 많이 있는 경우 Composite 패턴을 준수하는 것이 좋지만 프로토콜과 관련된 모든 상황이 Composite 객체를 필요로 하는 것은 아닙니다. 또한, 완전히 새로운 타입의 객체들은 추가하기 어렵기에 이럴 경우에는 다른 패턴을 고민해 보아야 합니다.
정리
- 객체들을 트리 구조(part-whole 계층)으로 나타내고 싶을 때, 그룹화하여 하나의 개체인 것처럼 조작하는 구조 패턴입니다.
- Leaf, Composite로 구성된 클래스들의 계층 구조를 만들 수 있습니다.
- 앱의 클래스 계층 구조가 분기 패턴을 형성하는 경우에 유용합니다.
- Component 프로토콜을 기준으로 클라이언트가 객체 구성과 개별 객체 간 차이를 무시하고 모든 객체를 똑같이 취급하고 싶을 때 사용합니다.
- 프로토콜은 모델에 추상화 계층을 추가하여 모델의 복잡성을 줄입니다.
- 클라이언트의 코드가 단순해져 코드를 더 자주 재사용하고 클래스의 복잡성을 줄일 수 있습니다.
- Component 프로토콜을 따르는 새로운 구성 요소는 쉽게 추가할 수 있습니다.