using System.Collections.Generic;
public static void Main()
CalculadorDeDescontos calculador = new CalculadorDeDescontos();
Orcamento orcamento = new Orcamento(525.0);
orcamento.AdicionaItem(new Item("CANETA", 250.0));
orcamento.AdicionaItem(new Item("LAPIS", 250.0));
orcamento.AdicionaItem(new Item("LAPIS", 250.0));
orcamento.AdicionaItem(new Item("LAPIS", 250.0));
orcamento.AdicionaItem(new Item("LAPIS", 250.0));
orcamento.AdicionaItem(new Item("LAPIS", 250.0));
double desconto = calculador.Calcula(orcamento);
Console.WriteLine(desconto);
public interface Desconto
double Desconta(Orcamento orcamento);
Desconto Proximo { get; set; }
public class DescontoPorCincoItens : Desconto
public Desconto Proximo { get; set; }
public double Desconta(Orcamento orcamento)
if(orcamento.Itens.Count > 5) {
return orcamento.Valor * 0.1;
return Proximo.Desconta(orcamento);
public class DescontoPorMaisDeQuinhentosReais : Desconto
public Desconto Proximo { get; set; }
public double Desconta(Orcamento orcamento)
if(orcamento.Valor > 500)
return orcamento.Valor * 0.07;
return Proximo.Desconta(orcamento);
public class SemDesconto : Desconto
public Desconto Proximo { get; set; }
public Double Desconta(Orcamento orcamento)
public class CalculadorDeDescontos
public double Calcula(Orcamento orcamento)
Desconto d1 = new DescontoPorCincoItens();
Desconto d2 = new DescontoPorMaisDeQuinhentosReais();
Desconto d3 = new SemDesconto();
return d1.Desconta(orcamento);
public double Valor { get; private set; }
public IList<Item> Itens { get; private set; }
public Orcamento(double valor)
this.Itens = new List<Item>();
public void AdicionaItem(Item item)
public String Nome { get; private set; }
public double Valor { get; private set; }
public Item(String nome, double valor)