Junior — Middle
Can you explain the principle of the Mediator pattern and its main purpose?
sobes.tech AI
Answer from AI
The Mediator pattern is designed to simplify interactions between objects by reducing the number of direct connections between them. Instead of objects communicating directly with each other, they interact through a mediator.
The main idea: all communications pass through a single central object (Mediator), which manages the interaction and coordinates the actions of components.
This helps to:
- Avoid tight coupling between classes.
- Centralize interaction logic.
- Simplify maintenance and extension of the code.
Example in C#:
// Mediator interface
interface IMediator
{
void Notify(object sender, string ev);
}
// Concrete mediator
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();
}
}
}
// Base component
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");
}
}
// Usage
var c1 = new Component1();
var c2 = new Component2();
var mediator = new ConcreteMediator(c1, c2);
c1.DoA();
c2.DoD();