Посредник (Mediator)
Краткое описание
Шаблон проектирования "Посредник" (Mediator) используется для уменьшения связанности между объектами, позволяя им взаимодействовать через посредника вместо прямого общения друг с другом. Это упрощает взаимодействие между объектами и делает систему более гибкой и поддерживаемой.
Пример использования паттерна Mediator на Java
Рассмотрим пример, в котором у нас есть чат-комната, где пользователи могут отправлять сообщения. Вместо того чтобы пользователи напрямую взаимодействовали друг с другом, они будут общаться через посредника — чат-комнату.
Шаг 1: Создание интерфейса посредника
public interface ChatMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
Шаг 2: Реализация конкретного посредника
import java.util.ArrayList;
import java.util.List;
public class ChatRoom implements ChatMediator {
private List<User> users;
public ChatRoom() {
this.users = new ArrayList<>();
}
@Override
public void sendMessage(String message, User user) {
for (User u : users) {
// Не отправляем сообщение отправителю
if (u != user) {
u.receive(message);
}
}
}
@Override
public void addUser(User user) {
users.add(user);
}
}
Шаг 3: Создание класса пользователя
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
}
Шаг 4: Реализация конкретных пользователей
public class ConcreteUser extends User {
public ConcreteUser(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(name + ": Sending Message = " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(name + ": Received Message = " + message);
}
}
Шаг 5: Использование посредника
Теперь мы можем использовать наш посредник в коде:
public class MediatorPatternDemo {
public static void main(String[] args) {
ChatMediator chatRoom = new ChatRoom();
User user1 = new ConcreteUser(chatRoom, "Alice");
User user2 = new ConcreteUser(chatRoom, "Bob");
User user3 = new ConcreteUser(chatRoom, "Charlie");
chatRoom.addUser(user1);
chatRoom.addUser(user2);
chatRoom.addUser(user3);
user1.send("Hello, everyone!");
user2.send("Hi, Alice!");
}
}
Объяснение
-
Интерфейс
ChatMediator
: Определяет методы для отправки сообщений и добавления пользователей в чат. -
Класс
ChatRoom
: Реализует интерфейсChatMediator
. Он хранит список пользователей и управляет отправкой сообщений между ними. -
Абстрактный класс
User
: Определяет общие методы для пользователей, такие какsend()
иreceive()
. Каждый пользователь имеет ссылку на посредника. -
Класс
ConcreteUser
: Реализует методыsend()
иreceive()
, позволяя пользователям отправлять и получать сообщения через посредника. -
Класс
MediatorPatternDemo
: Демонстрирует использование паттерна "Посредник". Мы создаем чат-комнату и пользователей, добавляем пользователей в чат и отправляем сообщения.
Заключение
Паттерн "Посредник" помогает уменьшить связанность между объектами, позволяя им взаимодействовать через посредника. Это упрощает взаимодействие и делает систему более гибкой и поддерживаемой. В приведенном примере мы увидели, как можно использовать посредника для управления общением между пользователями в чат-комнате.