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

Chain of Responsibilities - evitando duplicidade de código

Prezados, fiz uma implementação diferente para os descontos e gostaria da opinião de vocês pra saber se estou mantendo boas práticas. Percebi que todas as classes de descontos incluíam o atributo "Desconto proximo;" e o método "setProximo" era sempre o mesmo.

Pensando nisso, criei uma outra classe "DescontoPai" e a tornei abstrata, implementando a interface Desconto e incluindo o atributo "proximo" como protected, além do método "setProximo". Deixei o método "calcula" como abstrato:

public abstract class DescontoPai implements Desconto {

  protected Desconto proximo;

  @Override
  public abstract double calculaDesconto(Orcamento orcamento);

  @Override
  public void setProximo(Desconto desconto) {

    proximo = desconto;
  }
}

Com isso, nas classes filhas apenas herdei de DescontoPai e implementei os respectivos algoritmos. Segue uma das classes:

public class DescontoVendaCasada extends DescontoPai {

  @Override
  public double calculaDesconto(Orcamento orcamento) {

    if (orcamento.existe("Lapis") && orcamento.existe("Caneta")) {

      System.out.println("Desconto de venda casada - 3%");
      return orcamento.getValor() * 0.03;  
    }

    return proximo.calculaDesconto(orcamento);
  }
}

Seria isso uma boa prática ou acabei engessando código?

2 respostas
solução!

Olá Raphael,

Acredito que você fez bem eu criar a classe abstrata, com ela é possível minimizar os códigos similares que teríamos que fazer em todas as etapas do chain, eu quando fiz o curso implementei exatamente igual a você conforme você pode observar no meu github:

https://github.com/denisricci/alura-design-pattern/blob/master/src/main/java/br/com/alura/pattern/chainofresponsability/desconto/Desconto.java

Boa, Denis!

Continuando o curso, percebi que o que fizemos faz parte do Template Method. Então acredito que fizemos uma mescla de Strategy + Template nessa implementação.