디자인 패턴 중 Composite 패턴에 대해 설명합니다.
개념
트리 구조로 객체를 구성하는 패턴입니다. 객체 구조를 하위 요소가 포함된 복합 객체와 하위 요소가 없는 단일 객체로 구성된 트리 구조로 표현합니다. 클라이언트에 복합 객체와 단일 객체에 대해 알 필요가 없도록 동일한 인터페이스를 제공합니다. 복합 객체의 하위 요소로는 단일 객체뿐 아니라 복합 객체도 포함될 수 있습니다.
- Component: 클라이언트에게 제공하는 인터페이스입니다. Leaf, Composite에 필요한 주요 로직을 메소드로 정의합니다.
- Leaf: 하위 요소가 없는 단일 객체입니다. 인터페이스를 구현합니다.
- Composite: 하위 요소를 포함하는 복합 객체입니다. 하위 요소에게 작업을 위임하고 종합 결과를 반환하는 식으로 인터페이스를 구현합니다. 추가로 하위 요소 추가/삭제에 대한 메소드도 정의합니다.
다음과 같은 장점이 있습니다.
- 복잡한 트리 구조를 다형성과 중첩 재귀를 통해 간편하게 취급할 수 있습니다.
적용 예시
그래픽 소프트웨어를 개발중이라고 가정합니다. 개체들을 그룹으로 지정하는 기능을 추가할 예정입니다. 그룹도 이동, 삭제 같은 기능들을 동일하게 수행할 수 있어야 하고 중첩 그룹도 가능해야 합니다.
위의 그룹은 아래의 4개 개체로 이뤄져 있습니다.
그룹(복합객체)에 이동 명령을 내리면 하위 개체들도 모두 이동을 수행해야 합니다. Composite 패턴을 사용하면 이를 해결할 수 있습니다.
from abc import ABC, abstractmethod
from typing import List
class Graphic(ABC):
@abstractmethod
def move(self): ...
class Shape(Graphic):
def move(self):
print("move")
class Group(Graphic):
def __init__(self) -> None:
self._children: List[Graphic] = []
def add (self, child: Graphic) -> None:
self._children.append(child)
def remove(self, child: Graphic) -> None:
self._children.remove(child)
def move(self):
for child in self._children:
child.move()
Graphic 인터페이스를 구현하는 단일 객체 Shape와 복합 객체 Group을 정의합니다. Group의 move를 호출하면 전체 하위 요소가 같이 이동됩니다.
참조
'객체 지향 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - Facade (0) | 2023.10.28 |
---|---|
디자인 패턴 - Decorator (1) | 2023.10.25 |
디자인 패턴 - Bridge (0) | 2023.10.21 |
디자인 패턴 - Adapter (0) | 2023.10.12 |
디자인 패턴 - Singleton (0) | 2023.10.11 |