Что это такое
Паттерн Mediator (посредник) переносит общение между множеством объектов в одно центральное место. Вместо того чтобы каждый знал каждого (а n объектов означают n·n связей), каждый объект знает только посредника, а посредник направляет сообщения.
Пример: чат-комната
Пользователи никогда не хранят ссылки друг на друга. Пользователь отправляет сообщение в комнату, а комната доставляет его всем остальным. Вход и выход затрагивают один массив в одном месте.
Все общаются через комнату
Ana знает только комнату, а комната знает всех. Один вызов send выводит две строки — ben и cleo получают сообщение, а ana не получает своё собственное сообщение обратно. Правила доставки — пропустить отправителя, а позже, возможно, отключить звук или добавить личные сообщения — находятся ровно в одном методе.
Вывод: программа на TypeScript и захваченный вывод
// Посредник: пользователи никогда не общаются друг с другом напрямую.
class ChatRoom {
private users: User[] = []
join(user: User): void {
user.room = this
this.users.push(user)
}
broadcast(from: User, message: string): void {
for (const user of this.users) {
if (user !== from) {
console.log(user.name, "получает от", from.name + ":", message)
}
}
}
}
class User {
readonly name: string
room: ChatRoom | undefined
constructor(name: string) {
this.name = name
}
send(message: string): void {
this.room?.broadcast(this, message)
}
}
const room = new ChatRoom()
const ana = new User("ana")
const ben = new User("ben")
const cleo = new User("cleo")
room.join(ana)
room.join(ben)
room.join(cleo)
ana.send("всем привет")
Когда его применять
Применяйте его, когда много объектов координируют свои действия и сеть «кто кому сообщает» становится слишком плотной — чат-системы, поля формы, которые включают и отключают друг друга, координация в стиле управления воздушным движением.
Откажитесь от него, если объектов два или три и связи простые. Посредник между двумя сторонами — это лишнее звено, которое никто не нанимал.
Плюсы и минусы
Плюсы: участники остаются простыми и переиспользуемыми; правила координации читаются в одном месте; добавление участника не затрагивает ничего другого.
Минусы: посредник разрастается — он может незаметно превратиться в огромный класс, который знает всё; весь трафик через одну точку может скрывать потери в производительности.