🧩 Unity 디자인 패턴 - 중재자(Mediator) 패턴
1. 중재자 패턴이란?
중재자(Mediator) 패턴은 객체 간의 직접적인 소통을 피하고, 모든 통신을 중앙 관리자(중재자)를 통해 진행하도록 설계하는 패턴입니다.
"A와 B가 서로를 몰라도, 중재자에게만 말하면 필요한 연결이 자동으로 이뤄지는 구조"입니다.
2. 언제 사용하나요?
- UI 요소나 시스템 간 상호작용이 많고 복잡할 때
- 객체 간 결합도를 낮추고 싶을 때
- Observer 패턴보다 더 넓은 범위의 제어가 필요할 때
3. 구조 구성요소
역할 | 설명 |
IMediator | 중재자 인터페이스 |
ConcreteMediator | 실제 이벤트를 중계하는 클래스 |
Participant | 중재자에게 메시지를 보내는 구성원 객체 |
4. Unity 예제: 버튼 누르면 여러 시스템에 명령 전파
💬 Step 1: IMediator 인터페이스
public interface IMediator
{
void Notify(string eventKey, object data = null);
}
🧠 Step 2: ConcreteMediator 클래스
using System;
using System.Collections.Generic;
public class GameMediator : IMediator
{
private Dictionary<string, Action<object>> listeners = new();
public void Register(string eventKey, Action<object> callback)
{
if (!listeners.ContainsKey(eventKey))
listeners[eventKey] = delegate { };
listeners[eventKey] += callback;
}
public void Unregister(string eventKey, Action<object> callback)
{
if (listeners.ContainsKey(eventKey))
listeners[eventKey] -= callback;
}
public void Notify(string eventKey, object data = null)
{
if (listeners.TryGetValue(eventKey, out var callback))
callback?.Invoke(data);
}
}
📦 Step 3: MediatorProvider (싱글톤 등록소)
public static class MediatorProvider
{
public static GameMediator Mediator = new();
}
🧱 Step 4: Button 클릭 → 중재자에게 알림
using UnityEngine;
public class UIButton : MonoBehaviour
{
public void OnClick()
{
MediatorProvider.Mediator.Notify("PlayClicked", "게임 시작!");
}
}
🖥️ Step 5: UIManager가 이벤트 수신
using UnityEngine;
public class UIManager : MonoBehaviour
{
private void OnEnable()
{
MediatorProvider.Mediator.Register("PlayClicked", OnPlayClicked);
}
private void OnDisable()
{
MediatorProvider.Mediator.Unregister("PlayClicked", OnPlayClicked);
}
private void OnPlayClicked(object data)
{
Debug.Log($"UIManager 수신: {data}");
// 예: 타이틀 화면 숨기기
}
}
5. 정리 및 장단점
✅ 장점
- 객체 간 직접 참조 없이 상호작용 가능 → 결합도 ↓
- 동적으로 구독/해제 가능
- 복잡한 시스템 간 통신 구조 단순화
❌ 단점
- 모든 통신이 중재자를 거치기 때문에, 중재자가 비대해질 수 있음
- 디버깅 시 흐름 추적이 어려워질 수 있음
✅ 마무리 한 줄 요약
중재자 패턴은 모든 객체가 서로를 몰라도, 하나의 창구만 알면 협력할 수 있는 설계로, 복잡한 시스템 구조를 깔끔하게 정리할 수 있는 강력한 도구입니다.
'C# > DesignPattern' 카테고리의 다른 글
DesignPattern - 전략(Strategy) 패턴 (1) | 2025.08.06 |
---|---|
DesignPattern - 커맨드(Command) 패턴 (0) | 2025.08.06 |
DesignPattern - 상태 패턴(State Pattern) vs FSM (0) | 2025.08.06 |
DesignPattern - 이벤트 버스(Event Bus) 패턴 (0) | 2025.08.06 |
DesignPattern - 팩토리(Factory) 패턴 (0) | 2025.08.06 |