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.