Boa noite.
Eu sei que já tem bastante tempo desde que essa pergunta foi feita, mas eu gostaria de compartilhar minha solução.
Eu pensei na mesma coisa que vocês e, acredito, muita gente.
Como no exercício não ficou muito claro, eu optei por fazer o que fazia mais sentido parar mim: uma variável de controle por orçamento, ao invés de por estado.
Para isso, basta transferirmos a variável "descontoAplicado" para a classe "Orcamento". Será necessário, no entanto, mudar seu modificador de acesso para "protected", assim permitindo que os estados a manipulem.
protected boolean descontoAplicado;
(não esqueça de inicializar a variável no construtor)
Nas classes de estado, basta acessarmos a variável diretamente:
if ( !orcamento.descontoAplicado ) {
orcamento.valor -= orcamento.valor * 0.05;
orcamento.descontoAplicado = true;
}
Ou então, opcionalmente, você pode colocar o modificador de acesso como "private" e usar getters/setters, fica à seu critério.
Espero ter ajudado.
Um abraço.