2024. 10. 17. 00:29ㆍDesign Pattern
Composite 패턴\
Composite 패턴은 구조 패턴(Structural Pattern) 중 하나로, 객체들을 트리 구조로 구성하여 단일 객체와 복합 객체를 동일하게 처리할 수 있도록 하는 방법입니다. 이 패턴을 통해 클라이언트는 단일 객체와 복합 객체를 일관성 있게 다룰 수 있으며, 복잡한 객체 구조를 재귀적으로 처리할 수 있습니다.
1. Composite 패턴이란?
Composite 패턴은 개별 객체와 복합 객체(여러 객체로 구성된 객체)를 동일하게 취급할 수 있는 구조를 제공합니다.
이 패턴을 사용하면 개별 요소와 요소들을 포함한 구조체 모두를 하나의 일관된 인터페이스로 처리할 수 있습니다.
트리 구조를 형성하는 데 주로 사용되며, 계층적인 관계를 표현할 때 유용합니다.
언제 사용하는가?
- 부분-전체 관계를 표현해야 할 때: 객체가 다른 객체들을 포함하는 트리 구조를 만들 때 적합합니다.
- 단일 객체와 복합 객체를 동일하게 처리해야 할 때: 개별 객체와 그 객체들을 포함하는 복합 객체를 같은 방식으로 처리할 수 있습니다.
2. Composite 패턴의 구조
Composite 패턴의 구조는 크게 Component, Leaf, Composite로 나뉩니다.
1. Component (구성 요소)
- 개별 객체와 복합 객체에 공통으로 사용할 수 있는 인터페이스를 정의합니다.
여기서 공통 작업이나 연산을 정의합니다.
2. Leaf (잎)
- 트리 구조에서 자식이 없는 노드를 나타냅니다. 실제 기능을 수행하는 기본 객체입니다.
Leaf는 개별 객체를 나타내며, Component 인터페이스를 구현합니다.
3. Composite (복합체)
- 트리 구조에서 자식을 가질 수 있는 노드를 나타냅니다.
Composite는 자식 노드를 관리하며, 자식들이 Component 인터페이스를 따르도록 합니다.
복합 객체로, 자신이 가진 자식들에게 작업을 위임합니다.
3. Composite 패턴의 구현 예시 (C#)
// Component: 공통 인터페이스
public interface IGraphic
{
void Draw();
}
// Leaf: 실제 객체
public class Circle : IGraphic
{
public void Draw()
{
Console.WriteLine("Drawing a Circle");
}
}
public class Rectangle : IGraphic
{
public void Draw()
{
Console.WriteLine("Drawing a Rectangle");
}
}
// Composite: 복합체
public class CompositeGraphic : IGraphic
{
private List<IGraphic> _graphics = new List<IGraphic>();
public void Add(IGraphic graphic)
{
_graphics.Add(graphic);
}
public void Remove(IGraphic graphic)
{
_graphics.Remove(graphic);
}
public void Draw()
{
foreach (var graphic in _graphics)
{
graphic.Draw();
}
}
}
위 코드에서 IGraphic 인터페이스는 Draw 메서드를 정의하며, Circle과 Rectangle은 이 인터페이스를 구현한 구체적인 객체들입니다. CompositeGraphic 클래스는 자식 객체들을 포함하는 복합체로, 여러 개의 IGraphic 객체를 포함하고 Draw 메서드를 호출할 때 모든 자식에게 작업을 위임합니다.
클라이언트 코드
public class Program
{
public static void Main(string[] args)
{
// Leaf 객체들
IGraphic circle = new Circle();
IGraphic rectangle = new Rectangle();
// Composite 객체
CompositeGraphic compositeGraphic = new CompositeGraphic();
compositeGraphic.Add(circle);
compositeGraphic.Add(rectangle);
// 단일 Leaf와 Composite를 동일하게 처리
Console.WriteLine("Drawing individual elements:");
circle.Draw(); // Output: Drawing a Circle
rectangle.Draw(); // Output: Drawing a Rectangle
Console.WriteLine("\nDrawing composite:");
compositeGraphic.Draw(); // Output: Drawing a Circle, Drawing a Rectangle
}
}
위 클라이언트 코드는 개별 객체(circle, rectangle)와 복합 객체(compositeGraphic)를 동일한 방식으로 처리합니다. CompositeGraphic 객체에 자식 요소를 추가하고, Draw 메서드를 호출하면 모든 자식 요소가 동일한 방식으로 처리됩니다.
4. Composite 패턴의 장단점
장점:
- 단일 객체와 복합 객체를 일관되게 처리: 클라이언트가 개별 객체와 복합 객체를 동일한 방식으로 처리할 수 있으므로 코드가 간결하고 유지보수가 쉬워집니다.
- 객체 계층 구조 관리 용이: 객체가 계층 구조를 가질 때, 트리 형태로 자식 객체를 재귀적으로 처리할 수 있어 유연한 구조를 제공합니다.
단점:
- 트리 구조의 복잡성: 복합 객체가 너무 복잡해지면 객체의 계층을 관리하는 것이 어려워질 수 있으며, 트리 구조를 제대로 이해해야 합니다.
- 자식 관리의 비용: 자식 객체를 추가하거나 제거하는 작업이 빈번할 경우, Composite 구조가 비효율적일 수 있습니다.
5. Composite 패턴의 사용 사례
5.1. GUI 시스템
GUI 시스템에서 버튼, 텍스트 박스 등은 Leaf 역할을 하고, 패널이나 창은 Composite 역할을 합니다.
여러 개의 GUI 컴포넌트를 그룹화하여 동일하게 처리할 수 있습니다.
5.2. 파일 시스템
파일 시스템에서 파일은 Leaf 역할을 하고, 폴더는 Composite 역할을 합니다.
폴더 안에 파일이나 다른 폴더를 포함할 수 있으며, 동일한 방식으로 작업을 처리할 수 있습니다.
Composite 패턴은 트리 구조로 구성된 객체들에서 개별 객체와 복합 객체를 동일한 방식으로 처리할 수 있게 해주는 강력한 구조 패턴입니다. 이 패턴은 복잡한 객체 구조를 관리하기 용이하며, 재귀적으로 객체를 처리할 수 있는 유연성을 제공합니다. 복합적인 객체를 단순화하여 처리하는 데 유용하며, GUI 시스템, 파일 시스템 등 다양한 분야에서 사용됩니다.
'Design Pattern' 카테고리의 다른 글
브릿지(Bridge) 패턴 (0) | 2024.10.17 |
---|---|
프록시(Proxy) 패턴 (0) | 2024.10.17 |
프로토타입(Prototype) 패턴 (0) | 2024.10.14 |
DI (Dependency Injection) 및 IoC (Inversion of Control) 패턴 (0) | 2024.10.14 |
MVVM (Model-View-ViewModel) 패턴 (2) | 2024.10.14 |