Sobes.tech
Middle

Ce este un mediator în contextul programării?

sobes.tech AI

Răspuns de la AI

Mediatorul este un pattern de proiectare comportamental care propune un obiect centralizat pentru gestionarea interacțiunii dintre alte obiecte (colegi). În loc ca obiectele să comunice direct între ele, ele interacționează prin intermediul mediatorului.

Avantajele utilizării mediatorului:

  • Reducerea cuplajului: Obiectele nu au referințe directe între ele, ceea ce reduce dependența.
  • Simplificarea gestionării: Interacțiunile dintre obiecte sunt concentrate într-un singur loc, facilitând înțelegerea și modificarea.
  • Îmbunătățirea reutilizării: Componentele individuale pot fi reutilizate în alte contexte, deoarece nu sunt strâns legate de alte componente ale sistemului.

Dezavantaje:

  • Creșterea complexității mediatorului: Pe măsură ce numărul de interacțiuni crește, mediatorul poate deveni complex și dificil de întreținut.
  • Posibil impact asupra performanței: Toate interacțiunile trec printr-un obiect central, ceea ce poate genera costuri suplimentare.

Exemplu de implementare simplă:

// Interfața pentru mediator
public interface IMediator
{
    void SendMessage(string message, Colleague colleague);
}

// Clasa de bază pentru colegi
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);
}

// Mediator concret
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);
        }
    }
}

// Colegi concreți
public class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Mesaj primit de colegul 1: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Mesaj trimis de colegul 1: {message}");
        mediator.SendMessage(message, this);
    }
}

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

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Mesaj primit de colegul 2: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Mesaj trimis de colegul 2: {message}");
        mediator.SendMessage(message, this);
    }
}

// Exemplu de utilizare
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Salut, coleg 2!");
// colleague2.Send("Salut, coleg 1!");

Este adesea utilizat împreună cu alte pattern-uri, precum Observer, pentru implementarea unor sisteme mai complexe de schimb de mesaje. În contextul .NET, este frecvent utilizat în biblioteci pentru gestionarea solicitărilor și comenzilor, precum MediatR.