Ce este
Modelul Mediator mută comunicarea dintre multe obiecte într-un singur loc central. În loc ca fiecare să cunoască pe toți ceilalți (iar 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 mesajul către cameră; camera îl livrează tuturor celorlalți. Intrarea și ieșirea din cameră ating o singură listă, într-un singur loc.
Toți vorbesc prin cameră
Ana cunoaște doar camera; camera îi cunoaște pe toți. Regulile de livrare — sari peste expeditor, mai târziu poate mesaje mute sau private — se află într-o singură metodă.
Ieșire: program Go și rezultatul capturat
package main
import "fmt"
// Mediatorul: utilizatorii nu vorbesc niciodată direct între ei.
type ChatRoom struct {
users []*User
}
func (c *ChatRoom) Join(u *User) {
u.room = c
c.users = append(c.users, u)
}
func (c *ChatRoom) Broadcast(from *User, msg string) {
for _, u := range c.users {
if u != from {
fmt.Println(u.name, "primește de la", from.name+":", msg)
}
}
}
type User struct {
name string
room *ChatRoom
}
func (u *User) Send(msg string) {
u.room.Broadcast(u, msg)
}
func main() {
room := &ChatRoom{}
ana := &User{name: "ana"}
ben := &User{name: "ben"}
cleo := &User{name: "cleo"}
room.Join(ana)
room.Join(ben)
room.Join(cleo)
ana.Send("salut tuturor")
}
Când să îl folosești
Folosește-l când multe obiecte se coordonează, iar rețeaua de cine-cui-îi-spune 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 nu l-a angajat nimeni.
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 tipul uriaș care știe tot; tot traficul printr-un singur punct poate ascunde costuri de performanță.