Um Mediator (mediador em português), em linguagem de programação de computadores, é um dos 23 Padrões de Projeto (Design Pattern) indicados para descritos para aumentar re-uso e diminuir acoplamento.[1]

Definição

editar

É um padrão de projeto usado frequentemente quando deseja-se encapsular como os objetos interagem, ou seja, a comunicação entre os objetos é estabelecida através do Mediator. Este padrão é considerado um padrão comportamental, pois o padrão pode alterar o comportamento da aplicação (programa).O Mediator promove o fraco acoplamento ao evitar que objetos se referiram uns aos outros explicitamente.

Participantes

editar

Mediator: responsável por definir a interface para a comunicação entre os objetos Colegas.

MediatorConcreto: responsável por implementar a interface Mediator e consequentemente gerenciar a comunicação entre os objetos Colegas.

ColegaConcreto: Objeto que se comunicará com outros objetos Colegas através do Mediator.

Exemplo base

editar

Uma das inúmeras formas de demonstrar o padrão Mediator é fazendo uma analogia com uma torre de comando do aeroporto. Considere dois pilotos de avião, um está aterrissando e outro está decolando, eles se comunicam de forma direta? A resposta é não. As mensagens são todas controladas pela torre de controle, que possuí a responsabilidade de gerenciar quem decola e quem aterrissa. As restrições de decolagem e aterrissagem ficam por conta da torre de controle.

Observe que neste exemplo têm-se os participantes do padrão. O MediatorConcreto é a torre de controle e como ColegaConcreto os pilotos de avião. É importante ressaltar que a torre de controle não controla o voo por completo.

Exemplo de diagrama aplicando o Mediator

editar

 

 
Exemplo de Mediator

Exemplo de diagrama aplicando o Mediator para um caso de debate político

editar

 

No diagrama acima, a situação é a seguinte: Considere um debate político, onde ocorre troca de mensagens bem definidas, porém essas mensagens são relativamente complexas já que um político pode se comunicar(enviar mensagem) para qualquer outro político que esteja no debate, logo, é necessário alguém que seja capaz de intermediar as mensagens para que o debate flua de uma melhor forma. É neste ponto que entra o apresentador (ApresentadorMediator) que será justamente o mediador entre os políticos e que consequentemente intermediará as mensagens de uma melhor forma, tornando o debate mais agradável e compreensível.

Quando usar

editar

Um conjunto de objetos se comunicam de maneira bem definida, porém complexas o que dificulta o entendimento.

Quando um objeto é difícil de ser reutilizado pois ele se referencia e se comunica com muitos outros objetos.

Quando um comportamento está distribuído entre diversas classes que deveria ser customizável, evitando a especialização em subclasses.

 
Exemplo Mediator Politico

Vantagens do padrão Mediator

editar

Diminuí consideravelmente o acoplamento (entre os Colegas) e consequentemente aumenta o reuso.

Ocorre a eliminação de relacionamentos muitos para muitos (N para N)

A política de comunicações fica centralizada no Mediator, logo, podemos alterar essa política sem precisar alterar os Colegas.

Desvantagens do padrão Mediator

editar

Em termos práticos a tendência do padrão Mediator é tornar-se complexo.A troca de complexidade, inicialmente na interação e, após a aplicação do padrão, a complexidade passa a ficar no Mediator o que dificulta a manutenção.

Padrões relacionados

editar

Observer e Façade.

Exemplo

editar
//Colleague interface
interface Command {
    void execute();
}

//Concrete mediator
class Mediator {

    BtnView btnView;
    BtnSearch btnSearch;
    BtnBook btnBook;
    LblDisplay show;

    //....

void registerView(BtnView v) {
        btnView = v;
    }

    void registerSearch(BtnSearch s) {
        btnSearch = s;
    }

    void registerBook(BtnBook b) {
        btnBook = b;
    }

    void registerDisplay(LblDisplay d) {
        show = d;
    }

    void book() {
        btnBook.setEnabled(false);
        btnView.setEnabled(true);
        btnSearch.setEnabled(true);
        show.setText("booking…");
    }

    void view() {
        btnView.setEnabled(false);
        btnSearch.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("viewing…");
    }

    void search() {
        btnSearch.setEnabled(false);
        btnView.setEnabled(true);
        btnBook.setEnabled(true);
        show.setText("searching…");
    }

}

//A concrete colleague
class BtnView extllolends JButton implements Command {

    Mediator med;

    BtnView(ActionListener al, Mediator m) {
        super("View");
        addActionListener(al);
        med = m;
        med.registerView(this);
    }

    public void execute() {
        med.view();
    }

}

//A concrete colleague
class BtnSearch extends JButton implements Command {

    Mediator med;

    BtnSearch(ActionListener al, Mediator m) {
        super("Search");
        addActionListener(al);
        med = m;
        med.registerSearch(this);
    }

    public void execute() {
        med.search();
    }

}

//A concrete colleague
class BtnBook extends JButton implements Command {

    Mediator med;

    BtnBook(ActionListener al, Mediator m) {
        super("Book");
        addActionListener(al);
        med = m;
        med.registerBook(this);
    }

    public void execute() {
        med.book();
    }

}

class LblDisplay extends JLabel {

    Mediator med;

    LblDisplay(Mediator m) {
        super("Just start…");
        med = m;
        med.registerDisplay(this);
        setFont(new Font("Arial", Font.BOLD, 24));
    }

}

class MediatorDemo extends JFrame implements ActionListener {

    Mediator med = new Mediator();

    MediatorDemo() {
        JPanel p = new JPanel();
        p.add(new BtnView(this, med));
        p.add(new BtnBook(this, med));
        p.add(new BtnSearch(this, med));
        getContentPane().add(new LblDisplay(med), "North");
        getContentPane().add(p, "South");
        setSize(400, 200);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent ae) {
        Command comd = (Command) ae.getSource();
        comd.execute();
    }

    public static void main(String args) {
        new MediatorDemo();
    }

}

Referências

  1. Padrões de Projeto: Soluções reutilizáveis de software orientado a objetos. [S.l.]: Bookman. 1 de Janeiro de 2000 
  NODES