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.
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.
/*
* 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("=====================================================================");
}
}