Middle
Co je to mediátor v kontextu programování?
sobes.tech AI
Odpověď od AI
Mediator je vzor chování návrhu, který navrhuje centralizovaný objekt pro řízení interakce mezi ostatními objekty (kolegy). Místo toho, aby objekty komunikovaly přímo, komunikují přes mediátora.
Výhody použití mediátora:
- Snížení vazby: Objekty nemají přímé odkazy na sebe, což snižuje jejich závislost.
- Zjednodušení správy: Interakce mezi objekty jsou soustředěny na jednom místě, což usnadňuje jejich pochopení a změnu.
- Zlepšení znovupoužitelnosti: Samostatné komponenty lze znovu použít v jiných kontextech, protože nejsou příliš propojeny s ostatními částmi systému.
Nevýhody:
- Zvýšení složitosti mediátora: S narůstajícím počtem interakcí se mediátor může stát složitým a těžko udržovatelným.
- Možné snížení výkonu: Všechny interakce probíhají přes centrální objekt, což může vytvářet dodatečné náklady.
Příklad jednoduché implementace:
// Rozhraní pro mediátora
public interface IMediator
{
void SendMessage(string message, Colleague colleague);
}
// Základní třída pro kolegy
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étní 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étní kolegové
public class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Zpráva přijata od kolegy 1: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Zpráva odeslána kolegou 1: {message}");
mediator.SendMessage(message, this);
}
}
public class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Zpráva přijata od kolegy 2: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Zpráva odeslána kolegou 2: {message}");
mediator.SendMessage(message, this);
}
}
// Příklad použití
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Ahoj kolego 2!");
// colleague2.Send("Ahoj kolego 1!");
Obvykle se používá ve spojení s jinými vzory, například Observer, pro implementaci složitějších systémů výměny zpráv. V prostředí .NET se často používá v knihovnách pro práci s požadavky a příkazy, například MediatR.