terça-feira, 9 de novembro de 2010

Mediator Pattern



Definição

Com a comunicação  do mediator pattern entre os objetos, eles são encapsulados como  um objeto mediator. Objetos não se comunicam mais diretamente com os outros , mas sim se comunicam  através do mediator. Isso resulta em uma maior aplicação coerente da lógica e da diminuição da ligação entre os outros objetos.

Quando usar

O padrão Mediator pode ser utilizado quando um conjunto de objetos se comunicam de maneiras bem específicas porém complexas e as interdependências resultantes são desestruturadas e dificeis de entender. Se é difícil para reutilizar um objeto porque ele se comunica com muitos outros objetos, este padrão é uma boa solução. A  comunicação das  identidades dos objetos será protegida quando se utilizar o Mediator pattern, que é bom quando a segurança é importante. Além disso, se você gosta de personalizar um comportamento que se espalha entre várias classes sem um monte de subclassificações este padrão deve ser aplicado. O padrão é utilizado em muitos sistemas modernos que refletem um envio / recebimento de protocolo, como lista de servidores e salas de chat. Outra área é a de uso de interfaces gráficas, onde o mediator pode encapsular um comportamento coletivo de controle e coordenar as interações de um grupo de widgets GUI. O mediator serve para reduzir o número de interconexões.

Benefícios

O padrão Mediator tem quatro vantagens e desvantagens:
1. subclassificação limitada, uma vez que um mediator localiza o comportamento que de outra forma seria distribuído entre vários objetos. Mudar um comportamento obriga-nos a criar subclasses apenas com o mediator.
2. Um mediator simplifica protocolos de objeto, uma vez que substitui uma  interação  muitos para muitos para interacções um-para-muitos entre o mediator e os seus colegas. Interações um-para-muitos são mais fáceis de compreender, manter e estender.
3. O mediador permite focar sobre como os objetos interagem para além de seus comportamentos individuais que podem ajudar a clariar a forma como os objetos interagem no sistema.
4. O controle centralizado é atingido por uma complexidade de interação para negociação. Um mediator encapsula protocolos e pode tornar-se mais complexo do que qualquer colega individual. Isso pode tornar o mediator em si uma peça muito complexa e de grande quantidade de código que é difícil
manter.





Desvantagens / consequências

Além dos benefícios e os inconvenientes descritos acima, uma importante
desvantagem é que o Mediator pattern pode ter um impacto no desempenho em um sistema. Uma vez que toda a comunicação deve percorrer pelo  mediator, que pode se tornar um gargalo.



Exemplo

Considere-se uma janela onde há um label de exibição e três botões: exibir, livro e pesquisa. Ao clicar no botão Exibir ele deve ser desativado e os seus
outros  botões  devem ser ativados. Além disso, o label deve ser alterado para refletir qual botão foi pressionado. Criamos quatro classes ButtonView, ButtonSearch ButtonBook e LabelDisplay. Então nós deixamos as classes implementarem um botão de comando que nos permite executar as ações dos botões de uma interface comum. Todas essas classes GUI não sabem uma da outra, elas só devem se referir ao mediator. Nós agora criamos a classe Mediator que contém referências a todos os objetos GUI e controla e coordena as interações entre estes objetos. Por fim, criamos a classe MediatorExample para exibir os componentes em um quadro. A classe implementa a interface ActionListener para o qual todos os botões devem conter ela. O codigo fonte completo deste exemplo é mostrado abaixo:










Ouvir
Ler foneticamente



import java.awt.event.ActionListener;
import javax.swing.JButton;

public class ButtonView extends JButton implements Command {
Mediator mediator;

public ButtonView(ActionListener listener, Mediator mediator){
super("View");
addActionListener(listener);
this.mediator = mediator;
mediator.registerView(this);
}

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

import java.awt.event.ActionListener;
import javax.swing.JButton;

public class ButtonSearch extends JButton implements Command {
Mediator mediator;

ButtonSearch(ActionListener listener, Mediator mediator{
super("Search");
addActionListener(listener);
this.mediator = mediator;
mediator.registerSearch(this);
}

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

public interface Command {
public void execute();
}

public class Mediator {
ButtonView buttonView;
ButtonBook buttonBook;
ButtonSearch buttonSearch;
LabelDisplay labelDisplay;

public void registerView(ButtonView buttonView) {
this.buttonView = buttonView;
}


public void registerBook(ButtonBook buttonBook) {
this.buttonBook = buttonBook;
}

public void registerSearch(ButtonSearch buttonSearch) {
this.buttonSearch = buttonSearch;
}

public void registerDisplay(LabelDisplay labelDisplay) {
this.labelDisplay = labelDisplay;
}

public void view() {
buttonView.setEnabled(false);
buttonBook.setEnabled(true);
buttonSearch.setEnabled(true);
labelDisplay.setText("Viewing...");
}

public void book() {
buttonBook.setEnabled(false);
buttonView.setEnabled(true);
buttonSearch.setEnabled(true);
labelDisplay.setText("Booking...");
}

public void search() {
buttonSearch.setEnabled(false);
button Book.setEnabled(true);
buttonView.setEnabled(true);
labelDisplay.setText("Searching...");
}
}

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

class MediatorExample extends JFrame implements ActionListener {
Mediator mediator = new Mediator();

public MediatorExample() {
JPanel p = new JPanel();
p.add(new ButtonView(this, mediator));
p.add(new ButtonBook(this, mediator));
p.add(new ButtonSearch(this, mediator));
getContentPane().add(
new LabelDisplay(mediator),BorderLayout.NORTH);

getContentPane().add(p, BorderLayout.SOUTH);
setTitle("Mediator Example");
setSize(300, 200);
addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

setVisible(true);
}

public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof Command) {
Command c = (Command)e.getSource();
c.execute();
}
}

public static void main(String[] args) {
new MediatorExample();
}
}
 

Nenhum comentário:

Postar um comentário