컴포지트 패턴
컴포지트 패턴은 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 만드는 패턴이다. 이 패턴은 전체-부분 간의 계층을 일관적으로 다룰 수 있도록 해준다.
구성
컴포지트 패턴은 세 가지 주요 구성요소로 이루어져 있다.
컴포넌트 (Component)
컴포넌트는 전체-부분 계층 구조에서 전체와 부분 모두에 해당하는 추상 클래스이다. 이 클래스는 전체와 부분이 동일한 인터페이스를 가지도록 하여 일관성을 유지하며, 전체에 대한 동작과 부분에 대한 동작을 정의한다.
리프 (Leaf)
리프는 전체-부분 계층 구조에서 더 이상 부분으로 나눌 수 없는 최하위 객체이다. 이 클래스는 컴포넌트의 하위 클래스로 이루어져 있으며, 전체-부분 계층 구조에서 단말 노드 역할을 한다.
컴포지트 (Composite)
컴포지트는 전체-부분 계층 구조에서 전체에 해당하는 객체이다. 이 클래스는 컴포넌트의 하위 클래스로 이루어져 있으며, 자식 컴포넌트를 가질 수 있다. 이러한 자식 컴포넌트는 또 다른 컴포지트나 리프가 될 수 있다.
활용
컴포지트 패턴은 다음과 같은 경우에 사용할 수 있다.
•
전체-부분 계층 구조를 가진 객체들 간의 일관성 있는 처리가 필요한 경우
•
부분을 나타내는 객체와 전체를 나타내는 객체를 구분하지 않고 일관성 있게 다루어야 하는 경우
•
객체들의 트리 구조를 사용하여 복합 객체를 만들어야 하는 경우
예제
컴포지트 패턴을 사용하여 파일 시스템을 구현하는 예제를 살펴보자.
class Component:
def __init__(self, name):
self.name = name
def add(self, component):
pass
def remove(self, component):
pass
def display(self):
pass
class Leaf(Component):
def display(self):
print(self.name)
class Composite(Component):
def __init__(self, name):
super().__init__(name)
self.children = []
def add(self, component):
self.children.append(component)
def remove(self, component):
self.children.remove(component)
def display(self):
print(self.name)
for child in self.children:
child.display()
root = Composite("root")
root.add(Leaf("file1"))
root.add(Leaf("file2"))
subdir = Composite("subdir")
subdir.add(Leaf("file3"))
subdir.add(Leaf("file4"))
root.add(subdir)
root.display()
Plain Text
복사
위 예제에서는 컴포넌트, 리프, 컴포지트 클래스를 정의하고, 파일 시스템을 구현하는데 사용하였다. 이 예제에서는 파일 시스템의 폴더와 파일을 트리 구조로 표현하였고, 컴포지트 패턴을 사용하여 전체-부분 계층 구조를 일관적으로 처리하였다.