Criei 2 formas de implementar o exercicio, a primeira igual a resposta do exercicio, deu tudo certo, mas outra eu implementei uma lista de itens de venda casada em vez de comparar com String Caneta, Lapis, mas não deu certo, alguém pode ver onde eu errei.
Classe Desconto por venda casada, que acho que esta o erro.
// ta retornando 0.0 na classe TestaDesconto2 // ta retornando false no metodo DescontoPorVendaCasada2.existeItens(Orcamento orcamento);
package br.com.Alura.Design_Pattern;
import java.util.List;
public class DescontoPorVendaCasada2 implements Desconto2 {
private Desconto2 proximo;
List<Item> listaItensVendaCasada = ItensVendaCasada.getItensVendaCasada();
@Override
public double calcula(Orcamento orcamento) {
if (existeItens(orcamento)) {
return orcamento.getValor() * 0.05;
} else {
return proximo.calcula(orcamento);
}
}
private boolean existeItens(Orcamento orcamento) {
if(listaItensVendaCasada.containsAll(orcamento.getItens())) {
System.out.println("Encontrou");
return true;
}
System.out.println("nao encontrou");
return false;
}
@Override
public void setProximo(Desconto2 proximo) {
this.proximo = proximo;
}
}
Essa é a lista de venda Casada, classe auxiliar que criei para guardar a lista de itens de venda casada.
package br.com.Alura.Design_Pattern;
import java.util.ArrayList;
import java.util.List;
public class ItensVendaCasada {
private static List<Item> itensVendaCasada = new ArrayList<Item>();
public void adicionaItem(Item item) {
itensVendaCasada.add(item);
}
public static List<Item> getItensVendaCasada() {
return itensVendaCasada;
}
}
Calculadora de desconto
package br.com.Alura.Design_Pattern;
public class CalculadorDeDescontos2 {
public double calcula(Orcamento orcamento) {
Desconto2 d1 = new DescontoMaisDeCincoItens2();
Desconto2 d2 = new DescontoValorMaiorQueQuinhentosReais2();
Desconto2 d3 = new DescontoPorVendaCasada2();
Desconto2 d4 = new SemDesconto2();
d1.setProximo(d2);
d2.setProximo(d3);
d3.setProximo(d4);
return d1.calcula(orcamento);
}
}
Classe Testa desconto
package br.com.Alura.Design_Pattern;
public class TestaDesconto2 {
public static void main(String[] args) {
CalculadorDeDescontos2 calculadoraDesconto = new CalculadorDeDescontos2();
Orcamento orcamento = new Orcamento(500.0);
// adiciona itens na lista de venda casada
ItensVendaCasada itensVendaCasada = new ItensVendaCasada();
itensVendaCasada.adicionaItem(new Item("Lapis", 250.0));
itensVendaCasada.adicionaItem(new Item("Caneta", 250.0));
orcamento.adicionaItem(new Item("Lapis", 250.0));
orcamento.adicionaItem(new Item("Caneta", 250.0));
double desconto = calculadoraDesconto.calcula(orcamento);
System.out.println(desconto);
// ta retornando 0.0
}
}
Classe item, que implementei um compareTo() pelo nome
package br.com.Alura.Design_Pattern;
public class Item implements Comparable<Item>{
private String nome;
private double valor;
public Item(String nome, double valor) {
this.nome = nome;
this.valor = valor;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
@Override
public int compareTo(Item o) {
return this.getNome().compareTo(o.getNome());
}
}
Interface
package br.com.Alura.Design_Pattern;
public interface Desconto2 {
double calcula(Orcamento orcamento);
void setProximo(Desconto2 proximo);
}