개요

중재자 패턴은 객체 간 상호작용을 중앙 집중화된 중재자를 통해 조정하는 디자인 패턴입니다.
객체들은 서로 직접 소통하지 않고 모든 통신은 중재자를 통해 이루어집니다.
각 객체는 중재자에게 메시지를 전달하고, 중재자는 해당 메시지를 받아 적절한 처리를 한 후 다른 객체에게 전달합니다.
이를 통해 객체들 간의 직접적인 연결이 필요 없어지며, 유지보수성과 확장성이 향상됩니다.

장단점

장점

  • 낮은 결합도: 객체들 사이의 의존성이 줄어들어 시스템의 유연성이 증가합니다.
  • 재사용성 향상: 객체들을 쉽게 재사용할 수 있으며, 다른 상황에서도 활용이 가능합니다.
  • 복잡성 감소: 시스템의 복잡성을 줄여 관리하기 쉽습니다.

단점

  • 중재자의 복잡성 증가: 중재자가 복잡해지면 유지보수가 어려워집니다.
  • 성능 문제: 중재자의 처리 능력에 따라 전체 시스템의 성능이 영향을 받을 수 있습니다.

사용 사례

중재자 패턴은 UI 컴포넌트, 네트워크 프로그래밍 등 다양한 분야에서 사용됩니다. 예를 들어, UI 컴포넌트 간의 상호작용을 관리하거나 시스템 간의 메시지 교환에 활용됩니다.

using System;
using System.Collections.Generic;

// Mediator Interface
interface IChatMediator {
    void SendMessage(string msg, IUser user);
    void AddUser(IUser user);
}

// Concrete Mediator
class ChatRoom : IChatMediator {
    private List<IUser> users;

    public ChatRoom() {
        this.users = new List<IUser>();
    }

    public void SendMessage(string msg, IUser user) {
        foreach (IUser u in users) {
            // message should not be received by the user sending it
            if (u != user) {
                u.Receive(msg);
            }
        }
    }

    public void AddUser(IUser user) {
        this.users.Add(user);
    }
}

// Colleague
abstract class IUser {
    protected IChatMediator mediator;
    protected string name;

    public IUser(IChatMediator med, string name) {
        this.mediator = med;
        this.name = name;
    }

    public abstract void Send(string msg);
    public abstract void Receive(string msg);
}

// Concrete Colleague
class ConcreteUser : IUser {

    public ConcreteUser(IChatMediator med, string name) : base(med, name) {}

    public override void Send(string msg) {
        Console.WriteLine(this.name + ": Sending Message=" + msg);
        mediator.SendMessage(msg, this);
    }

    public override void Receive(string msg) {
        Console.WriteLine(this.name + ": Received Message:" + msg);
    }
}

// Main class
class MediatorPatternDemo {
    static void Main(string[] args) {
        IChatMediator mediator = new ChatRoom();

        IUser user1 = new ConcreteUser(mediator, "John");
        IUser user2 = new ConcreteUser(mediator, "Doe");
        IUser user3 = new ConcreteUser(mediator, "Smith");
        IUser user4 = new ConcreteUser(mediator, "Jane");

        mediator.AddUser(user1);
        mediator.AddUser(user2);
        mediator.AddUser(user3);
        mediator.AddUser(user4);

        user1.Send("Hi All");
    }
}
반응형