Design patern memento, alguém usa? Existe algum forum sobre Design Patern?

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 :wink:

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) );
   }
}