Alguém usa ou já usou o design patern memento?
Poderia me fornecer um matérial ou me indicar um site que tenha?
No GUJ está faltando um forum sobre Design Patern! Seria muito bom se o administrador do GUJ o criasse!
Obrigado…
Alguém usa ou já usou o design patern memento?
Poderia me fornecer um matérial ou me indicar um site que tenha?
No GUJ está faltando um forum sobre Design Patern! Seria muito bom se o administrador do GUJ o criasse!
Obrigado…
tambem gostaria saber desse pattern
Este faz parte do tópico “Metodologias, Arquitetura & Projeto de Software”
Está do descritivo do tópico;
Observação: normalmente quando utilizamos um determinado pattern, nós partimos de um problema específico e nos perguntamos: “existe algum design pattern conhecido que resolva este problema?”. Estou fazendo a observação pois participei de um projeto onde o memento foi introduzido a força e gerou um abacaxi daqueles.
Quando estudei este pattern o exemplo clássico de utilização apresentado era o Ctrl+Z das aplicações swing. Alguns colegas acharam que seria uma ótima idéia usar em nosso sistema. Em uma determinada tela existia um botão de desfazer.
A idéia foi implementada mas ela em geral é muito custosa. Ou seja: em geral você vai precisar analizar seus objetos para otimizar o memento, senão fica tudo muito lento. No nosso caso tudo funcionou no desenvolvimento com até uns 12 objetos por tela. Em produção a aplicação simplesmente parou de funcionar quando acessaram uma página com 80 objetos.
Por fim, descobrimos que o caso em questão não era para memento pois o botão desfazer na verdade não voltava os objetos ao estado anterior, mas sim criava um “outro caminho”.
Resumindo: pense mais de duas vezes antes de usar memento
Só lendo artigos em inglês? (tente traduzir se não souber inglês)
Fonte: http://en.wikipedia.org/wiki/Memento_pattern
O que o design patern memento faz é simplesmente restaurar o objeto para seu estado original (seria tipo um rollback ou CTRL + Z).
São usados dois objetos: o originator e um guarda. O originator é algum objeto que tem um estado interno. O guarda está indo fazer algo ao originator, só que com a possibilidade de desfaz a mudança. O guarda pede primeiramente ao originator um objeto do memento. Depois faz as mudanças que precisa, logo após efetua um rollback e retorna o objeto para o seu estado original.
Se eu estiver errado me corrijam!
Segue algumas classes de exemplos:
Classe Originator:
public class Originator {
private String state;
/* lots of memory consumptive private data that is not necessary to define the
* state and should thus not be saved. Hence the small memento object. */
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);
}
}
private static class Memento {
private String state;
public Memento(String stateToSave) { state = stateToSave; }
public String getSavedState() { return state; }
}
}
Classe Caretaker:
import java.util.ArrayList;
public class Caretaker {
private ArrayList savedStates = new ArrayList();
public void addMemento(Object m) { savedStates.add(m); }
public Object getMemento(int index) { return savedStates.get(index); }
}
Classe MementoExample:
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) );
}
}