Sobes.tech
Middle

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

sobes.tech AI

Отговор от 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.