Mediator Pattern: Facilitando a Comunicação entre Objetos em um Sistema

O padrão de projeto Mediator tem um papel crucial na arquitetura de software. Seu principal objetivo é facilitar a comunicação entre objetos em um sistema, agindo como um intermediário para centralizar e gerenciar essa comunicação.

A Importância do Mediator Pattern no Desenvolvimento de Software

Com a crescente complexidade dos sistemas de software, a necessidade de eficiência e organização tornou-se imperativa. Aqui é onde o Mediator Pattern brilha. Ao simplificar a comunicação entre objetos e reduzir o acoplamento, ele aumenta a eficiência do sistema e permite um fluxo de trabalho mais fluido.

Como o Mediator Pattern Facilita a Comunicação entre os Objetos

O Mediator Pattern atua como um intermediário, permitindo que os objetos se comuniquem de maneira indireta. Isso significa que em vez de cada objeto ter que conhecer e interagir com todos os outros, eles apenas interagem com o mediador. O mediador, por sua vez, cuida da comunicação com outros objetos conforme necessário.

Benefícios da Utilização do Mediator Pattern

Flexibilidade e Modularidade

O Mediator Pattern promove a flexibilidade e modularidade, já que os objetos podem interagir sem se conhecerem diretamente. Isso também facilita a substituição, adição ou remoção de objetos sem causar grandes impactos no sistema.

Manutenção Facilitada

A manutenção do sistema torna-se mais simples, pois as mudanças em um objeto não afetam diretamente os outros. Alterações e correções podem ser feitas no mediador, sem a necessidade de alterar cada objeto individualmente.

Escalabilidade do Sistema

Este padrão favorece a escalabilidade, já que a adição de novos objetos ou funcionalidades não afeta a complexidade das comunicações.

Principais Usos e Exemplos do Mediator Pattern

O Mediator Pattern é comumente usado em sistemas onde há muitos objetos que precisam interagir, como interfaces gráficas, simulações e sistemas de fluxo de trabalho.

Exemplo de implementação em C#

C#
// Interface do Mediator
public interface IMediator
{
    void EnviarMensagem(string mensagem, Colleague colleague);
}

// Classe Mediator concreta
public class Mediator : IMediator
{
    private Colleague colleague1;
    private Colleague colleague2;

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

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

    public void EnviarMensagem(string mensagem, Colleague colleague)
    {
        if (colleague == colleague1)
        {
            colleague2.ReceberMensagem(mensagem);
        }
        else if (colleague == colleague2)
        {
            colleague1.ReceberMensagem(mensagem);
        }
    }
}

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

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

    public abstract void EnviarMensagem(string mensagem);
    public abstract void ReceberMensagem(string mensagem);
}

// Classes Colleague concretas
public class ConcreteColleague1 : Colleague
{
    public ConcreteColleague1(IMediator mediator) : base(mediator)
    {
    }

    public override void EnviarMensagem(string mensagem)
    {
        mediator.EnviarMensagem(mensagem, this);
    }

    public override void ReceberMensagem(string mensagem)
    {
        Console.WriteLine("ConcreteColleague1 recebeu a mensagem: " + mensagem);
    }
}

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

    public override void EnviarMensagem(string mensagem)
    {
        mediator.EnviarMensagem(mensagem, this);
    }

    public override void ReceberMensagem(string mensagem)
    {
        Console.WriteLine("ConcreteColleague2 recebeu a mensagem: " + mensagem);
    }
}

// Exemplo de uso
public class Program
{
    public static void Main(string[] args)
    {
        // Cria o Mediator
        Mediator mediator = new Mediator();

        // Cria os Colleagues
        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

        // Define os Colleagues no Mediator
        mediator.Colleague1 = colleague1;
        mediator.Colleague2 = colleague2;

        // Envio de mensagens
        colleague1.EnviarMensagem("Olá, como você está?");
        colleague2.EnviarMensagem("Estou bem, obrigado!");

        Console.ReadLine();
    }
}

// Fonte: ChatGPT

Neste exemplo, temos um Mediator que atua como intermediário entre os Colleagues ConcreteColleague1 e ConcreteColleague2. Quando um Colleague envia uma mensagem, o Mediator recebe a mensagem e repassa para o outro Colleague. Dessa forma, os Colleagues se comunicam de forma indireta, evitando o acoplamento direto entre eles.

