Memento: estado de un objeto (II)
En esta segunda parte ( ver parte 1 ) de la serie de posts relacionados con la implementación del patrón de diseño Memento voy a mostrar una versión mucho más genérica que simplifica su reutilización en cualquier contexto.
Los objetivos que me he marcado para realizar esta implementación son básicamente dos:
- Reutilización: Crear una librería que implemente Memento de tal forma que se pueda utilizar sin tener que preocuparse de crear clases Memento concretas.
- Persistencia: Crear una capa de persistencia para que los Mementos se puedan almacenar no solo en memoria sino tambien en un SharedObject, en una base de datos, en un archivo, etc..
Estructura del proyecto de ejemplo en Flex builder:

Si comparamos la estructura del proyecto con la de la versión del primer post se pueden ver una serie de diferencias que voy a enumerar a continuación.
- ObjectSnapshot: Para empezar la interfaz
IMementoya no está y se ha sustituído por la claseObjectSnapshot. Esta clase es la implementación maestra de un Memento. Gracias a esto ya nunca más tendremos que preocuparnos de implementar un Memento. Extendiendo de la claseflash.utils.Proxyse ha podido crear una implementación que cabe en cualquier escenario debido a la potencia que nos ofrece el hecho que es una clase dinámica (dynamic). Como los Mementos no son objetos que se requieran en escenarios de gran rendimiento ( yo no voy a más de 2 CTRL+Z por segundo.. :) ) el hecho de utilizar una clase dinámica no nos penaliza. - IRestorable: Esta interfaz sustituye a
IOriginatorde la otra versión. Es básicamente lo mismo pero con otro nombre más significativo (para mi) y añadiendo par de métodos más que obligan a los implementores a disponer de unIPersistable. - IPersistable: Interfaz que deben implementar todos los drivers que van a permitir guardar los Mementos (ObjectSnapshots) en distintos soportes. La condición que impone a los implementores es disponer de un método write() y otro read().
- carpeta persisters: Una colección de implementaciones base de
IPersistable. Se puede ver que una limitación que tienen estos objetos es que las peticiones deben siempre síncronas. Igual en un post futuro esto cambia…
Los conceptos son los mismos pero he intantado adaptar la implementación para que saque más partido de las características de ActionScript 3.
Lo mejor es descargar el ejemplo y jugar un poco:
Descarga ejemplo
En el zip hay un proyecto ActionScript para Flex Builder.











