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.

Quer se aprofundar neste tema?

Então participe do grupo de estudos de Padrões de Projeto.

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Padrões de Projeto

com

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Padrões de Projeto

com

Desenvolva soluções simples para os problemas mais complexos. Escreva código fácil de entender, mais barato para manter e evoluir.

Veja outros artigos relacionados

Quer Melhorar Seu Design? Aplique CQS

Nesse mundo cada vez mais acelerado da tecnologia da informação, uma das metas constantes para desenvolvedores é a otimização e...

Você Precisa Conhecer o State Pattern

Em minha jornada como desenvolvedor de software, a descoberta e compreensão do State Pattern foi um divisor de águas, assim...

Como padrões ajudam a reduzir o impacto da escassez de recursos

Quando pensamos em software development, um dos grandes desafios é criar sistemas eficientes especialmente em ambientes com recursos limitados. Diante...

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 Reputação e Marketing Pessoal:

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 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 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:

Crie sua conta

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

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

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 Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

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 Padrões de Projeto:

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 DDD do Jeito Certo:

Crie sua conta

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

Crie sua conta

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

Mentoria em Arquitetura de Software

Ênfase em Systems Design

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

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?