Sobes.tech
Junior — Middle

Mediator desen pattern'in çalışma prensibini ve temel amacını açıklayabilir misiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Паттерн 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();