Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Memento: status + correção

Tentei implementar o Memento da seguinte forma:

package Memento;

public class TesteDeState {
    public static void main(String[] args) {

        Historico historico = new Historico();
        Orcamento reforma = new Orcamento(500);
        reforma.aplicaDescontroExtra();
        System.out.println(reforma.getValor());
        historico.adiciona(reforma.salvaEstado());        
        reforma.aprova();
        reforma.aplicaDescontroExtra();
        System.out.println(reforma.getValor());
        historico.adiciona(reforma.salvaEstado());

        reforma.finaliza();
        historico.adiciona(reforma.salvaEstado());


        System.out.println(historico.pega(0));
        System.out.println(historico.pega(1));
        System.out.println(historico.pega(2));
    }
}

Estados do orçamento:

package Memento;

public class EstadoDeUmOrcamento {
    protected Orcamento orcamento;
    void aplicaDescontoExtra(Orcamento orcamento) {};
    void aprova(Orcamento orcamento) {};
    void reprova(Orcamento orcamento) {};
    void finaliza(Orcamento orcamento) {};

}

Exemplo de um estado:

package Memento;

public class Aprovado extends EstadoDeUmOrcamento {

    @Override
    public void aplicaDescontoExtra(Orcamento orcamento) {
        orcamento.valor -= orcamento.valor * 0.02;                
    }

    @Override
    public void aprova(Orcamento orcamento) {
        throw new RuntimeException("Orçamento já aprovado!");
    }

    @Override
    public void reprova(Orcamento orcamento) {
        throw new RuntimeException("Orçamento já aprovado!");
    }

    @Override
    public void finaliza(Orcamento orcamento) {
        orcamento.estadoAtual = new Finalizado();        
    }

}

Histórico:

package Memento;

import java.util.ArrayList;
import java.util.List;

public class Historico {
    private List<EstadoDeUmOrcamento> estadosSalvos = new ArrayList<>();

    public EstadoDeUmOrcamento pega(int index) {
        return estadosSalvos.get(index);
    }

    public void adiciona(EstadoDeUmOrcamento estado) {
        estadosSalvos.add(estado);
    }
}

Orçamento:

package Memento;

public class Orcamento {

    protected EstadoDeUmOrcamento estadoAtual;
    protected double valor;

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

    public EstadoDeUmOrcamento salvaEstado() {
        return new EstadoDeUmOrcamento();
    }

    public double getValor() {
        return valor;
    }

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

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

    public void aplicaDescontroExtra() {
        estadoAtual.aplicaDescontoExtra(this);
    }

}

Está correto?

1 resposta
solução!

Fala André, tudo bem?

Aparentemente seu memento está correto sim (=