컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 구성하여 부분-전체 계층을 나타내는 패턴이다. 이 패턴을 사용하면 개별 객체와 복합 객체(여러 개의 객체가 결합된 객체)를 동일하게 취급할 수 있어, 클라이언트 코드에서 객체를 일관되게 처리할 수 있다. 주로 계층 구조를 가진 객체들을 처리하거나, 객체의 구조를 재귀적으로 다룰 때 유용하다.
구성요소
- Component (구성 요소):
- 컴포지트 패턴에서 단일 객체와 복합 객체의 공통 인터페이스를 정의한다. 이 인터페이스는 단일 객체와 복합 객체 모두가 구현해야 할 메서드들을 포함한다. 일반적으로 구성 요소는 추상 클래스나 인터페이스로 정의
- Leaf (단일 객체):
- 컴포지트 패턴에서 최하위 객체로, 더 이상 구성 요소가 없는 객체를 나타낸다. Leaf 클래스는 구성 요소의 인터페이스를 구현하며, 자신이 단일 객체임을 나타내는 메서드들을 구현.
- Composite (복합 객체):
- 컴포지트 패턴에서 복합 객체는 Leaf 객체들과 다른 Composite 객체들을 포함할 수 있는 객체를 나타낸다. 즉, 계층 구조에서의 중간 또는 최상위 노드 역할, Composite 객체는 구성 요소의 인터페이스를 구현하며, 자신이 복합 객체임을 나타내는 메서드들을 구현.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IEvnetNotify
{
void Event();
}
public class EN_Attack : IEvnetNotify
{
public void Event()
{
Debug.Log("이벤트 공격 시스템");
}
}
public class EN_GUard : IEvnetNotify
{
public void Event()
{
Debug.Log("이벤트 방어 시스템");
}
}
public class EN_Idle : IEvnetNotify
{
public void Event()
{
Debug.Log("이벤트 제자리 시스템");
}
}
public class EventNotificationManager
{
public List<IEvnetNotify> Notifies = new();
}
public class CompositePatternExample : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//비컴포지트 방식
IEvnetNotify noti1 = new EN_Attack();
noti1.Event();
IEvnetNotify noti2 = new EN_GUard();
noti2.Event();
IEvnetNotify noti3 = new EN_Idle();
noti3.Event();
// 컴포지트 방식
EventNotificationManager mgr = new();
mgr.Notifies.Add(new EN_Attack());
mgr.Notifies.Add(new EN_GUard());
mgr.Notifies.Add(new EN_Idle());
foreach (var eventNotify in mgr.Notifies)
{
eventNotify.Event();
}
}
// Update is called once per frame
void Update()
{
}
}
Start() 메서드에서는 먼저 비컴포지트 방식으로 개별 객체를 생성하고 각 객체의 Event() 메서드를 호출하여 각기 다른 이벤트 메시지를 출력한다.
그 후에는 컴포지트 패턴을 사용하여 EventNotificationManager를 생성하고, 여기에 각각의 이벤트 객체를 등록한다. 이후 매니저에 등록된 모든 이벤트 객체들의 Event() 메서드를 호출하여 각기 다른 이벤트 메시지를 출력한다.
컴포지트 패턴은 객체들을 트리 구조로 구성하여 일관된 방법으로 개별 객체와 복합 객체를 다룰 수 있도록 한다. 이 패턴은 계층 구조를 가진 데이터나 UI 구성 요소 등을 효과적으로 관리하고 다룰 때 유용하며, 객체 간의 일관된 인터페이스를 제공하여 코드의 유연성과 재사용성을 높이는 데 기여한다.
'개인 공부 > 디자인패턴' 카테고리의 다른 글
| 디자인패턴 커맨드 & 유니티 커스텀 에디터 (1) | 2024.07.16 |
|---|---|
| 디자인패턴 책임 연쇄 패턴 (Chain of Responsibility) (0) | 2024.07.16 |
| 디자인패턴 프록시 (0) | 2024.07.15 |
| 디자인패턴 플라이웨이트 (경량패턴) (0) | 2024.07.15 |
| 디자인패턴 퍼사드 (0) | 2024.07.15 |