Olá Bruno, tudo bem?
O Chain of Responsibility é um padrão de design que pode ser muito útil para implementar cenários como o da calculadora de descontos. Vamos às suas perguntas:
a - Para aplicar sempre o desconto mais alto dentre um conjunto de regras, você pode implementar o Chain of Responsibility de forma que cada nó da cadeia represente uma regra de desconto. Cada nó deve verificar se a condição para aplicar o desconto é atendida e, se for o caso, aplicar o desconto e encerrar a cadeia. Se a condição não for atendida, o nó deve passar a requisição para o próximo nó da cadeia. Dessa forma, o desconto mais alto será aplicado primeiro, pois as regras mais vantajosas estarão no início da cadeia.
b - Para aplicar descontos cumulativos caso as condições de mais de um desconto sejam atendidas, você pode implementar o Chain of Responsibility de forma que cada nó da cadeia represente uma regra de desconto, assim como no cenário anterior. No entanto, cada nó deve verificar se a condição para aplicar o desconto é atendida e, se for o caso, aplicar o desconto e continuar a cadeia, passando a requisição para o próximo nó. Dessa forma, todos os descontos cujas condições forem atendidas serão aplicados.
c - Para permitir desabilitar regras de desconto de forma dinâmica e obter os descontos ativos naquele momento, você pode implementar o Chain of Responsibility de forma que cada nó da cadeia represente uma regra de desconto habilitada ou desabilitada. Você pode ter uma classe responsável por gerenciar a cadeia de descontos, que seria responsável por montar a cadeia de nós habilitados e passar a requisição para o primeiro nó da cadeia. Dessa forma, você pode habilitar ou desabilitar regras de desconto dinamicamente, e a cadeia de descontos será montada de acordo com as regras habilitadas no momento da requisição.
Espero ter ajudado e bons estudos!