Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Acoplamento da classe cliente - Chain of Responsibility

Bom dia. Queria aqui levantar dois pontos: 1) No exemplo dos orçamentos, tínhamos diversos tipos de descontos e uma classe cliente que processava esses descontos. Essa classe cliente, na minha opinião, ficou muito acoplada com as regras de descontos existentes (ou as novas que poderão surgir), também aparentemente violando o princípio OCP do SOLID, ou seja, a cada nova regra, teria que abrir essa classe para incluir mais uma linha. Teria uma forma de resolver isso? Exemplo:

public class CalculadoraDeDescontos { public void calcula() {

Desconto d1 = new DescontoPorMaisDeCincoItens(); Desconto d2 = new DescontoPorMaisDeQuinhentosReais(); Desconto d3 = new NovoDesconto();

d1.setProximo(d2); d2.setProximo(d3);

return d1.desconta(orcamento); } } ``

2) Uma classe que implementa uma interface mas não fornece nenhum código no corpo me incomoda um pouco. Não seria mais elegante verificar, em cada elemento chain, se o próximo não é nulo e se não for, chamar a execução? Mais ou menos assim:

`` public 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 if (proximo !=null) { return proximo.desconta(orcamento); } else { return 0; } } } ``

2 respostas
solução!

Oi Eduardo,

1) O problema não é encontrar as implementações da interface automaticamente, mas sim definir a sequência, ou seja, a ordem em que as regras de desconto seriam aplicadas.

2) Eu acredito que sua soluçãop seja válida, o problema é que você está trazendo a responsabilidade de gerenciar a sequencia de descontos para a classe que deveria se preocupar apenas o cálculo do próprio desconto.

Perceba que você teria que repetir este código em todos os descontos.

Para este caso foi criada a classe SemDesconto que retorna 0 e não chama o próximo.

Obrigado pela resposta!