Sobes.tech
Middle
155
questionbank

Что такое медиатор в контексте программирования?

Answer from AI

sobes.tech AI

Медиатор — это поведенческий паттерн проектирования, который предлагает централизованный объект для управления взаимодействием между другими объектами (коллегами). Вместо того чтобы объекты общались напрямую друг с другом, они взаимодействуют через медиатор.

Преимущества использования медиатора:

  • Снижение связности: Объекты не имеют прямых ссылок друг на друга, что уменьшает их зависимость.
  • Упрощение управления: Взаимодействия между объектами сосредоточены в одном месте, что облегчает их فهم и изменение.
  • Улучшение переиспользуемости: Отдельные компоненты можно переиспользовать в других контекстах, поскольку они не сильно связаны с другими компонентами системы.

Недостатки:

  • Увеличение сложности медиатора: По мере увеличения числа взаимодействий медиатор сам может стать сложным и трудноподдерживаемым.
  • Возможное снижение производительности: Все взаимодействия проходят через центральный объект, что может создавать накладные расходы.

Пример простейшей реализации:

// Интерфейс для медиатора
public interface IMediator
{
    void SendMessage(string message, Colleague colleague);
}

// Базовый класс для коллег
public abstract class Colleague
{
    protected IMediator mediator;

    public Colleague(IMediator mediator)
    {
        this.mediator = mediator;
    }

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

// Конкретный медиатор
public class ConcreteMediator : IMediator
{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public ConcreteColleague1 Colleague1
    {
        set { colleague1 = value; }
    }

    public ConcreteColleague2 Colleague2
    {
        set { colleague2 = value; }
    }

    public void SendMessage(string message, Colleague colleague)
    {
        if (colleague == colleague1)
        {
            colleague2.ReceiveMessage(message);
        }
        else
        {
            colleague1.ReceiveMessage(message);
        }
    }
}

// Конкретные коллеги
public class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Сообщение получено Коллегой 1: {message}");
    }

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

public class ConcreteColleague2 : Colleague
{
    public ConcreteColleague2(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Сообщение получено Коллегой 2: {message}");
    }

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

// Пример использования
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Привет Коллега 2!");
// colleague2.Send("Привет Коллега 1!");

Часто используется в сочетании с другими паттернами, например, Observer, для реализации более сложных систем обмена сообщениями. В контексте .NET часто применяется в библиотеках для работы с запросами и командами, таких как MediatR.