Padrão Chain of Responsibility
O Padrão Chain of Responsibility é um padrão de projeto comportamental que permite que você repasse chamadas de métodos através de uma corrente de objetos que podem tratar essa chamada. Ao receber um pedido, cada objeto da cadeia deve decidir se processa o pedido ou se passa adiante para o próximo objeto na corrente.
Problema
Imagine que você está construindo uma loja virtual pra vender adesivos de notebook e que, para atrair novos clientes, criou algumas regras para que descontos sejam aplicados. Entre essas regras estão:
Pedidos com mais de 10 itens devem ter desconto de R$ 5,00
Pedidos que contem um item do tipo Especial deve ter desconto de R$ 2,00
Pedidos que totalizem mais de R$ 100,00 devem ter R$ 8,00 de desconto
Como iriamos criar uma implementação para aplicar esses descontos? Pensando em um exemplo inicial podemos ter o seguinte cenário.
Para visualizar a implementação das demais classes, consulte o repositório, mas não é necessário por hora. O problema dessa abordagem é a quantidade de condições (ifs
) concatenadas que podem ter nesse método de implantarDesconto
, o que deixa o código mais complexo para manutenção.
Solução
Transformaremos a classe Desconto em uma interface
, evidenciando o método implantarDesconto
e definindo um método setProximo
, para que possamos definir os elementos que virão na sequência da cadeia.
As implementações da interface Desconto
se focam apenas nas regras de negócio que desejam processar, nesse caso as regras específicas de quando aplicar desconto ou não. Veja no exemplo abaixo a classe DescontoQuantidadeItens
.