💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Memento
Memento (Recuerdo) es un patrón de diseño comportamental que permite guardar y restaurar el estado previo de un objeto sin revelar los detalles de su implementación.
Propósito y Caso de Uso
Utiliza Memento cuando necesites implementar puntos de guardado o funcionalidad deshacer (undo) sin romper el encapsulamiento del objeto original (ej. un editor de formularios que debe volver a un estado anterior tras un error de validación). A diferencia del Patrón Command (que registra acciones para revertirlas paso a paso), Memento captura una fotografía completa del estado en un momento dado.
Estructura del Patrón
- Originador (Originator): El objeto cuyo estado se quiere guardar; crea y restaura mementos.
- Memento: Objeto inmutable que almacena una copia del estado del originador, con acceso restringido desde fuera.
- Cuidador (Caretaker): Guarda la colección de mementos (historial), sin acceder a su contenido interno.
Flujo de Funcionamiento
- Captura: El originador crea un memento con una copia de su estado actual.
- Almacenamiento: El cuidador guarda el memento en una pila o historial, sin inspeccionar su contenido.
- Restauración: El originador recibe un memento anterior y reconstruye su estado a partir de él.
Ejemplos de Implementación Reales
class FormMemento {
constructor(private readonly state: Record<string, string>) {}
getState(): Record<string, string> { return { ...this.state }; }
}
class FormEditor {
private fields: Record<string, string> = {};
setField(key: string, value: string) { this.fields[key] = value; }
save(): FormMemento { return new FormMemento(this.fields); }
restore(memento: FormMemento) { this.fields = memento.getState(); }
}
class History {
private snapshots: FormMemento[] = [];
push(memento: FormMemento) { this.snapshots.push(memento); }
pop(): FormMemento | undefined { return this.snapshots.pop(); }
}
const editor = new FormEditor();
const history = new History();
editor.setField('title', 'Borrador v1');
history.push(editor.save());
editor.setField('title', 'Borrador v2 (con error)');
editor.restore(history.pop()!); // Vuelve a "Borrador v1"Cuándo NO usarlo
Si el estado del objeto es trivial (2-3 valores primitivos), copiarlo directamente en una variable es más simple que crear una clase Memento dedicada (YAGNIGlosarioYAGNI (You Aren't Gonna Need It)Principio de Extreme Programming (XP) que establece que un programador no debe añadir funcionalidad hasta que sea estrictamente necesario. Su objetivo es evitar la sobre-ingeniería (over-engineering), previniendo código para funcionalidades hipotéticas.Ver término completo →).