1. 미디에이터 패턴이란?
객체들이 서로 직접 통신하지 않고, 중재자(미디에이터)를 통해 간접적으로 소통하도록 만드는 디자인 패턴입니다. 이를 통해 객체 간의 의존성을 줄이고, 시스템의 복잡도를 효과적으로 관리할 수 있습니다. 🌍
2. 어떻게 작동하나요?
객체들 간의 상호작용이 복잡해지면 코드 유지보수가 어려워질 수 있습니다. 미디에이터 패턴은 이런 문제를 해결하기 위해 중재자 역할의 객체를 도입하여 다음과 같은 구조를 만듭니다:
- Colleague: 서로 상호작용하는 객체들.
- Mediator: Colleague 간의 통신을 관리하는 중재자 객체.
Colleague 객체들은 Mediator를 통해서만 통신하며, 서로를 직접 참조하지 않습니다. 🔐
3. 실생활에서의 예
시나리오
채팅 애플리케이션에서 여러 사용자(User) 객체가 있고, 이들은 채팅룸(ChatRoom)을 통해 메시지를 주고받는 구조를 설계한다고 가정해봅시다.
코드 구현 (C#)
using System;
using System.Collections.Generic;
// Mediator 인터페이스
public interface IChatRoomMediator
{
void SendMessage(string message, string userId);
void RegisterUser(User user);
}
// Concrete Mediator
public class ChatRoom : IChatRoomMediator
{
private Dictionary<string, User> _users = new Dictionary<string, User>();
public void RegisterUser(User user)
{
if (!_users.ContainsKey(user.Id))
{
_users[user.Id] = user;
user.SetChatRoom(this);
}
}
public void SendMessage(string message, string userId)
{
if (_users.ContainsKey(userId))
{
_users[userId].Receive(message);
}
}
}
// Colleague
public class User
{
public string Id { get; }
public string Name { get; }
private IChatRoomMediator _chatRoom;
public User(string id, string name)
{
Id = id;
Name = name;
}
public void SetChatRoom(IChatRoomMediator chatRoom)
{
_chatRoom = chatRoom;
}
public void Send(string message, string userId)
{
Console.WriteLine($"{Name} sends: {message}");
_chatRoom.SendMessage(message, userId);
}
public void Receive(string message)
{
Console.WriteLine($"{Name} receives: {message}");
}
}
// 사용 예
class Program
{
static void Main(string[] args)
{
var chatRoom = new ChatRoom();
var user1 = new User("1", "Alice");
var user2 = new User("2", "Bob");
chatRoom.RegisterUser(user1);
chatRoom.RegisterUser(user2);
user1.Send("Hello, Bob!", "2");
user2.Send("Hi, Alice!", "1");
}
}
결과
Alice sends: Hello, Bob!
Bob receives: Hello, Bob!
Bob sends: Hi, Alice!
Alice receives: Hi, Alice!
4. 이 패턴을 사용할 때 주의할 점
- 단일 책임 원칙 준수: Mediator가 지나치게 많은 책임을 가지면 또 다른 복잡성을 초래할 수 있습니다.
- 적합한 상황에 사용: 객체 간의 상호작용이 단순하다면, 굳이 미디에이터를 도입하지 않아도 됩니다.
5. 마무리
미디에이터 패턴은 객체 간의 의존성을 줄이고 복잡한 상호작용을 단순화하는 데 효과적입니다. 특히, 확장 가능하고 유지보수성이 높은 시스템을 설계할 때 유용합니다. 🚀
6. 참고 자료
반응형
'Workspace > Design Pattern' 카테고리의 다른 글
플라이웨이트 패턴 (Flyweight Pattern): 메모리 절약을 위한 객체 재사용 설계 (0) | 2025.01.22 |
---|---|
템플릿 메서드 패턴 (Template Method): 알고리즘 뼈대를 정의하는 패턴 (0) | 2025.01.22 |
빌더 패턴 (Builder Pattern): 객체 생성의 유연함을 더하다 (0) | 2025.01.22 |
프록시 패턴 (Proxy Pattern): 스마트한 대리자 역할 (0) | 2025.01.22 |
커맨드 패턴 (Command Pattern): 행동을 캡슐화하다 (0) | 2025.01.22 |