Skip to content

Instantly share code, notes, and snippets.

@rafaelchagasb
Created December 19, 2011 13:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rafaelchagasb/1497141 to your computer and use it in GitHub Desktop.
Save rafaelchagasb/1497141 to your computer and use it in GitHub Desktop.
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class Orcamento {
private double valor;
private List<Item> itens;
public Orcamento(double valor)
{
this.setValor(valor);
this.itens = new ArrayList<Item>();
}
public double getValor() {
return valor;
}
public void setValor(double valor) {
this.valor = valor;
}
public List<Item> getItens()
{
return Collections.unmodifiableList(itens);
}
public void adicionaItem(Item item)
{
itens.add(item);
}
}
public interface Desconto {
double desconta(Orcamento orcamento);
void setProximo(Desconto proximo);
}
public class SemDesconto implements Desconto{
public double desconta(Orcamento orcamento) {
return 0;
}
public void setProximo(Desconto proximo) {
}
}
public class 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;
}
}
public class DescontoPorVendaCasada implements Desconto {
private Desconto proximo;
public double desconta(Orcamento orcamento) {
if(existe("LAPIS", orcamento)==true && existe("CANETA", orcamento))
return orcamento.getValor()*0.05;
else
return proximo.desconta(orcamento);
}
public void setProximo(Desconto proximo) {
this.proximo = proximo;
}
private boolean existe(String nomeDoItem,Orcamento orcamento) {
for(Item item:orcamento.getItens())
if(item.getNome().equals(nomeDoItem))
return true;
return false;
}
}
public class DescontoPorMaisDeQuinhentosReais implements Desconto{
private Desconto proximo;
public double desconta(Orcamento orcamento) {
if(orcamento.getValor()>500)
return orcamento.getValor()*0.07;
else
return proximo.desconta(orcamento);
}
public void setProximo(Desconto proximo)
{
this.proximo = proximo;
}
}
public class DescontoPorCincoItens implements Desconto {
private Desconto proximo;
public double desconta(Orcamento orcamento) {
if(orcamento.getItens().size() > 5)
return orcamento.getValor()*0.1;
else
return proximo.desconta(orcamento);
}
public void setProximo(Desconto proximo) {
this.proximo = proximo;
}
}
public class CalculadorDeDescontos {
public double calcula(Orcamento orcamento)
{
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);
return d1.desconta(orcamento);
}
}
public class TestarDescontos {
/**
* @param args
*/
public static void main(String[] args) {
CalculadorDeDescontos calculador = new CalculadorDeDescontos();
Orcamento orcamento = new Orcamento(500);
orcamento.adicionaItem(new Item("CADERNOS", 300));
orcamento.adicionaItem(new Item("LAPIS", 200));
orcamento.adicionaItem(new Item("CANETA", 200));
System.out.println(calculador.calcula(orcamento));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment