Design Patterns

[Design Patterns] Composite

우라릭 2024. 3. 17. 23:55

 

 

목차

    개요

    이번 글에선 Object Structural Pattern인 컴포 패턴에 대해 알아보겠습니다

    내용

    요약

    부분-전체 계층구조를 표현하기 위해 객체를 트리 구조로 합치자

    예시

    디자인 패턴의 단골 예시인 파워포인트, 구글 스라이드같은 GUI 앱을 생각해봅시다. 파워포인트는 큰 요소를 만들기 위해 작은 요소들을 하나의 그룹으로 묶을 수 있습니다. 

    이러한 GUI 앱을 만들기 위해 가장 처음 생각해볼만한 구조는 Text, Line, Square같은 primitive 클래스를 정의하고 이를 담을 수 있는 container 클래스를 작성하는 것입니다.

    하지만 이러한 구조는 단점이 있습니다. 이 클래스를 쓰는 개발자들은 반드시 primitive와 container를 따로 취급해줘야 한다는 것입니다. 컴포짓 패턴은 사용자들이 이런 구분을 할 필요가 없게 해줍니다.

    컴포짓 패턴의 핵심은 primitive와 container를 모두 포함하는 추상 클래스를 정의하는 것입니다. 이 클래스를 이용해 재귀적으로 트리 구조를 만들 수 있습니다.

    구조

    이야깃거리

    이 패턴을 구현할 땐 고려해야할 점이 꽤 있습니다.

    • 부모 객체 참조 변수. 자식이 부모 객체의 참조를 가지고 있으면 편합니다.
    • 컴포넌트 인터페이스 극대화. 사용자가 리프 노드와 컨테이너 노드를 모르게 하려면 컴포넌트 인터페이스에 최대한 많은 공통 연산을 넣는 것이 좋습니다.
    • 그 외 트리 구조를 구현할 때 고민할만한 여러가지 내용들도 같이 고려해주면 좋습니다.

    언제 써야 할까?

    • 부분 전체 계층 구조의 객체들을 표현하고 싶을 때
    • 사용자가 합쳐진 객체와 각각의 객체의 구분을 할 필요가 없게하고 싶을 때

    장단점

    • (Pros) 사용자에게 사용하기 쉬운 인터페이스를 제공해줍니다.
    • (Cons) 컴포넌트 인터페이스를 너무 과하게 일반화하면 이해하기 어려워집니다.

    Case Study

    Case 1. Java AWT

    자바의 GUI 프레임워크 중 하나인 AWT는 컴포짓 패턴의 아주 전형적인 예입니다. java.awt 패키지의 클래스들을 살펴보면 Component, Container 클래스를 볼 수 있는데 위 구조와 거의 같은 역할을 합니다. 

    출처

    GoF Design Patterns

     

    'Design Patterns' 카테고리의 다른 글

    [Design Patterns] Facade  (0) 2024.03.24
    [Design Patterns] Decorator  (0) 2024.03.20
    [Design Patterns] Bridge  (0) 2024.03.16
    [Design Patterns] Adapter  (0) 2024.03.16
    [Design Patterns] Singleton  (0) 2024.02.25