Sobes.tech
Back to questions
Junior — Middle
67

Можете объяснить, что представляет собой паттерн Медиатор и в чем его основная идея?

Answer from AI

sobes.tech AI

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

Основная идея:

  • Все взаимодействия между компонентами проходят через один объект — медиатор.
  • Компоненты не знают о других компонентах напрямую, а только о медиаторе.
  • Медиатор управляет коммуникацией и координацией между объектами.

Пример на C#:

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

// Конкретный медиатор
public 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();
        }
    }
}

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

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

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

public 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.");
    }
}

public 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");
    }
}