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

Что такое паттерн Медиатор?

2.3 Middle🔥 231 комментариев
#ASP.NET и Web API#Основы C# и .NET

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

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

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

Паттерн Медиатор: Определение и Основные Принципы

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

Суть паттерна в двух принципах

  1. Разделение ответственности: Компоненты выполняют свою собственную узкую функцию.
  2. Централизованное управление: Медиатор координирует все взаимодействия между компонентами, освобождая их от необходимости знать друг о друга.

Аналогия из реальной жизни и Архитектурная аналогия

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

Реализация паттерна Медиатор в C#

В C# паттерн реализуется через три основных элемента:

  • Интерфейс IMediator: Определяет методы для коммуникации.
  • Конкретный класс Mediator: Реализует логику взаимодействия.
  • Классы компонентов (Colleagues): Объекты, которые взаимодействуют через медиатор.

Пример реализации с кодом

Рассмотрим систему заказа, где пользователь, система платежей и система доставки взаимодействуют через медиатор.

// 1. Интерфейс медиатора
public interface IOrderMediator
{
    void ProcessOrder(string orderId, Customer customer);
    void RegisterComponent(object component);
}

// 2. Конкретный медиатор
public class OrderMediator : IOrderMediator
{
    private PaymentSystem _paymentSystem;
    private DeliverySystem _deliverySystem;

    public void RegisterComponent(object component)
    {
        if (component is PaymentSystem) _paymentSystem = (PaymentSystem)component;
        if (component is DeliverySystem) _deliverySystem = (DeliverySystem)component;
    }

    public void ProcessOrder(string orderId, Customer customer)
    {
        // Медиатор координирует взаимодействие
        var paymentResult = _paymentSystem.ProcessPayment(orderId, customer.PaymentDetails);
        if (paymentResult.Success)
        {
            var deliveryDetails = _deliverySystem.ScheduleDelivery(orderId, customer.Address);
            customer.Notify($"Заказ {orderId} оплачен и будет доставлен {deliveryDetails.Date}");
        }
        else
        {
            customer.Notify($"Оплата заказа {orderId} не прошла");
        }
    }
}

// 3. Компоненты (Colleagues)
public class Customer
{
    public string PaymentDetails { get; set; }
    public string Address { get; set; }

    public void Notify(string message)
    {
        Console.WriteLine($"Уведомление для клиента: {message}");
    }
}

public class PaymentSystem
{
    public PaymentResult ProcessPayment(string orderId, string paymentDetails)
    {
        // Логика обработки платежа
        return new PaymentResult { Success = true };
    }
}

public class DeliverySystem
{
    public DeliveryDetails ScheduleDelivery(string orderId, string address)
    {
        // Логика планирования доставки
        return new DeliveryDetails { Date = DateTime.Now.AddDays(2) };
    }
}

// 4. Использование
var mediator = new OrderMediator();
var paymentSystem = new PaymentSystem();
var deliverySystem = new DeliverySystem();
var customer = new Customer { Address = "Москва", PaymentDetails = "Карта" };

mediator.RegisterComponent(paymentSystem);
mediator.RegisterComponent(deliverySystem);

mediator.ProcessOrder("ORD123", customer);

Ключевые преимущества паттерна

  • Уменьшение связности: Компоненты становятся независимыми и легко заменяемыми.
  • Централизованный контроль: Упрощается управление сложной бизнес-логикой.
  • Улучшенная тестируемость: Медиатор можно тестировать отдельно.
  • Упрощение системы: Добавление новых компонентов не требует изменения существующих.

Распространенные применения в C# Backend

  • Событийные системы и шины событий: Например, MediatR библиотека реализует этот паттерн для обработки команд и событий.
  • Микросервисные оркестраторы: Координация между микросервисами.
  • Системы обработки сообщений: Координация между обработчиками в цепочках.
  • Интерфейсы пользователя: Координация между элементами UI (в веб-приложениях).
  • Сложные бизнес-процессы: Например, в workflow-системах.

Сравнение с другими паттернами

  • Медиатор vs Наблюдатель: Медиатор активно управляет компонентами, а Наблюдатель лишь реагирует на события.
  • Медиатор vs Фасад: Фасад скрывает сложную подсистему, а Медиатор управляет взаимодействием равноправных компонентов.

Потенциальные недостатки

  • Медиатор может стать слишком сложным: Если вся логика системы сосредотачивается в одном классе, он превращается в "божественный объект".
  • Дополнительный уровень абстракции: В простых системах может добавить ненужную сложность.

Заключение

Паттерн Медиатор является мощным инструментом для архитекторов C# backend систем, позволяющим создавать модульные, легко поддерживаемые и масштабируемые приложения. Он особенно полезен в системах с множеством взаимодействующих компонентов, где прямое связывание приводит к высокой связности и сложности поддержки. При правильном применении медиатор способствует соблюдению принципов SOLID, особенно принципа единственной ответственности и инверсии зависиностей.