Mediator

Problemet

Många objekt som pratar direkt med varandra (varje deltagare i en chatt känner till alla andra deltagare) skapar ett nät av beroenden — lägg till en ny deltagare, och du måste koppla ihop den med alla befintliga.

Lösningen

public interface IChatMediator
{
void SkickaMeddelande(string meddelande, Användare avsändare);
}
public class ChatRum : IChatMediator
{
private readonly List<Användare> _deltagare = new();
public void LäggTill(Användare användare) => _deltagare.Add(användare);
public void SkickaMeddelande(string meddelande, Användare avsändare)
{
foreach (var deltagare in _deltagare)
if (deltagare != avsändare)
deltagare.TaEmot(meddelande, avsändare.Namn);
}
}
public class Användare
{
public string Namn { get; }
private readonly IChatMediator _chatt;
public Användare(string namn, IChatMediator chatt) => (Namn, _chatt) = (namn, chatt);
public void Skicka(string meddelande) => _chatt.SkickaMeddelande(meddelande, this);
public void TaEmot(string meddelande, string frånNamn) =>
Console.WriteLine($"{Namn} tog emot från {frånNamn}: {meddelande}");
}
var rum = new ChatRum();
var anna = new Användare("Anna", rum);
var björn = new Användare("Björn", rum);
rum.LäggTill(anna);
rum.LäggTill(björn);
anna.Skicka("Hej allihopa!"); // Björn tog emot från Anna: Hej allihopa!

Användare känner bara till IChatMediator — aldrig till andra Användare-instanser direkt. Lägg till en tredje deltagare, och ingen befintlig Användare-kod behöver ändras.

TL;DR

Mediator centraliserar kommunikationen mellan flera objekt till ett enda objekt, så att deltagarna aldrig behöver känna till (eller bero direkt på) varandra.