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
Qualquer uma das duas formas de realizar a associação entre um carrinho de compras e a forma de pagamento é válida, a forma a aplicar depende mais do momento em que o cliente escolhe a forma de pagamento. Se essa escolha for feita no momento de criação de um carrinho de compras, então a primeira opção é a mais correcta. Se a escolha for realizada após o cliente tiver escolhido os produtos a comprar, então a segunda opção será a mais correcta.
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);
    }