Паттерн "Посредник" в 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
| Mediator | Observer | |
|---|---|---|
| Топология | Звезда через центр | Издатель → много подписчиков |
| Кто маршрутизирует | Посредник решает логику доставки | Издатель рассылает всем подписчикам |
| Типичный кейс | Сложные перекрёстные правила UI/чата | Событие "статус заказа изменился" |
Подробнее про Observer на C# — 121; на Java — 127.
Когда применять и риски
Уместен, если объектов много и прямые ссылки дают "паутину" зависимостей; нужно переиспользовать коллег в другом контексте.
Риск — медиатор превращается в God Object с тысячей строк. Лечение: разбить на под-медиаторы по доменам, вынести политики в отдельные классы.
См. также
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Паттерн — это повторяющийся шаблон, узор или схема. Паттерны встречаются повсюду — в природе, архитектуре, поведении людей и, конечно, в программировании. Порождающие паттерны проектирования — это группа шаблонов, направленных на решение задач, связанных с созданием объектов. Структурные паттерны — это группа шаблонов проектирования, решающих задачи организации классов и объектов таким образом, чтобы обеспечить гибкую архитектуру программного обеспечения. Поведенческие паттерны — это группа шаблонов проектирования, которые определяют способы взаимодействия объектов и распределения ответственности между ними. Архитектурные паттерны — это проверенные решения для организации структуры программного обеспечения. Интеграция систем — одна из центральных задач в современной разработке программного обеспечения. Паттерны доменного моделирования представляют собой проверенные решения для организации бизнес-логики в программных системах. Паттерн Strategy в C# — классическая реализация через интерфейс, замена на Func и Action, DI и критерии выбора без лишних абстракций. Паттерн Iterator в C# — ручной IEnumerator, генерация итератора компилятором через yield return, ленивость, LINQ и случаи, когда класс писать всё же нужно. Abstract Factory в C# и .NET — классическая схема через интерфейсы, замена через DI-контейнер, фабричный делегат и keyed services в .NET 8. Паттерн Command в C# — классическая схема, делегаты, MediatR, очередь задач, undo и критерии выбора между объектом команды и простым вызовом сервиса. Паттерн Observer в C# — event и делегаты, IObservable IObserver, слабая связанность, отписка и как не поймать утечки памяти в долгоживущих сервисах.Обзор паттернов проектирования
Порождающие паттерны
Структурные паттерны
Поведенческие паттерны
Архитектурные паттерны
Паттерны интеграции внешних систем
Паттерны проектирования доменных моделей
Стратегия в C#
Итератор в C#
Фабрика в C#
Команда в C#
Наблюдатель в C#