Se fosse colocado uma propriedade na classe Orçamento para dizer se ele já foi aprovado ou não seria errado?
public class Orcamento { public double Valor { get; set; } public IList Itens { get; private set; }
public EstadoDeUmOrcamento EstadoAtual { get; set; } public bool JaAprovado {get; set;}
public Orcamento(double valor) { this.Valor = valor; this.Itens = new List(); this.EstadoAtual = new EmAprovacao(); this.JaAprovado = false; }
Assim no método Aprovado verificaria esta propriedade do orcamento e apresentaria exceção:
public class Aprovado : EstadoDeUmOrcamento { public void AplicaDescontoExtra(Orcamento orcamento) { if(orcamento.JaAprovado) throw new Exception("Orcamento já está aprovado);
orcamento.Valor -= orcamento.Valor * 0.02; orcamento.JaAprovado = true; } //.... restante da classe }