Membro desde: 14/04/2004 14:16:52
Mensagens: 69
Localização: São Paulo
Offline
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
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 estadooriginal.