Chain of Responsability

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

 

Orcamento.java

 

class Orcamento {

 

 private double valor;

 private List<Item> itens;

 

 public Orcamento(double valor) {

         this.valor = valor;

         this.itens = new ArrayList<Item>();

 }

 

 public double getValor() {

         return valor;

 }

 

 public List<Item> getItens() {

         return Collections.unmodifiableList(itens);

 }

 

 public void adicionaItem(Item item) {

         itens.add(item);

 }

 

}

 

Item.java

 

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 double getValor() {

         return valor;

 }

 

}

 

Desconto.java

 

interface Desconto {

 double desconta(Orcamento orcamento);

 void setProximo(Desconto proximo);

}

 

SemDesconto.java

 

class SemDesconto implements Desconto {

 

 public double desconta(Orcamento orcamento) {

         return 0;

 }

 

 public void setProximo(Desconto desconto) {

         // nao tem!

 }

}

 

DescontoPorMaisDeCincoItens.java

 

class DescontoPorMaisDeCincoItens implements Desconto {

 private Desconto proximo;

 

 public void setProximo(Desconto proximo) {

         this.proximo = proximo;

 }

 

 public double desconta(Orcamento orcamento) {

         if (orcamento.getItens().size() > 5) {

                 return orcamento.getValor() * 0.1;

         } else {

                 return proximo.desconta(orcamento);

         }

 }

}

 

DescontoPorMaisDeQuinhentosReais.java

 

class DescontoPorMaisDeQuinhentosReais implements Desconto {

 private Desconto proximo;

 

 public void setProximo(Desconto proximo) {

         this.proximo = proximo;

 }

 

 public double desconta(Orcamento orcamento) {

         if (orcamento.getValor() > 500) {

                 return orcamento.getValor() * 0.07;

         } else {

                 return proximo.desconta(orcamento);

         }

 }

}

 

 

CalculadorDeDescontos.java

 

class CalculadorDeDescontos {

 public double calcula(Orcamento orcamento) {

         Desconto d1 = new DescontoPorMaisDeCincoItens();

         Desconto d2 = new DescontoPorMaisDeQuinhentosReais();

         Desconto d3 = new SemDesconto();

 

         d1.setProximo(d2);

         d2.setProximo(d3);

 

         return d1.desconta(orcamento);

 }

}

 

Principal.java

 

public class Chain {

 

 public static void main(String[] args) {

         CalculadorDeDescontos calculador = new CalculadorDeDescontos();

 

         Orcamento orcamento = new Orcamento(600.0);

         orcamento.adicionaItem(new Item("CANETA", 250.0));

         orcamento.adicionaItem(new Item("LAPIS", 250.0));

 

         double desconto = calculador.calcula(orcamento);

 

         System.out.println(desconto);

 

 }

 

}