Considere o seguinte domínio. Um carrinho de compras tem vários produtos e cada produto tem um preço. 
O código relacionado com estas duas classes é o seguinte:

public class Produto {
    private int _preco;
    private String _descricao;

    public Produto(int p, String desc) {
        _preco = p;
        _descricao = desc;
    }

    public int obtemPreco() {
        return _preco;
    }

    public String obtemDescricao() {
        return _descricao;
    }
}

public class CarrinhoCompras {
    private List<Produto> _carrinho;

    public CarrinhoCompras() {
        _carrinho = new ArrayList<>():
    }

    public adiciona(Produto p) {
        _carrinho.add(p):
    }

    public remove(Produto p) {
        _carrinho.remove(p):
    }
    
    public void paga() {
        // paga o contéudo do carrinho
    }
}

O método paga de CarrinhoCompras não está concretizado. A forma de realizar o pagamento dos produtos que estão num dado carrinho de compras depende do modo de pagamento. Para já quer-se suportar duas formas de pagamento, cartão de crédito e PayPal mas no futuro poderá ser necessário suportar novas formas de pagamento.
Aplique este padrão de desenho por forma a suportar este requisito: possibilidade de adicionar novas formas de pagamento obedecendo ao princípio do aberto-fechado, ou seja, é possível adicionar novas formas de pagamento sem que isso implique alterações ao código já realizado. Compare a sua solução com a seguinte solução.