terça-feira, 9 de novembro de 2010

Memento Pattern



Definição

Para gravar um estado interno do objeto sem violar o encapsulamento e
reavê-lo mais tarde, sem o conhecimento do objeto original. Uma lembrança é um objeto que armazena um  estado interno instantâneo  de outro objeto.

Quando usar

• Quando for util deixar algumas informações em um objeto gravado em outro objeto.
• Quando você quiser criar um estado instantâneos  para um objeto.
• Quando você precisa desfazer / refazer funcionalidades.

Benefícios
Capacidade de restaurar um objeto ao seu estado anterior.

Desvantagens / consequências
Cuidados devem ser tomados se o autor pode alterar outros objetos ou recursos
 O memento pattern opera sobre um único objeto. Usando o memento para armazenar grandes quantidades de dados do originador pode ser caro se os clientes  criarem as lembranças e essas retornarem um estado com freqüência.


Exemplo

public class Originator {
private String state;
/ * Lotes de memória utilizando os dados particulares que não têm de ser
salvo. Em vez disso, usar um objeto de lembrança pequeno. * /

public void set(String state) {
System.out.println("Originator: Setting state to " + state);
this.state = state;
}

public Object saveToMemento() {
System.out.println("Originator: Saving to Memento.");
return new Memento(state);
}

public void restoreFromMemento(Object m) {
if (m instanceof Memento) {
Memento memento = (Memento) m;
state = memento.getSavedState();
System.out.println("Originator: State after restoring
from Memento: " + state);
}
}
}

import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Object> savedStates = new ArrayList<Object>();

public void addMemento(Object m) {
savedStates.add(m);
}

public Object getMemento(int index) {
return savedStates.get(index);
}
}


public class Memento {
private String state;
public Memento(String stateToSave) {
state = stateToSave;
}

public String getSavedState() {
return state;
}
}

public class MementoExample {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator originator = new Originator();
originator.set("State1");
originator.set("State2");
caretaker.addMemento(originator.saveToMemento());
originator.set("State3");
caretaker.addMemento(originator.saveToMemento());
originator.set("State4");
originator.restoreFromMemento(caretaker.getMemento(1));
}
}

Quando  MementoExample é executado o resultado é:
Originator: Setting state to State1
Originator: Setting state to State2
Originator: Saving to Memento.
Originator: Setting state to State3
Originator: Saving to Memento.
Originator: Setting state to State4
Originator: State after restoring from Memento: State3

Exemplo de uso

Freqüentemente usado em operações de banco de dados e fazer / desfazer situações.

Nenhum comentário:

Postar um comentário