컴포지트 패턴은 객체지향 디자인 패턴 중 하나로, 객체들을 트리 구조로 구성하여 전체-부분 계층을 나타내는 패턴입니다. 이 패턴은 개별 객체와 복합 객체를 모두 동일하게 취급함으로써 클라이언트 코드의 일관성을 유지하면서 복잡한 계층 구조를 관리할 수 있습니다.
1. 간단한 설명과 구조
예를 들어, 파일 시스템에서 디렉토리와 파일은 모두 파일 시스템 트리의 노드입니다. 디렉토리는 하위 디렉토리와 파일을 가질 수 있으며, 파일은 데이터를 가지고 있습니다. 따라서 디렉토리와 파일을 모두 파일 시스템의 노드로 취급하고, 디렉토리의 경우 하위 노드를 포함하는 복합 객체로 취급하여 계층 구조를 유지할 수 있습니다.
1) 컴포지트 패턴의 구성
- Component : Leaf와 Composite 객체가 공통으로 구현해야 하는 인터페이스를 정의합니다.
- Leaf : 복합 객체에서 가장 작은 개별 객체를 나타내는 클래스입니다.
- Composite : 하위 객체를 포함하는 복합 객체를 나타내는 클래스입니다.
2. 예제 코드
from abc import ABC, abstractmethod
class Component(ABC):
"""
Component 클래스는 Leaf와 Composite 객체가 공통적으로 갖는 인터페이스를 정의합니다.
"""
@abstractmethod
def operation(self) -> None:
pass
class Leaf(Component):
"""
Leaf 클래스는 복합 객체에서 가장 작은 개별 객체를 나타냅니다.
"""
def operation(self) -> None:
print("Leaf operation")
class Composite(Component):
"""
Composite 클래스는 하위 객체를 포함하는 복합 객체를 나타냅니다.
"""
def __init__(self) -> None:
self._children = []
def add(self, component: Component) -> None:
self._children.append(component)
def remove(self, component: Component) -> None:
self._children.remove(component)
def operation(self) -> None:
print("Composite operation")
for child in self._children:
child.operation()
# 클라이언트 코드
def client_code(component: Component) -> None:
component.operation()
# Leaf 객체 생성
leaf = Leaf()
client_code(leaf)
# Composite 객체 생성
composite = Composite()
composite.add(Leaf())
composite.add(Leaf())
# Composite 객체 내 Leaf 객체 출력
client_code(composite)
이 코드에서 Component 클래스는 추상 클래스로 정의되어 있으며, Leaf 클래스와 Composite 클래스는 이를 상속받아 구현됩니다.
3. 장점
- 객체들을 트리 구조로 구성하여 전체-부분 계층을 표현하기 때문에 복잡한 계층 구조를 쉽게 관리할 수 있습니다.
- 개별 객체와 복합 객체를 동일하게 취급하기 때문에 클라이언트 코드의 일관성을 유지할 수 있습니다.
- 객체를 추가하거나 삭제하기 쉽고, 새로운 종류의 객체를 추가하기도 용이합니다.
- 코드의 확장성과 유연성이 좋습니다.
4. 단점
- Leaf와 Composite 클래스가 공통 인터페이스를 구현하므로, 특정 클래스에 대한 코드 변경이 있을 때 모든 클래스를 수정해야 할 수 있습니다.
- 일반적으로 개별 객체와 복합 객체는 다른 속성을 가지므로, 모든 객체가 동일한 인터페이스를 갖는 것이 항상 적절하지 않을 수 있습니다.
- 불필요한 복잡도를 추가할 수 있으며, 작은 규모의 계층 구조에서는 적절하지 않을 수 있습니다.
'설계' 카테고리의 다른 글
[디자인 패턴] 퍼사드 패턴 (Facade Pattern) - python 예제 코드 (0) | 2023.03.08 |
---|---|
[디자인 패턴] 데코레이터 패턴 (Decorator Pattern) - python 예제 코드 (0) | 2023.03.07 |
[디자인 패턴] 브릿지 패턴 (Bridge Pattern) - python 예제 코드 (0) | 2023.03.07 |
[디자인 패턴] 어댑터 패턴 (Adapter Pattern) - python 예제 코드 (0) | 2023.03.07 |
[디자인 패턴] 싱글턴 패턴 (Singleton Pattern) - python 예제 코드 (0) | 2023.03.06 |