DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

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

Enter fullscreen mode Exit fullscreen mode

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.

Top comments (0)