Sobes.tech
Middle

Šta je mediator u kontekstu programiranja?

sobes.tech АИ

Одговор од АИ

Медијатор је образац понашања који предлаже централизовани објекат за управљање интеракцијом између других објеката (колега). Уместо да објекти комуницирају директно, они интерагују преко медијатора.

Предности коришћења медијатора:

  • Смањење везаности: Објекти немају директне референце један на други, што смањује њихову зависност.
  • Олакшавање управљања: Интеракције између објеката су концентрисане на једном месту, што олакшава њихово разумевање и измене.
  • Побољшање поновне употребљивости: Посебни компоненти могу се поново користити у другим контекстима, јер нису превише повезани са другим компонентама система.

Недостаци:

  • Повећање сложености медијатора: Са повећањем броја интеракција, медијатор може постати сложенији и тешко одржавати.
  • Могуће смањење перформанси: Све интеракције пролазе кроз централни објекат, што може изазвати додатне трошкове.

Пример једноставне имплементације:

// Интерфејс за медијатора
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.