hong's android

[디자인 패턴] 컴포지트 패턴 본문

Design-Pattern

[디자인 패턴] 컴포지트 패턴

_hong 2023. 3. 21. 10:30

컴포지트 패턴(Composite Pattern)

객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한다. 

컴포지트 패턴을 사용하면 클라이언트에서 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있다.

 

서브 클래스안에 서브 클래스와 값이 존재 해야할때 모든 클래스들을 탐색하거나 단일 클래스를 호출할때

클라이언트에서 신경써야하는 부분들이 한 두개가 아니다. 

 

node(leaf를 가지고 있는 원소) 와 leaf(자식이 없는 원소) 모두 똑같은 패턴으로 호출 할 수 있다. 

최상단 node가 있고 하위에 노드와 leaf가 섞여있어도 전체를 대상으로 작업을 수행할수도 있다.

 

 

클라이언트는 Component 형태의 Leaf, Composite를 다룬다.

하지만 Composite는 계층 구조를 관리하는 일과 메뉴 관련 작업을 처리해야 한다. 그러므로 단일 역할 원칙이 깨진다고 볼 수 있다. 

 

 

Composite와 Leaf를 노드로 가지는 트리 형태의 객체 구조를 만들 수 있다.

전체를 대상으로 동일한 작업을 할 수 있다. 

예를들어, Component로부터 Leaf와 Composite는 print를 상속받아 구현을 한다. 이때 동일한 print 메소드를 구현하지만 Leaf와 Composite의 구현은 다르다. Client가 상위 트리의 Composite에게 print를 요청하면 하위의 노드들 전부 내용물을 print할 수 있다.

 

클라이언트에서 봤을 때 컴포지티트 패턴을 투명하게 작동해야한다.

클라이언트가 각 객체의 인터페이스를 신경 쓰게 되는것은 처음 달성 하고자하는 목적과 다르다.

그래서 Leaf와 Composite 모두 동일한 인터페이스를 제공해야한다. 

하지만 그렇게 구현되면 Composite엔 필요한데 Leaf에선 필요하지 않는 메소드들이 존재할 수 있다.

그런 상황에서 아무일도 하지 않거나, 상황에 맞게 false를 리턴 할수도 있다. 

 

복잡하거나, 복합 객체 전체를 도는데 너무 많은 자원이 필요하다면 복합 노드를 캐싱해 두면 도움이 된다.

예를 들어, 복합 객체에 있는 모든 자식이 어떤 계산을 하고, 그 계산을 반복 작업한다면 계산 결과를 임시로 저장하는 캐시를 만들어서 속도를 향상할 수 있다.

 

 

Reference.

1.헤드 퍼스트 디자인 패턴

 

* 디자인 패턴 구현 깃허브

https://github.com/f-lab-edu/DesignPatternStudy/tree/main/app/src/main/java/com/example/designpatternstudy