Skip to content

Посредник (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!");
    }
}

Объяснение

  1. Интерфейс ChatMediator: Определяет методы для отправки сообщений и добавления пользователей в чат.

  2. Класс ChatRoom: Реализует интерфейс ChatMediator. Он хранит список пользователей и управляет отправкой сообщений между ними.

  3. Абстрактный класс User: Определяет общие методы для пользователей, такие как send() и receive(). Каждый пользователь имеет ссылку на посредника.

  4. Класс ConcreteUser: Реализует методы send() и receive(), позволяя пользователям отправлять и получать сообщения через посредника.

  5. Класс MediatorPatternDemo: Демонстрирует использование паттерна "Посредник". Мы создаем чат-комнату и пользователей, добавляем пользователей в чат и отправляем сообщения.

Заключение

Паттерн "Посредник" помогает уменьшить связанность между объектами, позволяя им взаимодействовать через посредника. Это упрощает взаимодействие и делает систему более гибкой и поддерживаемой. В приведенном примере мы увидели, как можно использовать посредника для управления общением между пользователями в чат-комнате.