Prover uma forma de facilitar a persistência do objeto.
Conceptualmente objetos residem na memória da máquina virtual. Contudo, na prática, é interessante conseguir transportar estes objetos para outras máquinas e em particular persistir o estado do objeto. O padrão Memento visa simplificar estas atividades provendo um mecanismo de mapeamento.
O padrão Memento assenta no conceito de que o objeto persistido (ou transportado) não é o objeto real, mas apenas um objeto que é a imagem do estado do objeto original. O objeto que contém o estado para persistência/transporte é apenas um memento do objeto original. A palavra "memento" significa : recordação , souvenir.
Sendo que o estado do objeto original está no objeto memento é possível que este estado seja preservado enquanto o objeto original está sendo alterado. Se algo de errado acontecer com a mudança de estado do objeto original, o seu estado poderá sempre ser revertido ao estado original. Assim sendo, o padrão memento desempenha o padrão memento desempenha um papel importante no controle de transações.
A implementação do padrão Memento difere de contexto para contexto sendo fortemente relacionada ao objetivo de produzir objetos Memento. A implementação mais simples é ter dois métodos, um que devolve uma cópia do estado do objeto original e um outro que modificar o estado do objeto original para o estado presente no memento.
A classe Random
da API padrão pode utilizar um numero como semente. Este numero configura um estado especifico da classe Random
de forma que, deterministicamente determina todos os futuros estados da classe. E te numero pode ser considerado como um uso do padrão Memento onde o memento é o proprio numero usado como semente. Embora um único numero não contenha a lógica da classe Random
, ele contém toda a informação de estado necessária para colocar o objeto Radom no estado certo.
O processo de serialização do Java é muito útil. Na sua forma mais simples, a serialização é feita simplesmente implementando a interface marcadora Serializable
. Contudo, é possível interferir no mecanismo de serialização para ler e escrever no stream objetos diferentes do objeto que está sendo serializado. Para conseguir isto usamos o padrão Memento.
O serializar colocamos o estado do objeto em um objeto mais simples, o memento e ao desserializar atribuimos ao objeto original o estado presente no objeto memento.
O padrão Memento é facilmente relacionado ao padrão Transfer Object. Em tese todos os objetos memento podem ser Transfer Object, contudo o padrão Memento é implementando pelo objeto originador do estado. Dito de outra forma, se o objeto A contém um estado que deseja preservar, A pode implementar o padrão Memento, mas não o padrão Transfer Object.
Por outro lado, o objeto B que contém o estado de A implementa o padrão Transfer Object e o padrão Memento.
[1] Steven John Metsker Design Patterns Java Workbook: Addison-Wesley Professional (2002)
[2] Ralph Johnson, Erich Gamma, John Vlissides, Richard Helm Design Patterns: Elements of Reusable Object-Oriented Software: Addison-Wesley (2005)