Ce este
Șablonul Mediator mută comunicarea dintre multe obiecte într-un singur loc central. În loc ca fiecare să cunoască pe toți ceilalți (și n obiecte să însemne n·n legături), fiecare obiect cunoaște doar mediatorul, iar mediatorul dirijează mesajele.
Exemplu: o cameră de chat
Utilizatorii nu păstrează niciodată referințe unii către alții. Un utilizator trimite către cameră; camera livrează tuturor celorlalți. Intrarea și ieșirea ating o singură listă, într-un singur loc.
Toți vorbesc prin intermediul camerei
ana cunoaște doar camera; camera cunoaște pe toți. Regulile de livrare — sari peste expeditor, mai târziu poate dezactivarea notificărilor sau mesajele private — se află într-o singură metodă.
Ieșire: script PHP
<?php
// Mediatorul: utilizatorii nu vorbesc niciodată direct între ei.
class ChatRoom {
/** @var User[] */
private array $users = [];
public function join(User $user): void {
$user->room = $this;
$this->users[] = $user;
}
public function broadcast(User $from, string $msg): void {
foreach ($this->users as $user) {
if ($user !== $from) {
echo $user->name, " primește de la ", $from->name, ": ", $msg, "\n";
}
}
}
}
class User {
public ?ChatRoom $room = null;
public function __construct(public string $name) {}
public function send(string $msg): void {
$this->room->broadcast($this, $msg);
}
}
$room = new ChatRoom();
$ana = new User("ana");
$ben = new User("ben");
$cleo = new User("cleo");
$room->join($ana);
$room->join($ben);
$room->join($cleo);
$ana->send("hello everyone");
Când să îl folosești
Folosește-l atunci când multe obiecte se coordonează și rețeaua de cine-anunță-pe-cine devine deasă — sisteme de chat, câmpuri de formular care se activează și se dezactivează reciproc, coordonare în stilul traficului aerian.
Renunță la el pentru două sau trei obiecte cu legături simple. Un mediator între două părți este un intermediar pe care nimeni nu l-a angajat.
Avantaje și dezavantaje
Avantaje: participanții rămân simpli și reutilizabili; regulile de coordonare se citesc într-un singur loc; adăugarea unui participant nu atinge nimic altceva.
Dezavantaje: mediatorul crește — poate deveni pe nesimțite clasa uriașă care știe tot; tot traficul printr-un singur punct poate ascunde costuri de performanță.