Sobes.tech
Back to questions
Junior — Middle
66

Можете объяснить принцип работы паттерна Mediator и его основное предназначение?

Answer from AI

sobes.tech AI

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

Основная идея: все коммуникации проходят через один центральный объект (Mediator), который управляет взаимодействием и координирует действия компонентов.

Это помогает:

  • Избежать сильной связанности между классами.
  • Централизовать логику взаимодействия.
  • Упростить поддержку и расширение кода.

Пример на C#:

// Интерфейс медиатора
interface IMediator
{
    void Notify(object sender, string ev);
}

// Конкретный медиатор
class ConcreteMediator : IMediator
{
    private Component1 _component1;
    private Component2 _component2;

    public ConcreteMediator(Component1 c1, Component2 c2)
    {
        _component1 = c1;
        _component1.SetMediator(this);
        _component2 = c2;
        _component2.SetMediator(this);
    }

    public void Notify(object sender, string ev)
    {
        if (ev == "A")
        {
            Console.WriteLine("Mediator reacts on A and triggers following operations:");
            _component2.DoC();
        }
        else if (ev == "D")
        {
            Console.WriteLine("Mediator reacts on D and triggers following operations:");
            _component1.DoB();
            _component2.DoC();
        }
    }
}

// Базовый компонент
class BaseComponent
{
    protected IMediator _mediator;

    public BaseComponent(IMediator mediator = null)
    {
        _mediator = mediator;
    }

    public void SetMediator(IMediator mediator)
    {
        _mediator = mediator;
    }
}

class Component1 : BaseComponent
{
    public void DoA()
    {
        Console.WriteLine("Component 1 does A.");
        _mediator.Notify(this, "A");
    }

    public void DoB()
    {
        Console.WriteLine("Component 1 does B.");
    }
}

class Component2 : BaseComponent
{
    public void DoC()
    {
        Console.WriteLine("Component 2 does C.");
    }

    public void DoD()
    {
        Console.WriteLine("Component 2 does D.");
        _mediator.Notify(this, "D");
    }
}

// Использование
var c1 = new Component1();
var c2 = new Component2();
var mediator = new ConcreteMediator(c1, c2);
c1.DoA();
c2.DoD();