Mediator

Intenção

Define um objeto que encapsula a forma como um conjunto de objetos interage. O Mediator promove o acomplamento fraco ao evitar que os objetos se refiram uns aos outros explicitamente e permite variar suas interações independentemente.

Vantagens

Desvantagens

Exemplos

Exemplo #1

Uma entidade de pagamento pode receber boletos dos bancos A e B. Ao efetuar o pagamento a entidade precisa comunicar ao Banco correspondente o recebimento do mesmo. Como existe a necessidade de comunicação entre objetos na aplicação, o uso do padrão Mediator permite definir um objeto que encapsula como esses objetos interagem, evitando que os objetos referenciem-se uns aos outros. No exemplo abaixo, toda vez que um boleto do Banco A é pago, a Entidade de Pagamento(PaymentEntity) envia uma mensagem ao Banco A, por meio de um objeto do tipo BankAColleague, informando sobre o pagamento, e faz o mesmo quando um boleto do Banco B é pago, enviando uma mensagem ao Banco B, por meio de um objeto do tipo BankBColleague.

Diagrama de Classe

Exemplo #1 - Diagrama

Participantes

  • Mediator(Mediator): define uma interface para comunicação com objetos de classe Colleague.
  • ConcreteMeadiator(MediatorMessage): Implementa comportamento corporativo através da coordenação de objetos de classe Colleague. Conhece e mantém seus colegas.
  • Colleague Classes(BankAColleague, BankBColleague): cada classe Collegue conhece seu objeto Mediator de outra forma. Cada colega se comunica com o seu mediador sempre que, de outra forma, teria que se comunicar com outro colega.

Código

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mediatorBRIOF;

/**
 *
 * @author patrickbelem
 */
public class BankAColleague extends Colleague {
    
      
    public BankAColleague(Mediator m) {
        super(m);
        this.code = 1;
    }
 
   @Override
    public void receiveMessage(String message) {
        System.out.println("Bank A received: " + message);
    }

   
    
   
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mediatorBRIOF;

/**
 *
 * @author patrickbelem
 */
public class BankBColleague extends Colleague{
    
    public BankBColleague(Mediator m) {
        super(m);
        this.code = 2;
    }
 
    @Override
    public void receiveMessage(String message) {
        System.out.println("Bank B received: " + message);
    }
    
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mediatorBRIOF;

/**
 *
 * @author patrickbelem
 */
public class BankSlip {
   protected int    code;
    protected String shopName;
    protected double value;
    protected int bankCode;
    protected String status;

  
    public BankSlip(int code, String shopName, int bankCode, double value, String status) {
        this.code = code;
        this.shopName = shopName;
        this.bankCode = bankCode;
        this.value = value;
        this.status = status;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public void setShopName(String shopName) {
        this.shopName = shopName;
    }
    public void setBankCode(int bankCode) {
        this.bankCode = bankCode;
    }
    public void setValue(double value) {
        this.value = value;
    }
    public void setStatus(String status) {
        this.status = status;
    }
     public int getCode() {
        return code;
    }
    public String getShopName() {
        return shopName;
    }
    
    public int getBankCode() {
       return bankCode;
    }

    public double getValue() {
        return value;
    }

    public String getStatus() {
        return status;
    }
   
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package mediatorBRIOF;

/**
 *
 * @author patrick
 */
public class Client {
     /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
           
    MediatorMessage mediator = new MediatorMessage();
 
    BankAColleague bankA = new BankAColleague(mediator);
    BankBColleague bankB = new BankBColleague(mediator);
 
    BankSlip bankSlip1 = new BankSlip(2520,"Casas Bahia", 1, 1000,"Not Paid");
    BankSlip bankSlip2 = new BankSlip(3250,"Eletrocenter", 2, 2000,"Not Paid"); 
    
    mediator.addColleague(bankA);
    mediator.addColleague(bankB);
    
        
    PaymentEntity ep = new PaymentEntity("Payment Entity X", "Bank");
    ep.makePayment(bankSlip1, bankA);
    ep.makePayment(bankSlip2, bankB);
    
    
   
    }
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mediatorBRIOF;
/**
 *
 * @author patrickbelem
 */

    
public abstract class Colleague {
    
 protected Mediator mediator;
 protected double code;
 
    public Colleague(Mediator m) {
        mediator = m;
    }
    
    public void sendMessage(String message, double code){
        mediator.send(message, this, code);
    }
 
    public abstract void receiveMessage(String message);
    
}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mediatorBRIOF;

/**
 *
 * @author patrickbelem
 */
public interface Mediator {
    
     
     void send(String message, Colleague colleague, double code);
     
    
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mediatorBRIOF;

//import java.util.ArrayList;

import java.util.ArrayList;


/**
 *
 * @author patrickbelem
 */
public class MediatorMessage implements Mediator{
    
  protected ArrayList contacts;
 
    public MediatorMessage() {
        contacts = new ArrayList();
    }
 
    public void addColleague(Colleague colleague) {
        contacts.add(colleague);
    }
   
    @Override
    public void send(String message, Colleague colleague, double code) {
       
        for (Colleague contact : contacts) {
            if (contact.code == code) {
                
                contact.receiveMessage(message);
                
            }
      }
    }

}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package mediatorBRIOF;

/**
 *
 * @author patrick
 */
public class PaymentEntity {
    
     protected String name;
     protected String type;

       
    public PaymentEntity(String name, String type) {
        this.name = name;
        this.type = type;
    }
    
    public void setType(String type) {
        this.type = type;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public String getType() {
        return type;
    }

    
    public void makePayment(BankSlip bankSlip, Colleague colleague){
      
        bankSlip.setStatus("Paid");
        System.out.println("Payment made in Bank:" + this.getName());
        System.out.println("\nBank Slip:"+ bankSlip.getCode() +"\nShop:"+ bankSlip.getShopName()+
                               "\nAmount Received:"+ bankSlip.getValue()+ "\nBank Code:"+ bankSlip.getBankCode() +"\nCurrent Status:"+ bankSlip.getStatus());
        System.out.println("=====================================================================");
        colleague.sendMessage("It conducted a payment from your bank in : "+ this.getName(), bankSlip.bankCode);
        System.out.println("=====================================================================");
    }
}
Clique aqui para fazer o download do código completo de implementação deste Design Pattern.

Exemplo #2

Padrões Relacionados

Este Padrão pode ser usado para resolver os seguintes problemas: