Logicamente, um modelo de desconto pode ser qualquer coisa , então você não pode presumir que pode programar todos os casos com antecedência. Nem alguém que responde à sua pergunta pode ter certeza absoluta do que realmente precisa. No entanto, supondo que você obtenha os tipos usuais de descontos encontrados no mundo real ...
Uma grande questão é se os descontos serão programados ou se você deseja que os usuários os inscrevam. Como mencionado acima, você nunca pode programá-los, mas geralmente o objetivo é tentar torná-lo mais como os casos comuns, em vez de programá-los todos. Isso se aplica até certo ponto, mesmo se os programadores forem usados para criar todos os descontos.
Martin Fowler menciona "Método de instância individual" em "Padrões de análise: modelos de objetos reutilizáveis" como parte de como implementar "Regras de postagem" para sistemas de contabilidade, mas as regras parecem bastante semelhantes às suas. Eu daria mais detalhes, mas é um trabalho protegido por direitos autorais e
Para uma interface com o usuário, você precisa criar casos de uso bastante simples ou criar um interpretador e um construtor de consultas. Possivelmente ambos, um para casos simples e outro mais avançado. Se você escreve um intérprete, esse é provavelmente um bom argumento para usar o padrão Interpreter, pois é relativamente simples de codificar em comparação com um gerador de analisador, e o tempo de análise mais lento provavelmente não importa. (Se você gosta de usar geradores de analisador, não me deixe pará-lo).
Não tente fazer tudo com um intérprete - em algum momento você está apenas programando em sua própria linguagem ruim, para que você possa usar uma linguagem real. Se a sua linguagem interpretada suportar funções (provavelmente deve suportar chamá-las - defini-las é duvidosa), elas podem ser codificadas em uma linguagem real. Não vá mais longe nesse caminho do que o necessário.
Não importa o que você faça, alguém desejará que o desconto se baseie em sua compra dentro de 30 dias úteis de uma promoção - onde os dias úteis contam apenas se não houver feriado na região definida pelo código postal da loja ou pelo cliente. Código postal. Portanto, não tente projetar o sistema perfeito com antecedência - suponha que às vezes seja necessário escrever código para novos tipos de descontos e projetá-lo adequadamente.