Então, como disse antes, consegui resolver, minha dúvida é somente se isso continua sendo um Chain of Responsability:
public class CalculadorDeDescontos {
private List<Desconto> descontos;
public CalculadorDeDescontos() {
this.descontos = Arrays.asList(
new DescontoPorCincoItens(),
new DescontoPorMaisDeQuinhentosReais(),
new DescontoPorVendaCasada()
);
}
public double calcula(Orcamento orcamento) {
return descontos.stream().mapToDouble(desconto -> desconto.desconta(orcamento)).sum();
}
}
public interface Desconto {
public double desconta(Orcamento orcamento);
}
public class DescontoPorCincoItens implements Desconto {
public double desconta(Orcamento orcamento) {
if(orcamento.getItens().size() > 5)
return orcamento.getValor() * 0.1;
return 0;
}
}
public class DescontoPorMaisDeQuinhentosReais implements Desconto{
public double desconta(Orcamento orcamento) {
if(orcamento.getValor() > 500.00)
return orcamento.getValor() * 0.07;
return 0;
}
}
public class DescontoPorVendaCasada implements Desconto {
public double desconta(Orcamento orcamento) {
if (isVendaCasada(orcamento))
return orcamento.getValor() * 0.05;
return 0;
}
private boolean isVendaCasada(Orcamento orcamento) {
return existe("CANETA", orcamento) && existe("LAPIS", orcamento);
}
private boolean existe(String nomeDoItem, Orcamento orcamento) {
return orcamento.getItens().stream()
.anyMatch(item -> item.getNome().equals(nomeDoItem));
}
}
public class Item {
public String nome;
public double valor;
public Item(String nome, double valor) {
this.nome = nome;
this.valor = valor;
}
public Object getNome() {
return nome;
}
public double getValor() {
return valor;
}
}
public class Orcamento {
private double valor;
private final List<Item> itens;
public Orcamento() {
itens = new ArrayList<Item>();
}
public double getValor() {
return valor;
}
public List<Item> getItens() {
return Collections.unmodifiableList(itens);
}
public void adicionaItens(Item item) {
itens.add(item);
atualizaValor(item);
}
private void atualizaValor(Item item) {
valor += item.getValor();
}
}