Sobes.tech
Back to questions
Junior — Middle
64

Можете привести пример применения паттерна Медиаатор в проектировании программных систем?

Answer from AI

sobes.tech AI

Паттерн «Медиатор» используется для упрощения взаимодействия между объектами, уменьшая количество прямых связей между ними. Вместо того чтобы объекты напрямую общались друг с другом, они взаимодействуют через медиатор, который централизует логику общения.

Пример применения в C# — чат, где несколько пользователей (коллеги) общаются через централизованный объект Медиатор:

// Интерфейс медиатора
public interface IChatMediator
{
    void SendMessage(string message, User user);
    void RegisterUser(User user);
}

// Конкретный медиатор
public class ChatMediator : IChatMediator
{
    private List<User> users = new List<User>();

    public void RegisterUser(User user)
    {
        users.Add(user);
    }

    public void SendMessage(string message, User sender)
    {
        foreach (var user in users)
        {
            if (user != sender)
                user.Receive(message);
        }
    }
}

// Коллега
public abstract class User
{
    protected IChatMediator mediator;
    protected string name;

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

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

public class ChatUser : User
{
    public ChatUser(IChatMediator mediator, string name) : base(mediator, name) { }

    public override void Send(string message)
    {
        Console.WriteLine($"{name} отправляет сообщение: {message}");
        mediator.SendMessage(message, this);
    }

    public override void Receive(string message)
    {
        Console.WriteLine($"{name} получил сообщение: {message}");
    }
}

// Использование
var mediator = new ChatMediator();
var user1 = new ChatUser(mediator, "Алиса");
var user2 = new ChatUser(mediator, "Боб");
mediator.RegisterUser(user1);
mediator.RegisterUser(user2);

user1.Send("Привет, Боб!");

Такой подход упрощает поддержку и расширение системы, так как все взаимодействия проходят через медиатор, а не напрямую между объектами.