Что это
Паттерн Посредник переносит обмен сообщениями между множеством объектов в одно центральное место. Вместо того чтобы каждый знал каждого (а n объектов означают n·n связей), каждый объект знает только посредника, а посредник занимается маршрутизацией.
Пример: чат-комната
Пользователи никогда не хранят ссылки друг на друга. Пользователь отправляет сообщение в комнату, а комната доставляет его всем остальным. Вход и выход изменяют один список, в одном месте.
Все общаются через комнату
Пользователь ana знает только комнату, а комната знает всех. Правила доставки — пропустить отправителя, а позже, возможно, отключение звука или личные сообщения — находятся ровно в одном методе.
Вывод: PHP-скрипт
<?php
// Посредник: пользователи никогда не общаются друг с другом напрямую.
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, " получает от ", $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");
Когда применять
Применяйте, когда много объектов координируются между собой и сеть связей «кто кому сообщает» становится плотной: чат-системы, поля формы, которые включают и отключают друг друга, координация в стиле авиадиспетчерской службы.
Не применяйте для двух-трёх объектов с простыми связями. Посредник между двумя участниками — это лишний передаточный элемент, которого никто не просил.
Плюсы и минусы
Плюсы: участники остаются простыми и переиспользуемыми; правила координации читаются в одном месте; добавление участника ничего больше не затрагивает.
Минусы: посредник разрастается — он может незаметно превратиться в огромный класс, который знает всё; весь трафик через одну точку способен скрывать издержки производительности.