No padrão Strategy, temos a entidade abstracta Strategy que representa a funcionalidade a suportar por cada estratégia concreta. No exemplo descrito, a estratégia é a forma de pagamento. Neste caso podemos dizer que, a entidade abstracta Strategy, designada neste contexto FormaPagamento, terá apenas um método realizaPagamento que recebe como argumento o valor a pagar.
public interface FormaPagamento {
void realizaPagamento(int quantia);
}
Cada forma de pagamento será concretizada como uma concretização distinta desta entidade abstracta. Por exemplo, para o pagamento via cartão de crédito teríamos que ter a seguinte concretização:
public class PagamentoCartaoCredito implements FormaPagamento {
private String _none;
private String _numeroCartao;
private String _cvv;
private String _dataExpiracao;
public PagamentoCartaoCredito(String titular, String numCC, String cvv, String data){
_nome = titular;
_numeroCartao = numCC;
_cvv = cvv;
_dataExpiracao = data;
}
@Override
public void realizaPagamento(int quantia) {
System.out.println("Realiza pagamento via cartão de crédito de " + quantia);
}
}
É ainda necessário alterar o código da classe que representa a entidade Context descrita na estrutura do padrão por forma a que ela utilize a estratégia escolhida. Neste exemplo, a entidade Context corresponde à entidade CarrinhoCompras. É possível realizar a associação entre o carrinho de compras e a forma de pagamento a utilizar em dois momentos distintos:
- Na criação do carrinho de compras, pelo que o construtor de CarrinhoCompras teria que passar a ter um argumento do tipo FormaPagamento e seria necessário acrescentar um novo atributo a CarrinhoCompras que serviria para guardar a forma de pagamento associada ao carrinho de compras
- Na invocação do método paga de CarrinhoCompras é indicado um argumento que indica a forma de pagamento a aplicar
A alteração à classe CarrinhoCompras para suportar a segunda opção é a seguinte:
public void paga(FormaPagamento pagamento) {
int total = 0;
for (Produto p : _carrinho)
total += p.obtemPreco();
pagamento.realizaPagamento(total);
}