PATRÓN MEMENTO: QUÉ ES Y CÓMO FUNCIONA

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

  1. El "Creador" crea un "Memento" con su estado actual.
  2. El "Cuidador" guarda ese "Memento".
  3. Cuando se necesita deshacer, el Cuidador" devuelve el "Memento" al "Creador".
  4. 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:
  1. Versión 1: “Aprendiendo patrones de diseño”
  2. Versión 2: “Aprendiendo patrones de diseño con Memento”
  3. 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

Aplicaciones comunes

  • Editores de texto e imágenes
  • Videojuegos (guardar/cargar partidas)
  • Formularios web
  • Sistemas de workflow con confirmaciones
  • Aplicaciones con historial de acciones
Ejemplo del patrón Memento en php