DEV Community

Juarez Júnior for Develop4Us

Posted on • Edited on

C# Design Pattern: Mediator (Portugues)

O padrão Mediator é usado para reduzir as dependências diretas entre os objetos ao introduzir um objeto mediador que controla a comunicação entre eles. Isso é útil quando você tem muitos objetos que precisam se comunicar entre si, mas não quer que eles estejam fortemente acoplados uns aos outros. O Mediator centraliza essa comunicação, tornando o código mais flexível e fácil de manter.

Exemplo de Código em C#:

// Interface do Mediador
public interface IMediador
{
    void EnviarMensagem(string mensagem, Colega colega);
}

// Classe base para colegas que se comunicam através do mediador
public abstract class Colega
{
    protected IMediador _mediador;

    public Colega(IMediador mediador)
    {
        _mediador = mediador;
    }

    public abstract void ReceberMensagem(string mensagem);
}

// Colega Concreto 1
public class ColegaConcreto1 : Colega
{
    public ColegaConcreto1(IMediador mediador) : base(mediador) { }

    public void Enviar(string mensagem)
    {
        Console.WriteLine($"Colega 1 enviando mensagem: {mensagem}");
        _mediador.EnviarMensagem(mensagem, this);
    }

    public override void ReceberMensagem(string mensagem)
    {
        Console.WriteLine($"Colega 1 recebeu mensagem: {mensagem}");
    }
}

// Colega Concreto 2
public class ColegaConcreto2 : Colega
{
    public ColegaConcreto2(IMediador mediador) : base(mediador) { }

    public void Enviar(string mensagem)
    {
        Console.WriteLine($"Colega 2 enviando mensagem: {mensagem}");
        _mediador.EnviarMensagem(mensagem, this);
    }

    public override void ReceberMensagem(string mensagem)
    {
        Console.WriteLine($"Colega 2 recebeu mensagem: {mensagem}");
    }
}

// Mediador Concreto que gerencia a comunicação
public class MediadorConcreto : IMediador
{
    private ColegaConcreto1 _colega1;
    private ColegaConcreto2 _colega2;

    public ColegaConcreto1 Colega1
    {
        set { _colega1 = value; }
    }

    public ColegaConcreto2 Colega2
    {
        set { _colega2 = value; }
    }

    public void EnviarMensagem(string mensagem, Colega colega)
    {
        if (colega == _colega1)
        {
            _colega2.ReceberMensagem(mensagem);
        }
        else
        {
            _colega1.ReceberMensagem(mensagem);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Criar o mediador
        MediadorConcreto mediador = new MediadorConcreto();

        // Criar colegas
        ColegaConcreto1 colega1 = new ColegaConcreto1(mediador);
        ColegaConcreto2 colega2 = new ColegaConcreto2(mediador);

        // Definir colegas no mediador
        mediador.Colega1 = colega1;
        mediador.Colega2 = colega2;

        // Colega 1 envia uma mensagem
        colega1.Enviar("Olá do Colega 1");

        // Colega 2 envia uma mensagem
        colega2.Enviar("Oi do Colega 2");
    }
}
Enter fullscreen mode Exit fullscreen mode

Explicação do Código:

Neste exemplo, o MediadorConcreto gerencia a comunicação entre dois colegas, ColegaConcreto1 e ColegaConcreto2. Quando um colega envia uma mensagem, o mediador decide para qual colega a mensagem será enviada. Isso reduz o acoplamento direto entre os colegas, já que eles não precisam saber sobre a existência um do outro, apenas do mediador.

Conclusão:

O padrão Mediator é útil quando você quer centralizar a comunicação entre vários objetos, evitando que eles fiquem diretamente acoplados. Isso torna o código mais modular e fácil de modificar, pois você pode mudar a lógica de comunicação sem alterar os objetos individuais.

Código fonte: GitHub

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay