Middle
Kas yra mediatorius programavimo kontekste?
sobes.tech AI
Atsakymas iš AI
Mediatorius yra elgsenos dizaino šablonas, siūlantis centralizuotą objektą, kuris valdo sąveiką tarp kitų objektų (kolegų). Vietoj to, kad objektai tiesiogiai bendrautų tarpusavyje, jie tai daro per mediatorų.
Mediatorius naudojimo privalumai:
- Mažesnė priklausomybė: Objektai neturi tiesioginių nuorodų vienas į kitą, kas sumažina jų priklausomybę.
- Valdymo supaprastinimas: Sąveikos tarp objektų yra sutelktos vienoje vietoje, kas palengvina jų supratimą ir keitimą.
- Pakartotinio naudojimo gerinimas: Atskiri komponentai gali būti naudojami kituose kontekstuose, nes jie nėra stipriai susiję su kitais sistemos komponentais.
Trūkumai:
- Mediatorius tampa sudėtingesnis: Didėjant sąveikų skaičiui, mediatorius gali tapti sudėtingas ir sunkiai prižiūrimas.
- Galimas našumo sumažėjimas: Visos sąveikos vyksta per centrinį objektą, kas gali sukelti papildomas išlaidas.
Pavyzdys paprasto realizavimo:
// Mediatoriaus sąsaja
public interface IMediator
{
void SendMessage(string message, Colleague colleague);
}
// Kolegos bazinė klasė
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);
}
// Konkretus mediatorius
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);
}
}
}
// Konkretūs kolegos
public class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Kolega 1 gavo žinutę: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Kolega 1 išsiuntė žinutę: {message}");
mediator.SendMessage(message, this);
}
}
public class ConcreteColleague2 : Colleague
{
public ConcreteColleague2(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Kolega 2 gavo žinutę: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Kolega 2 išsiuntė žinutę: {message}");
mediator.SendMessage(message, this);
}
}
// Pavyzdys naudojimo
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Labas, kolega 2!");
// colleague2.Send("Labas, kolega 1!");
Dažnai naudojamas kartu su kitais šablonais, pvz., Observer, sudėtingesnių žinučių mainų sistemų įgyvendinimui. .NET kontekste dažnai taikomas užklausų ir komandų bibliotekose, tokiose kaip MediatR.