Sobes.tech
Middle

Mi az a mediátor a programozás kontextusában?

sobes.tech MI

Válasz az MI-től

A mediátor egy viselkedési tervezési minta, amely központi objektumot javasol a többi objektum (kollégák) közötti interakciók kezelésére. Ahelyett, hogy az objektumok közvetlenül kommunikálnának egymással, a mediátoron keresztül lépnek kapcsolatba.

A mediátor használatának előnyei:

  • Csökkenti a kötöttséget: Az objektumok nem rendelkeznek közvetlen hivatkozásokkal egymásra, ez csökkenti függőségüket.
  • Egyszerűsíti a kezelést: Az objektumok közötti interakciók egy helyen összpontosulnak, ez megkönnyíti azok megértését és módosítását.
  • Újrahasznosíthatóság növelése: Az egyes komponensek más kontextusokban is újra felhasználhatók, mivel nem túl szorosan kapcsolódnak a rendszer többi részéhez.

Hátrányok:

  • A mediátor bonyolultságának növekedése: Ahogy nő az interakciók száma, a mediátor is komplexebbé és karbantartásában nehezebbé válhat.
  • Lehetséges teljesítménycsökkenés: Minden interakció a központi objektumon keresztül történik, ami plusz költségeket okozhat.

Egyszerű megvalósítási példa:

// Mediátor interfész
public interface IMediator
{
    void SendMessage(string message, Colleague colleague);
}

// Alap osztály a kollégák számára
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);
}

// Konkrét mediátor
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);
        }
    }
}

// Konkrét kollégák
public class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Üzenet érkezett a 1-es kollégától: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Üzenet küldve a 1-es kollégától: {message}");
        mediator.SendMessage(message, this);
    }
}

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

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Üzenet érkezett a 2-es kollégától: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Üzenet küldve a 2-es kollégától: {message}");
        mediator.SendMessage(message, this);
    }
}

// Használati példa
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Szia, Kolléga 2!");
// colleague2.Send("Szia, Kolléga 1!");

Általában más mintákkal, például az Observer-rel együtt használják összetettebb üzenetcsere rendszerek megvalósítására. A .NET környezetben gyakran alkalmazzák kérés- és parancskezelő könyvtárakban, mint például a MediatR.