El patrón Memento es un patrón de comportamiento que permite capturar y guardar el estado interno de un objeto en un momento determinado, sin exponer su estructura interna. Esto permite restaurar el objeto a ese estado previo posteriormente, manteniendo el principio de encapsulamiento. Es la base técnica detrás de la famosa función “Deshacer” que usamos diariamente en editores de texto, hojas de cálculo, editores gráficos y muchos otros programas.
Idea Principal: Guardar el estado actual de un objeto para poder restaurarlo después, sin violar su encapsulamiento.
Ventajas clave
Guardar múltiples estados (historial)
Deshacer/Rehacer de forma simple y segura
No expone detalles internos del objeto
Fácil de integrar
¿Cómo funciona?
El patrón Memento se basa en tres roles principales:
Creador: Es el objeto cuyo estado queremos guardar. Puede crear un "Memento" con su estado actual y también restaurarse a partir de uno.
Memento o "Recuerdo": Es un objeto inmutable que almacena el estado interno del "Creador". Solo el "Creador" puede leer o escribir en él.
Cuidador: Es responsable de guardar y gestionar los diferentes "Mementos", generalmente en una lista o pila. El "Cuidador" no debe inspeccionar ni modificar el contenido del "Memento".
Flujo
El "Creador" crea un "Memento" con su estado actual.
El "Cuidador" guarda ese "Memento".
Cuando se necesita deshacer, el Cuidador" devuelve el "Memento" al "Creador".
El "Creador" restaura su estado interno usando la información del "Memento".
Ejemplo Real
Se tiene un editor de texto y se tiene el documento de texto:
Versión 1: “Aprendiendo patrones de diseño”
Versión 2: “Aprendiendo patrones de diseño con Memento”
Versión 3: “Aprendiendo patrones de diseño con Memento en PHP”
Cada vez que el usuario modifica el documento, se guarda un "Memento". Si se pulsa Ctrl + Z, el sistema restaura el estado anterior gracias al Memento más reciente.
¿Cuándo usar el Patrón Memento?
Usarlo cuando
Necesitas implementar deshacer/rehacer
El objeto tiene un estado complejo
Quieres mantener el encapsulamiento
Necesitas un historial de cambios
No usarlo si
El estado es muy grande (alto consumo de memoria)
No necesitas revertir cambios
El historial puede crecer indefinidamente sin control