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.