Middle
Čo je to mediátor v kontexte programovania?
sobes.tech AI
Odpoveď od AI
Mediator je vzor správania, ktorý navrhuje centralizovaný objekt na riadenie interakcie medzi inými objektmi (kolegami). Namiesto toho, aby objekty komunikovali priamo, komunikujú cez mediátora.
Výhody používania mediátora:
- Zníženie väzby: Objekty nemajú priame odkazy na seba, čo znižuje ich závislosť.
- Zjednodušenie správy: Interakcie medzi objektmi sú sústredené na jednom mieste, čo uľahčuje ich pochopenie a zmeny.
- Zlepšenie opakovanej použiteľnosti: Samostatné komponenty je možné znovu použiť v iných kontextoch, pretože nie sú príliš prepojené s ostatnými časťami systému.
Nevýhody:
- Zvýšenie zložitosti mediátora: S narastajúcim počtom interakcií sa mediátor môže stať zložitým a ťažko udržiavateľným.
- Možné zníženie výkonu: Všetky interakcie prebiehajú cez centrálny objekt, čo môže vytvárať dodatočné náklady.
Príklad jednoduchého implementácie:
// Rozhranie pre mediátora
public interface IMediator
{
void SendMessage(string message, Colleague colleague);
}
// Základná trieda pre kolegov
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étny 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étni kolegovia
public class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Správa prijatá od kolegu 1: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Správa odoslaná od kolegu 1: {message}");
mediator.SendMessage(message, this);
}
}
public class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Správa prijatá od kolegu 2: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Správa odoslaná od kolegu 2: {message}");
mediator.SendMessage(message, this);
}
}
// Príklad použitia
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Ahoj, kolega 2!");
// colleague2.Send("Ahoj, kolega 1!");
Zvyčajne sa používa v kombinácii s inými vzormi, napríklad Observer, na implementáciu zložitejších systémov výmeny správ. V prostredí .NET sa často aplikuje v knižniciach na prácu s požiadavkami a príkazmi, ako je MediatR.