Перейти к основному содержимому

Паттерн "Посредник" в Java — чат-комната и DispatcherServlet

Разработчику Архитектору

Краткий обзор — в поведенческих паттернах. Здесь — Mediator на Java: коллеги не вызывают друг друга напрямую, а координируются через центральный объект.

Загрузка редактора схем…

Задача паттерна

Mediator убирает сеть прямых связей "каждый с каждым". Участники знают только посредника; он решает, кому передать сообщение и как отреагировать.

Аналогия — диспетчер в аэропорту: самолёты не согласуют взлёт между собой, а общаются с башней.


Пример — групповой чат

import java.util.ArrayList;
import java.util.List;

interface ChatRoom {
void sendMessage(String message, User sender);
void addUser(User user);
}

class GroupChatRoom implements ChatRoom {
private final List<User> users = new ArrayList<>();

@Override
public void addUser(User user) {
users.add(user);
user.setChatRoom(this);
}

@Override
public void sendMessage(String message, User sender) {
users.stream()
.filter(u -> u != sender)
.forEach(u -> u.receive(message, sender.getName()));
}
}

class User {
private final String name;
private ChatRoom chatRoom;

User(String name) {
this.name = name;
}

void setChatRoom(ChatRoom room) {
this.chatRoom = room;
}

void send(String message) {
chatRoom.sendMessage(message, this);
}

void receive(String message, String from) {
System.out.println(name + " получил от " + from + ": " + message);
}

String getName() {
return name;
}
}
ChatRoom room = new GroupChatRoom();
User alice = new User("Alice");
User bob = new User("Bob");
User carol = new User("Carol");

room.addUser(alice);
room.addUser(bob);
room.addUser(carol);

alice.send("Привет всем!");

Mediator в Java-экосистеме

ПримерРоль медиатора
Spring MVC DispatcherServletМаршрутизация HTTP к контроллеру без связей контроллер↔контроллер; полный путь запроса (фильтры, HandlerMapping, перехватчики, ответ) — жизненный цикл в Spring Boot
Message broker (Kafka, JMS)Продюсеры и консьюмеры не знают друг друга
JavaFX / SwingКоординаторы UI-событий между виджетами

См. обзор Spring.


Mediator и Observer

MediatorObserver
ТопологияЗвезда через центрИздатель → много подписчиков
Кто маршрутизируетПосредник решает логику доставкиИздатель рассылает всем подписчикам
Типичный кейсСложные перекрёстные правила UI/чатаСобытие "статус заказа изменился"

Подробнее про Observer на C# — 121; на Java — 127.


Когда применять и риски

Уместен, если объектов много и прямые ссылки дают "паутину" зависимостей; нужно переиспользовать коллег в другом контексте.

Риск — медиатор превращается в God Object с тысячей строк. Лечение: разбить на под-медиаторы по доменам, вынести политики в отдельные классы.


См. также

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").