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); }