No Curso de Design Patterns I, estou estudando o pattern 'Chain Of Responsability'. A implementação cria uma corrente de descontos por quantidades de itens ou por valor em reais, então na implementação tem a classe 'Desconto5Itens' , 'Desconto500Reais' e 'SemDesconto'. No calculo do desconto existe a classe 'CalculadorDeDescontos' que tenta aplicar os 3 tipos de descontos possíveis a um orçamento que são: 'Desconto5Itens', 'Desconto500Reais' e 'SemDescontos'.
A base das 2 primeiras classes de desconto é essa:
class Desconto500Reais implements IDesconto {
private $proximoDesconto;
public function setProximo(IDesconto $proximo) {
$this->proximo = $proximo;
}
public function desconta(Orcamento $orcamento) {
if($orcamento->getValor() > 500) {
return $orcamento->getValor() * 0.07;
}
else {
return $this->proximoDesconto->desconta($orcamento);
}
}
}
O que ocorre então é que cada objeto de desconto tem a referencia do proximo desconto e se ele não atender o desconto no método 'desconta' passa para o proximo desconto.
A minha questão é:
Não seria mais fácil o objeto desconto antes de passar a bola para o próximo desconto testar se o próximo desconto existe? Se o objeto atual testar e proximo estiver la ele passa, caso contrario ele já retorna zero porque ele é o último da corrente .
A classe 'SemDesconto' no caso eu acho meio inutil porque sempre retornará Zero e ainda por cima será obrigada a implementar um método vazio 'setProximo'.
O que vocês dizem sobre esta questão?
Obrigado.