Memento (informática): diferenças entre revisões
Conteúdo apagado Conteúdo adicionado
Edição na sessão Funcionamento. |
Adicionada a Implementacao |
||
Linha 30:
O objeto representado na classe Originador cria um novo memento a partir de si próprio, é ele que vai controlar toda a execução do Padrão Memento, criando uma nova instância da classe Armazenador, sempre que haja alguma modificação derivada de ações do sistema e de seu funcionamento padrão, o Originador irá criar um novo Memento, externalizando seu estado interno para um novo objeto que se tornará o Memento que será armazenado para posterior restauração. Além dos métodos e atributos próprios do objeto a ser restaurado, o Originador conta com um atributo que represente o estado atual do mesmo, métodos para definir e atribuir o estado, e métodos para salvar e solicitar o estado a partir do Memento.
Com o estado salvo no Objeto Memento, o Originador volta suas atenções para o Armazenador, quando o método que aciona a ação de modificação é invocado, o Memento é criado e adicionado no Armazenador, que, a partir de agora guardará os Mementos em uma pilha, usando o LIFO, para tanto, o Armazenador possui uma lista do tipo do Memento, possui métodos para adicionar um novo Memento e para acessar o ultimo adicionado na pilha do Armazenador, quando o ultimo for retirado, o topo da lista será o Memento com o estado anterior ao que foi solicitado, e assim por diante, até que não haja mais Mementos para serem acessados, nesse momento deve ser lançada uma exceção.
== Implementação ==
O código em java a seguir ilustra a utilização do memento para desfazer ações de mudança de estado.
import java.util.List;
import java.util.ArrayList;
class Originator {
private String estado;
public void set(String state) {
System.out.println("Originador: Mudando estado para " + state);
this.estado = state;
}
public Memento salvarMemento() {
System.out.println("Originador: Salvando o Memento.");
return new Memento(this.state);
}
public void restaurarMemento(Memento memento) {
this.state = memento.getSavedState();
System.out.println("Originador: Estado apos restaurar o Memento: " + state);
}
public static class Memento {
private final String state;
public Memento(String stateToSave) {
state = stateToSave;
}
private String getEstadoSalvo() {
return state;
}
}
}
class Armazenador{
public static void main(String[] args) {
List<Originador.Memento> estadosSalvos = new ArrayList<Originador.Memento>();
Originador originador = new Originador();
originador.set("Estado1");
originador.set("Estado2");
estadosSalvos.add(originador.salvarMemento());
originador.set("Estado3");
// Podemos ter multiplos mementos e escolher qual queremos restaurar.
savedStates.add(originator.saveToMemento());
originador.set("Estado4");
originador.restaurarMemento(estadosSalvos.get(1));
}
}
A saida deste codigo é:
Originador: Mudando estado para Estado1
Originador: Mudando estado para Estado2
Originador: Salvando o Memento.
Originador: Mudando estado para Estado3
Originador: Salvando o Memento.
Originador: Mudando estado para Estado4
Originador: Estado apos restaurar o Memento: Estado3
Este exemplo utiliza uma String como o estado, o que é um objeto imutável em Java. Em cenários da vida real, o estado na maioria das vezes é um objeto, neste caso uma copia do objeto deve ser feita.{{esboço-prog}}
|