Oi Jeferson, tudo bem?
É uma alternativa, seu código funciona. Mas seguindo o design pattern você teria uma implementação DescontoPorVendaCasada:
public class DescontoPorVendaCasada implements Desconto {
private Desconto proximo;
public double desconta(Orcamento orcamento) {
if(aconteceuVendaCasadaEm(orcamento)) return orcamento.getValor() * 0.05;
else return proximo.desconta(orcamento);
}
private boolean aconteceuVendaCasadaEm(Orcamento orcamento) {
return existe("CANETA", orcamento) && existe("LAPIS", orcamento);
}
private boolean existe(String nomeDoItem, Orcamento orcamento) {
for (Item item : orcamento.getItens()) {
if(item.getNome().equals(nomeDoItem)) return true;
}
return false;
}
public void setProximo(Desconto proximo) {
this.proximo = proximo;
}
}
public class TestaCorrente {
public static void main(String[] args) {
Desconto d1 = new DescontoPorCincoItens();
Desconto d2 = new DescontoPorMaisDeQuinhentosReais();
Desconto d3 = new DescontoPorVendaCasada();
Desconto d4 = new SemDesconto();
d1.setProximo(d2);
d2.setProximo(d3);
d3.setProximo(d4);
Item lapis = new Item("LAPIS", 15.00);
Item caneta = new Item("CANETA", 15.00);
Item borracha = new Item("borracha", 15.00);
Orcamento orcamento = new Orcamento(500.0);
orcamento.adiciona(caneta);
orcamento.adiciona(borracha);
orcamento.adiciona(lapis);
double desconto = d1.desconta(orcamento);
System.out.println(desconto);
}
}