Что это такое
Паттерн Посредник (Mediator) переносит общение между многими объектами в одно центральное место. Вместо того чтобы каждый знал каждого (а n объектов означают n·n связей), каждый объект знает только посредника, а посредник передаёт сообщения дальше.
Пример: чат-комната
Пользователи никогда не хранят ссылки друг на друга. Пользователь отправляет сообщение в комнату; комната доставляет его всем остальным. Вход и выход меняют один список, в одном месте.
Все общаются через комнату
Ana знает только комнату; комната знает всех. Правила доставки — пропустить отправителя, а позже, возможно, отключение звука или личные сообщения — находятся ровно в одном методе.
Вывод: полная программа на Python
# Посредник: пользователи никогда не общаются друг с другом напрямую.
class ChatRoom:
def __init__(self) -> None:
self.users: list["User"] = []
def join(self, user: "User") -> None:
user.room = self
self.users.append(user)
def broadcast(self, sender: "User", msg: str) -> None:
for user in self.users:
if user is not sender:
print(user.name, "получает от", sender.name + ":", msg)
class User:
def __init__(self, name: str) -> None:
self.name = name
self.room: ChatRoom | None = None
def send(self, msg: str) -> None:
if self.room is not None:
self.room.broadcast(self, msg)
room = ChatRoom()
ana = User("ana")
ben = User("ben")
cleo = User("cleo")
room.join(ana)
room.join(ben)
room.join(cleo)
ana.send("всем привет")
Когда его использовать
Используйте его, когда многие объекты координируют свои действия и сеть «кто кому сообщает» становится слишком плотной — чат-системы, поля формы, которые включают и отключают друг друга, координация в стиле управления воздушным движением.
Не используйте его для двух-трёх объектов с простыми связями. Посредник между двумя сторонами — это лишнее звено, которое никто не просил.
Плюсы и минусы
Плюсы: участники остаются простыми и пригодными для повторного использования; правила координации можно прочитать в одном месте; добавление участника ничего больше не затрагивает.
Минусы: посредник разрастается — он может незаметно превратиться в огромный класс, который знает всё; весь трафик через одну точку может скрывать затраты на производительность.