Exemplo de implementação em Java

Java
// Interface do Mediator
interface Mediator {
    void enviarMensagem(String mensagem, Colleague colleague);
}

// Classe Mediator concreta
class ConcreteMediator implements Mediator {
    private Colleague colleague1;
    private Colleague colleague2;

    public void setColleague1(Colleague colleague) {
        this.colleague1 = colleague;
    }

    public void setColleague2(Colleague colleague) {
        this.colleague2 = colleague;
    }

    public void enviarMensagem(String mensagem, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.receberMensagem(mensagem);
        } else if (colleague == colleague2) {
            colleague1.receberMensagem(mensagem);
        }
    }
}

// Classe Colleague base
abstract class Colleague {
    protected Mediator mediator;

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

    public abstract void enviarMensagem(String mensagem);
    public abstract void receberMensagem(String mensagem);
}

// Classes Colleague concretas
class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    public void enviarMensagem(String mensagem) {
        mediator.enviarMensagem(mensagem, this);
    }

    public void receberMensagem(String mensagem) {
        System.out.println("ConcreteColleague1 recebeu a mensagem: " + mensagem);
    }
}

class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    public void enviarMensagem(String mensagem) {
        mediator.enviarMensagem(mensagem, this);
    }

    public void receberMensagem(String mensagem) {
        System.out.println("ConcreteColleague2 recebeu a mensagem: " + mensagem);
    }
}

// Exemplo de uso
public class Main {
    public static void main(String[] args) {
        // Cria o Mediator
        Mediator mediator = new ConcreteMediator();

        // Cria os Colleagues
        Colleague colleague1 = new ConcreteColleague1(mediator);
        Colleague colleague2 = new ConcreteColleague2(mediator);

        // Define os Colleagues no Mediator
        ((ConcreteMediator) mediator).setColleague1(colleague1);
        ((ConcreteMediator) mediator).setColleague2(colleague2);

        // Envio de mensagens
        colleague1.enviarMensagem("Olá, como você está?");
        colleague2.enviarMensagem("Estou bem, obrigado!");
    }
}

// Fonte: ChatGPT

Neste exemplo em Java, temos um Mediator concreto (ConcreteMediator) que atua como intermediário entre os Colleagues ConcreteColleague1 e ConcreteColleague2. Quando um Colleague envia uma mensagem, o Mediator recebe a mensagem e repassa para o outro Colleague. Dessa forma, os Colleagues se comunicam de forma indireta, evitando o acoplamento direto entre eles.

Exemplo de implementação em Python

Python
# Classe Mediator
class Mediator:
    def enviar_mensagem(self, mensagem, colleague):
        pass

# Classe Mediator concreta
class ConcreteMediator(Mediator):
    def __init__(self):
        self.colleague1 = None
        self.colleague2 = None

    def set_colleague1(self, colleague):
        self.colleague1 = colleague

    def set_colleague2(self, colleague):
        self.colleague2 = colleague

    def enviar_mensagem(self, mensagem, colleague):
        if colleague == self.colleague1:
            self.colleague2.receber_mensagem(mensagem)
        elif colleague == self.colleague2:
            self.colleague1.receber_mensagem(mensagem)

# Classe Colleague base
class Colleague:
    def __init__(self, mediator):
        self.mediator = mediator

    def enviar_mensagem(self, mensagem):
        pass

    def receber_mensagem(self, mensagem):
        pass

# Classes Colleague concretas
class ConcreteColleague1(Colleague):
    def enviar_mensagem(self, mensagem):
        self.mediator.enviar_mensagem(mensagem, self)

    def receber_mensagem(self, mensagem):
        print("ConcreteColleague1 recebeu a mensagem:", mensagem)

class ConcreteColleague2(Colleague):
    def enviar_mensagem(self, mensagem):
        self.mediator.enviar_mensagem(mensagem, self)

    def receber_mensagem(self, mensagem):
        print("ConcreteColleague2 recebeu a mensagem:", mensagem)

