Middle
Kas ir mediators programmēšanas kontekstā?
sobes.tech AI
Atbilde no AI
Mediator ir irelācijas dizaina paraugs, kas piedāvā centralizētu objektu, kas pārvalda mijiedarbību starp citiem objektiem (kolēģiem). Tā vietā, lai objekti tieši sazinātos savā starpā, tie to dara caur mediatoru.
Mediatoru izmantošanas priekšrocības:
- Samazināta saistība: Objektiem nav tiešas atsauces viens uz otru, kas samazina to atkarību.
- Vadības vienkāršošana: Savstarpējās mijiedarbības ir koncentrētas vienā vietā, kas atvieglo to saprašanu un izmaiņas.
- Atkārtotas izmantošanas uzlabošana: Atsevišķas sastāvdaļas var tikt izmantotas citos kontekstos, jo tās nav ļoti saistītas ar citiem sistēmas komponentiem.
Trūkumi:
- Mediatoru kļūst sarežģītāku: Palielinoties mijiedarbību skaitam, mediatoru var kļūt sarežģītu un grūti uzturamu.
- Iespējams veiktspējas samazinājums: Visas mijiedarbības notiek caur centrālo objektu, kas var radīt papildu izmaksas.
Piemērs vienkāršai realizācijai:
// Mediatora interfeiss
public interface IMediator
{
void SendMessage(string message, Colleague colleague);
}
// Koleģu bāzes klase
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ēts mediators
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ēti kolēģi
public class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(IMediator mediator) : base(mediator) { }
public override void ReceiveMessage(string message)
{
Console.WriteLine($"Kolega 1 saņēma ziņu: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Kolega 1 nosūtīja ziņu: {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 saņēma ziņu: {message}");
}
public override void Send(string message)
{
Console.WriteLine($"Kolega 2 nosūtīja ziņu: {message}");
mediator.SendMessage(message, this);
}
}
// Piemērs izmantošanai
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Sveiki, kolēģi 2!");
// colleague2.Send("Sveiki, kolēģi 1!");
Bieži tiek izmantots kopā ar citiem šabloniem, piemēram, Observer, lai realizētu sarežģītākas ziņojumu apmaiņas sistēmas. .NET kontekstā tas bieži tiek izmantots pieprasījumu un komandu bibliotēkās, piemēram, MediatR.