중재자(Mediator) 패턴

2024. 10. 17. 00:53Design 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 패턴은 객체 간의 상호작용을 관리하여 의존성을 줄이고, 코드를 더욱 유연하게 만들어주는 행위 패턴입니다.
이 패턴을 이해하고 적용함으로써, 복잡한 시스템에서도 효율적인 객체 간의 통신을 구현할 수 있습니다.