# Exemplo de uso
if __name__ == "__main__":
    # Cria o Mediator
    mediator = ConcreteMediator()

    # Cria os Colleagues
    colleague1 = ConcreteColleague1(mediator)
    colleague2 = ConcreteColleague2(mediator)

    # Define os Colleagues no Mediator
    mediator.set_colleague1(colleague1)
    mediator.set_colleague2(colleague2)

    # Envio de mensagens
    colleague1.enviar_mensagem("Olá, como você está?")
    colleague2.enviar_mensagem("Estou bem, obrigado!")

# Fonte: ChatGPT

Neste exemplo em Python, temos um Mediator concreto (ConcreteMediator) que atua como intermediário entre os Colleagues ConcreteColleague1 e ConcreteColleague2. Quando um Colleague envia uma mensagem, o Mediator recebe a mensagem e repassa para o outro Colleague. Dessa forma, os Colleagues se comunicam de forma indireta, evitando o acoplamento direto entre eles.

Mediator Pattern em Contextos de Negócios

No contexto de negócios, o Mediator Pattern pode ser um aliado valioso na transformação digital e inovação de produtos e serviços, proporcionando uma arquitetura mais robusta, flexível e escalável.

Desafios e Cuidados ao Implementar o Mediator Pattern

Embora o Mediator Pattern tenha muitos benefícios, também tem suas armadilhas. Por exemplo, um mediador mal projetado pode se tornar um ponto único de falha ou um gargalo de desempenho. Portanto, é crucial que o design e implementação do mediador sejam bem pensados.

Conclusão: Integrando o Mediator Pattern em sua Estratégia de Software

O Mediator Pattern, se bem aplicado, pode ser um componente chave na construção de sistemas de software robustos, flexíveis e eficientes. Ele pode melhorar a eficácia da comunicação entre objetos, promover a escalabilidade e facilitar a manutenção.

Esse conteúdo é parte do material disponibilizado para os participantes do meu grupo de estudos de Padrões de Projeto. Você quer participar desse grupo? Clique aqui e veja como funciona.

Dúvidas Frequentes

O que é o Mediator Pattern?
O Mediator Pattern é um padrão de projeto que facilita a comunicação entre objetos em um sistema, atuando como um intermediário entre eles.

Quais são os principais benefícios do Mediator Pattern?
Os principais benefícios do Mediator Pattern incluem flexibilidade e modularidade, facilidade de manutenção e escalabilidade do sistema.

Em que tipo de sistemas o Mediator Pattern é comumente usado?
O Mediator Pattern é comumente usado em sistemas onde há muitos objetos que precisam interagir, como interfaces gráficas, simulações e sistemas de fluxo de trabalho.

Como o Mediator Pattern pode beneficiar os negócios?
No contexto de negócios, o Mediator Pattern pode ser um aliado valioso na transformação digital e inovação de produtos e serviços, proporcionando uma arquitetura mais robusta, flexível e escalável.

Quais são os desafios ao implementar o Mediator Pattern?
Embora o Mediator Pattern tenha muitos benefícios, também tem suas armadilhas. Por exemplo, um mediador mal projetado pode se tornar um ponto único de falha ou um gargalo de desempenho.

Elemar Júnior

Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e pessoas a gerar mais resultados através da tecnologia.

Sessões de masterclass

Seja avisado de novos conteúdos

Gostou deste conteúdo? Então inscreva-se em nossa newsletter para receber notificações de novas publicações como essa:

Veja outros artigos relacionados

Aprenda a Simplificar seu Código Dominando o Padrão Chain of Responsibility

Em um mundo onde o desenvolvimento de software evolui a passos largos, se adaptar e dominar as melhores práticas é...

O que é o Padrão Iterator?

O padrão Iterator, amplamente usado em programação orientada a objetos, é um design pattern que permite aos desenvolvedores percorrer uma...

Integrando o padrão de projeto Interpreter na arquitetura de microservices: Como reduzir o acoplamento em sistemas distribuídos

Por que o acoplamento é um problema? A natureza do acoplamento Todos nós, no campo da tecnologia, já nos deparamos...

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Mediator Pattern: Facilitando a Comunicação entre Objetos em um Sistema:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Mediator Pattern: Facilitando a Comunicação entre Objetos em um Sistema:

Mediator Pattern: Facilitando a Comunicação entre Objetos em um Sistema

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Mediator Pattern: Facilitando a Comunicação entre Objetos em um Sistema:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

× Precisa de ajuda?