← Назад к вопросам

Приведи пример паттерна Медиатор

2.2 Middle🔥 182 комментариев
#Архитектура и микросервисы#ООП и паттерны проектирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример реализации паттерна Медиатор на C#

Медиатор (Mediator) — поведенческий паттерн проектирования, который уменьшает связанность множества классов между собой, перемещая их взаимодействие в единый класс-посредник.

Суть паттерна

Вместо прямого взаимодействия объектов друг с другом (что создаёт сильно связанную систему), объекты взаимодействуют через централизованный объект-медиатор. Это упрощает поддержку кода, так как логика взаимодействия централизована, и добавление новых участников не требует изменения существующих классов.

Классический пример: чат-комната

Рассмотрим реализацию системы чата, где пользователи отправляют сообщения, но не взаимодействуют напрямую, а через медиатор (чат-комнату).

1. Интерфейс медиатора

public interface IChatMediator
{
    void SendMessage(string message, User user);
    void AddUser(User user);
}

2. Конкретный медиатор

public class ChatRoom : IChatMediator
{
    private List<User> _users = new List<User>();
    
    public void AddUser(User user)
    {
        _users.Add(user);
        user.SetMediator(this);
    }
    
    public void SendMessage(string message, User sender)
    {
        foreach (var user in _users)
        {
            // Отправляем сообщение всем, кроме отправителя
            if (user != sender)
            {
                user.Receive(message);
            }
        }
    }
}

3. Абстрактный класс коллеги

public abstract class User
{
    protected IChatMediator _mediator;
    public string Name { get; }
    
    protected User(string name)
    {
        Name = name;
    }
    
    public void SetMediator(IChatMediator mediator)
    {
        _mediator = mediator;
    }
    
    public abstract void Send(string message);
    public abstract void Receive(string message);
}

4. Конкретные классы коллег

public class ChatUser : User
{
    public ChatUser(string name) : base(name) { }
    
    public override void Send(string message)
    {
        Console.WriteLine($"{Name} отправляет: {message}");
        _mediator.SendMessage(message, this);
    }
    
    public override void Receive(string message)
    {
        Console.WriteLine($"{Name} получает: {message}");
    }
}

5. Клиентский код

class Program
{
    static void Main(string[] args)
    {
        // Создаем медиатор
        IChatMediator chatRoom = new ChatRoom();
        
        // Создаем пользователей
        User user1 = new ChatUser("Алексей");
        User user2 = new ChatUser("Мария");
        User user3 = new ChatUser("Иван");
        
        // Регистрируем пользователей в чат-комнате
        chatRoom.AddUser(user1);
        chatRoom.AddUser(user2);
        chatRoom.AddUser(user3);
        
        // Пользователи отправляют сообщения через медиатор
        user1.Send("Привет всем!");
        user2.Send("Привет, Алексей!");
        user3.Send("Как дела?");
    }
}

Преимущества паттерна Медиатор

  • Уменьшение связанности — объекты не знают друг о друге, взаимодействуя только через медиатор
  • Централизация управления — вся логика взаимодействия в одном месте
  • Упрощение повторного использования — компоненты можно использовать независимо
  • Упрощение тестирования — медиатор можно легко подменить или протестировать отдельно

Недостатки

  • Медиатор может стать "божественным объектом" — если логика станет слишком сложной, медиатор превратится в монолитный класс
  • Усложнение системы — добавление нового посредника увеличивает сложность архитектуры

Применение в реальных проектах

  1. Системы событий — когда множество компонентов реагируют на события других компонентов
  2. UI-фреймворки — взаимодействие элементов управления без прямых ссылок друг на друга
  3. Игровые движки — управление взаимодействием игровых объектов
  4. Бизнес-логика — координация действий различных сервисов в enterprise-приложениях

Паттерн Медиатор особенно полезен в системах, где количество связей между объектами растёт экспоненциально, помогая поддерживать код чистым и расширяемым.

Приведи пример паттерна Медиатор | PrepBro