Padrão Mediator
Introdução
o mediator é um padrão de design comportamental (do catálogo GoF). Seu objetivo é reduzir o acoplamento direto entre objetos, centralizando a comunicação em um objeto intermediário chamado mediador.
Em sistemas grandes vários objetos interagem entre si. Se cada objeto se comunicar diretamente com os outros, o sistema fica aclopado como uma “teia” de dependências difícil de manter. O Mediador entra nesse cenário, e atua como um “hub”, onde em vez de os objetos conversarem entre si diretamente, eles falam com o mediador, que decide para onde a mensagem vai
Analogia
Imagine um aeroporto:
- Os pilotos não ficam falando uns com os outros diretamente pelo rádio
- Eles falam com a torre de controle (o mediador)
- A torre organiza e coordena a comunicação, evitando conflitos
Estrutura do Mediator
- Mediator (interface/abstração): define como os colegas (colleagues) se comunicam atráves dele
- ConcreteMediator: Implementa a lógica de coordenação
- Colleagues: objetos que dependem do mediador para interagir
Exemplo prático
Num chat:
- Usuário A quer mandar uma mensagem para Usuário B.
- Em vez de A conhecer diretamente B, A envia a mensagem para o ChatMediator, que então encaminha para B.
// Interface do Mediator
public interface IChatMediator
{
void EnviarMensagem(string mensagem, Usuario usuario);
void AdicionarUsuario(Usuario usuario);
}
// Implementação concreta
public class ChatMediator : IChatMediator
{
private List<Usuario> _usuarios = new();
public void AdicionarUsuario(Usuario usuario) => _usuarios.Add(usuario);
public void EnviarMensagem(string mensagem, Usuario usuario)
{
foreach (var u in _usuarios)
{
if (u != usuario)
u.ReceberMensagem(mensagem);
}
}
}
// Colleague
public class Usuario
{
private IChatMediator _mediator;
public string Nome { get; }
public Usuario(string nome, IChatMediator mediator)
{
Nome = nome;
_mediator = mediator;
_mediator.AdicionarUsuario(this);
}
public void EnviarMensagem(string msg) =>
_mediator.EnviarMensagem($"{Nome}: {msg}", this);
public void ReceberMensagem(string msg) =>
Console.WriteLine(msg);
}
No .NET moderno, esse padrão é muito utilizado através da biblioteca MediatR, que implementa o conceito para lidar com commands e queries em arquitetura como CQRS e Clean Architecture.