Padrão Mediator

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • MyrinNew
    Senior Member
    • Feb 2024
    • 5175

    #1

    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 ListUsuario> _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.




    More...
Working...