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?