1
resposta

Regra para impedir que um desconto seja aplicado mais de uma vez para um mesmo estado

Ao invés de criar uma propriedade em cada estado eu criei em EstadoDeUmOrcamento e a tornei uma classe abstrada. Isso seria uma má prática?

package state.exemplo1;

public abstract class EstadoDeUmOrcamento {

    private boolean descontoAplicado;

    abstract void aplicaDescontoExtra(Orcamento orcamento);

    abstract void aprova(Orcamento orcamento);

    abstract void reprova(Orcamento orcamento);

    abstract void finaliza(Orcamento orcamento);

    public void setDescontoAplicado(boolean descontoAplicado) {
        if (this.descontoAplicado) {
            throw new RuntimeException("O desconto já foi aplicado!");
        } else {
            this.descontoAplicado = true;
        }
    }

    public boolean isDescontoAplicado() {
        return this.descontoAplicado;
    }
}
package state.exemplo1;

class Orcamento {

    protected double valor;
    protected EstadoDeUmOrcamento estadoAtual;

    public Orcamento(double valor) {
        this.valor = valor;
        this.estadoAtual = new EmAprovacao();
    }

    public double getValor() {
        return valor;
    }

    public EstadoDeUmOrcamento getEstadoAtual() {
        return estadoAtual;
    }

    public Orcamento() {
        this.estadoAtual = new EmAprovacao();
    }

    public void aplicaDescontoExtra() {
        if (!estadoAtual.isDescontoAplicado()) {
            estadoAtual.aplicaDescontoExtra(this);
            estadoAtual.setDescontoAplicado(true);
        } else {
            throw new RuntimeException("Não é permitido aplicar o desconto mais de uma vez para o mesmo estado!");
        }
    }

    public void aprova() {
        estadoAtual.aprova(this);
    }

    public void reprova() {
        estadoAtual.reprova(this);
    }

    public void finaliza() {
        estadoAtual.finaliza(this);
    }
}
1 resposta

Sua classe EmAprovacao extende de EstadoDeUmOrcamento? Prefira usar composição ao invés de herança.