Created
January 12, 2022 17:16
-
-
Save walteralleyz/2fbb04235b2ccd379f513a3a0f39cb1d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface Desconto { | |
BigDecimal calcular(Pedido pedido); | |
void setProximo(Desconto proximo); | |
} | |
class DescontoPorItens implements Desconto { | |
private Desconto proximo; | |
@Override | |
public BigDecimal calcular(Pedido pedido) { | |
if(pedido.getItens().size() > 10) { | |
return pedido.getValor().multiply(BigDecimal.valueOf(0.5)); | |
} else { | |
return proximo.calcular(pedido); | |
} | |
} | |
@Override | |
public void setProximo(Desconto proximo) { | |
this.proximo = proximo; | |
} | |
} | |
class DescontoPorValor implements Desconto { | |
private Desconto proximo; | |
@Override | |
public BigDecimal calcular(Pedido pedido) { | |
if(pedido.getValor() > 1000.0) { | |
return pedido.getValor().multiply(BigDecimal.valueOf(0.10)); | |
} else { | |
return proximo.calcular(pedido); | |
} | |
} | |
@Override | |
public void setProximo(Desconto proximo) { | |
this.proximo = proximo; | |
} | |
} | |
class SemDesconto implements Desconto { | |
@Override | |
public BigDecimal calcular(Pedido pedido) { | |
return BigDecimal.ZERO; | |
} | |
@Override | |
public void setProximo(Desconto desconto) { | |
// Não faz nada, é o último nível | |
} | |
} | |
class CalculadorDeDesconto { | |
public static void main(String[] args) { | |
final Pedido pedido = new Pedido; | |
calculaDesconto(pedido); | |
} | |
public BigDecimal calculaDesconto(Pedido pedido) { | |
final Desconto descontoPorItem = new DescontoPorItens(); | |
final Desconto descontoPorValor = new DescontoPorValor(); | |
final Desconto semDesconto = new SemDesconto(); | |
descontoPorItem.setProximo(descontoPorValor); | |
descontoPorValor.setProximo(semDesconto); | |
return descontoPorItem.calcular(pedido); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment