Mediator — это поведенческий паттерн, который убирает прямые связи между компонентами, заставляя их общаться через посредника.
Простыми словами: диспетчер в аэропорту — самолёты не переговариваются друг с другом, а общаются через башню управления.
▪️ Пример:
Чат-комната: пользователи не отправляют сообщения друг другу напрямую — всё идёт через комнату, которая решает, кому доставить.
// Медиатор
interface ChatRoom {
void sendMessage(String message, User sender);
void addUser(User user);
}
class GroupChatRoom implements ChatRoom {
private final List<User> users = new ArrayList<>();
public void addUser(User user) {
users.add(user);
user.setChatRoom(this);
}
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;
public User(String name) {
this.name = name;
}
public void setChatRoom(ChatRoom room) {
this.chatRoom = room;
}
public void send(String message) {
chatRoom.sendMessage(message, this);
}
public void receive(String message, String from) {
System.out.println(name + " получил от " + from + ": " + message);
}
public 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("Привет всем!");
// Bob получил от Alice: Привет всем!
// Carol получил от Alice: Привет всем!
▪️ Когда использовать
— Компоненты слишком сильно связаны друг с другом
— Хотите переиспользовать компоненты в других контекстах
— Примеры: Spring MVC DispatcherServlet — медиатор между контроллерами
▪️ Минус
Медиатор может стать God Object, сконцентрировав слишком много логики.
🐸 Библиотека собеса по Java
#patterns