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();