2024. 10. 17. 00:53ㆍDesign Pattern
Mediator 패턴 - 개념과 구현
Mediator 패턴은 행위 패턴(Behavioral Pattern) 중 하나로, 객체 간의 직접적인 통신을 줄이고, 복잡한 상호작용을 관리하기 위해 중재자 역할을 하는 객체를 도입하는 디자인 패턴입니다. 이 패턴은 객체 간의 의존성을 줄여 코드의 유연성과 재사용성을 향상시키는 데 도움을 줍니다.
1. Mediator 패턴이란?
Mediator 패턴은 다음과 같은 상황에서 유용합니다:
- 여러 객체 간의 상호작용이 복잡할 때.
- 객체 간의 의존성을 줄여야 할 때.
- 중앙 집중식으로 객체 간의 상호작용을 관리하고 싶을 때.
2. Mediator 패턴의 구조
Mediator 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:
1. Mediator
- 객체 간의 상호작용을 정의하는 인터페이스입니다. 서로 다른 구성 요소 간의 통신을 관리합니다.
2. ConcreteMediator
- Mediator 인터페이스를 구현하며, 구체적인 상호작용 로직을 제공합니다. 각 구성 요소의 참조를 가지고 있어야 합니다.
3. Colleague
- Mediator와 상호작용하는 구성 요소로, 각 객체는 Mediator를 통해 다른 객체와 통신합니다.
4. ConcreteColleague
- Colleague 인터페이스를 구현하며, Mediator를 통해 다른 구성 요소와 통신합니다.
3. Mediator 패턴의 구현 예시 (C#)
// Mediator: 중재자 인터페이스
public interface IMediator
{
void Notify(object sender, string ev);
}
// Colleague: 동료 인터페이스
public abstract class Colleague
{
protected IMediator _mediator;
public Colleague(IMediator mediator)
{
_mediator = mediator;
}
}
// ConcreteColleague: 구체적인 동료 1
public class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(IMediator mediator) : base(mediator) { }
public void DoSomething()
{
Console.WriteLine("Colleague 1 does something.");
_mediator.Notify(this, "Colleague1Action");
}
}
// ConcreteColleague: 구체적인 동료 2
public class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(IMediator mediator) : base(mediator) { }
public void ReactOnAction(string action)
{
Console.WriteLine($"Colleague 2 reacts on {action}.");
}
}
// ConcreteMediator: 구체적인 중재자
public class ConcreteMediator : IMediator
{
private readonly ConcreteColleague1 _colleague1;
private readonly ConcreteColleague2 _colleague2;
public ConcreteMediator(ConcreteColleague1 colleague1, ConcreteColleague2 colleague2)
{
_colleague1 = colleague1;
_colleague2 = colleague2;
}
public void Notify(object sender, string ev)
{
if (ev == "Colleague1Action")
{
_colleague2.ReactOnAction(ev);
}
}
}
위의 코드에서 IMediator는 중재자 인터페이스이며, Colleague는 동료 인터페이스입니다. ConcreteColleague1과 ConcreteColleague2는 구체적인 동료로, 각각의 동작을 수행하고 서로에게 통신합니다. ConcreteMediator는 동료들 간의 상호작용을 관리합니다.
클라이언트 코드
public class Program
{
public static void Main(string[] args)
{
// 동료 및 중재자 생성
var mediator = new ConcreteMediator(
new ConcreteColleague1(mediator),
new ConcreteColleague2(mediator));
// 동료의 동작 호출
mediator.Colleague1.DoSomething();
}
}
클라이언트 코드에서는 중재자와 동료 객체를 생성하고, 동료의 동작을 호출하여 상호작용을 관찰합니다.
4. Mediator 패턴의 장단점
장점:
- 의존성 감소: 객체 간의 직접적인 상호작용을 줄여 의존성을 감소시킵니다.
- 중앙 집중식 관리: 모든 상호작용을 중앙에서 관리할 수 있어, 코드 변경이 용이합니다.
- 유지 보수 용이: 코드의 가독성이 향상되어 유지 보수가 쉬워집니다.
단점:
- 중재자 복잡성: 중재자가 복잡해질 수 있으며, 모든 상호작용을 처리하기 위해 많은 로직을 포함할 수 있습니다.
- 성능 저하: 모든 통신이 중재자를 통해 이루어지므로 성능에 영향을 줄 수 있습니다.
5. Mediator 패턴의 사용 사례
5.1. GUI 컴포넌트
GUI 프레임워크에서 다양한 컴포넌트(버튼, 텍스트 필드 등) 간의 상호작용을 중재하는 데 사용됩니다.
5.2. 채팅 애플리케이션
사용자 간의 메시지를 중재하여 각 사용자가 다른 사용자와 소통할 수 있게 하는 데 유용합니다.
5.3. 게임 개발
게임 오브젝트 간의 복잡한 상호작용을 관리하기 위해 사용됩니다.
Mediator 패턴은 객체 간의 상호작용을 관리하여 의존성을 줄이고, 코드를 더욱 유연하게 만들어주는 행위 패턴입니다.
이 패턴을 이해하고 적용함으로써, 복잡한 시스템에서도 효율적인 객체 간의 통신을 구현할 수 있습니다.
'Design Pattern' 카테고리의 다른 글
디자인 패턴이 성능에 미치는 영향 (0) | 2024.10.18 |
---|---|
안티 패턴(Anti-Pattern) - 잘못된 디자인 패턴 사용의 예와 피해야 할 패턴들 (1) | 2024.10.18 |
이터레이터(Iterator) 패턴 (1) | 2024.10.17 |
커맨드(Command) 패턴 (0) | 2024.10.17 |
브릿지(Bridge) 패턴 (0) | 2024.10.17 |