Oi Bruno,
no Chain of Responsibility normalmente tem um "if" para testar o que devemos aplicar essa cadeia. Se for verdadeiro faz, por exemplo algum calculo (aplica alguma regra), e se for falso continua com a próxima cadeia.
Por exemplo,
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);
}
}
}
Esse if se repete em todas as cadeias, o que muda é a condição do if, nesse exemplo: $orcamento->getValor() > 500
e a regra em si:$orcamento->getValor() * 0.07
.
Sabendo disso podemos criar um Template que já faz o if pra gente. Nas filhas desse template vamos definir dois métodos, o primeiro para implementar a condição (poderia se chamar aceita()) e a regra (calculaDesconto()).
Não coloquei a implementação aqui, se tiver com mais dúvidas, é só perguntar.
abs