Command

Solução Proposta

Desacopla objetos emissores de objetos receptores usando um objeto Command para definir a vinculação entre um objeto emissor e um objeto receptor.

Vantagens

Desvantagens

Exemplo

Uma Entidade de Pagamento, por exemplo uma casa loterica, efetua pagamentos de boletos dos bancos A e B e seu sistema possui um módulo para efetuar o pagamento de cada um deles.Como para cada banco o registro de pagamento é realizado de forma diferente, o uso do padrao Command permite que uma solicitação seja encapsulada em um objeto command, permitindo parametrizar clientes com diferentes solicitações. No exemplo abaixo, a solicitação supracitada é a operação registerPayment que pode ser efetuada por um cliente do tipo PaymentBankA, que registra pagamentos de boletos do Banco A, ou por um cliente do tipo PaymentBankB que registra pagamentos de boletos do Banco B.

Diagrama de Classe

Command - Diagrama

Participantes

  • Command(PaymentCommand): declara uma interface para execução de uma operação.
  • ConcreteCommand(PaymentBankA, PaymentBankB): define uma vinculação entre um objeto Receiver e uma ação; implementa Execute através da invocação da(s) correspondente(s) operação(ões) no Receiver.
  • Client(Client): cria um objeto ConcreteCommand e estabelece o seu receptor.
  • Invoker(PaymentEntity): solicita ao Command a execução da solicitação.
  • Receiver(BankSlip): sabe como executar as operações associadas a uma solicitação. Qualquer classe pode funcionar como um Receiver.

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 commandBRI;

/**
 *
 * @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 setcodBanco(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;
    }

}
package commandBRI;

/**
 *
 * @author patrickbelem
 */
public class Client {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
   
    PaymentEntity pe1 = new PaymentEntity("Loteria Cavaleiros", "lottery");
   
    BankSlip bankSlip1 = new BankSlip(2520,"Casas Bahia", 1, 1000,"Not Paid"); 
    BankSlip bankSlip2 = new BankSlip(3250,"Eletrocenter", 2, 2000,"Not Paid");
    PaymentBankA bankA = new PaymentBankA();
    PaymentBankB bankB = new PaymentBankB();
    pe1.makePayment(bankSlip1, bankA);
    pe1.makePayment(bankSlip2, bankB);

  
            
           
    
    /*
    Uma loteria efetua pagamentos de boletos de diversos bancos e seu sistema possui um módulo para efetuar o pagamento de cada um deles.
    Assim todo boleto do banco A, cujo código do banco seja 1, este boleto deverá ser recebido pelo módulo do banco A, caso o boleto seja 
    do banco B, cujo código do banco seja 2, deverá ser pago pelo módulo do banco B.
    
    */
        
    }
    
}
package commandBRI;

/**
 *
 * @author patrickbelem
 */
public class PaymentBankA implements PaymentCommand {
 double value;
 
    @Override
    public void registerPayment(BankSlip bankSlip) {
        if(bankSlip.getBankCode()==1){
           value = bankSlip.getValue() - bankSlip.getValue() * 0.02;   
           bankSlip.setValue(value);
           bankSlip.setStatus("Paid");
             System.out.println("Bank slip of bank A:\nBank Slip:"+ bankSlip.getCode() +"\nShop:"+ bankSlip.getShopName()+
                               "\nAmount Received:"+ bankSlip.getValue()+ "\nBank Code:"+ bankSlip.getBankCode() +"\nStatus Current:"+ bankSlip.getStatus());
           System.out.println("========================");
       
      }
    }
 
}
package commandBRI;

/**
 *
 * @author patrickbelem
 */
public class PaymentBankB implements PaymentCommand {
 double value;
 
    @Override
    public void registerPayment(BankSlip bankSlip){
       if(bankSlip.getBankCode()==2){  
           value = bankSlip.getValue() - bankSlip.getValue() * 0.03;   
           bankSlip.setValue(value);
           bankSlip.setStatus("Paid");
            System.out.println("Bank slip of bank B:\nBank Slip:"+ bankSlip.getCode() +"\nShop:"+ bankSlip.getShopName()+
                               "\nAmount Received:"+ bankSlip.getValue()+ "\nBank Code:"+ bankSlip.getBankCode() +"\nStatus Current:"+ bankSlip.getStatus());
           System.out.println("========================");    
       }  
    }
    
 
}
package commandBRI;

/**
 *
 * @author patrickbelem
 */
public interface PaymentCommand {

    void registerPayment(BankSlip bankSlip);

}
/*
 * 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 commandBRI;

/**
 *
 * @author patrickbelem
 */
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, PaymentCommand paymentCommand ) {
    
        paymentCommand.registerPayment(bankSlip);       
             
}
}
Clique aqui para fazer o download do código completo de implementação deste Design Pattern.

Padrões Relacionados