Sobes.tech
Middle

O que é um mediador no contexto da programação?

sobes.tech IA

Resposta da IA

O mediador é um padrão de design comportamental que propõe um objeto centralizado para gerir a interação entre outros objetos (colegas). Em vez de comunicarem diretamente, os objetos interagem através do mediador.

Vantagens do uso do mediador:

  • Redução do acoplamento: Os objetos não têm referências diretas uns aos outros, o que diminui a dependência.
  • Simplificação da gestão: As interações entre objetos são concentradas num só lugar, facilitando a compreensão e alteração.
  • Melhoria da reutilização: Componentes individuais podem ser reutilizados em outros contextos.

Desvantagens:

  • Aumento da complexidade do mediador: Com o aumento das interações, o mediador pode tornar-se complexo e difícil de manter.
  • Potencial impacto na performance: Todas as interações passam por um objeto central, o que pode gerar custos adicionais.

Exemplo de implementação simples:

// Interface para o mediador
public interface IMediator
{
    void SendMessage(string message, Colleague colleague);
}

// Classe base para colegas
public abstract class Colleague
{
    protected IMediator mediator;

    public Colleague(IMediator mediator)
    {
        this.mediator = mediator;
    }

    public abstract void ReceiveMessage(string message);
    public abstract void Send(string message);
}

// Mediador concreto
public class ConcreteMediator : IMediator
{
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;

    public ConcreteColleague1 Colleague1
    {
        set { colleague1 = value; }
    }

    public ConcreteColleague2 Colleague2
    {
        set { colleague2 = value; }
    }

    public void SendMessage(string message, Colleague colleague)
    {
        if (colleague == colleague1)
        {
            colleague2.ReceiveMessage(message);
        }
        else
        {
            colleague1.ReceiveMessage(message);
        }
    }
}

// Colegas concretos
public class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Mensagem recebida por Colega 1: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Mensagem enviada por Colega 1: {message}");
        mediator.SendMessage(message, this);
    }
}

public class ConcreteColleague2 : Colleague
{
    public ConcreteColleague2(IMediator mediator) : base(mediator) { }

    public override void ReceiveMessage(string message)
    {
        Console.WriteLine($"Mensagem recebida por Colega 2: {message}");
    }

    public override void Send(string message)
    {
        Console.WriteLine($"Mensagem enviada por Colega 2: {message}");
        mediator.SendMessage(message, this);
    }
}

// Exemplo de uso
// var mediator = new ConcreteMediator();
// var colleague1 = new ConcreteColleague1(mediator);
// var colleague2 = new ConcreteColleague2(mediator);
// mediator.Colleague1 = colleague1;
// mediator.Colleague2 = colleague2;
// colleague1.Send("Olá Colega 2!");
// colleague2.Send("Olá Colega 1!");

Frequentemente utilizado em conjunto com outros padrões, como o Observer, para sistemas de troca de mensagens mais complexos. No contexto do .NET, é comum em bibliotecas de trabalho com requisições e comandos, como o MediatR.