# Propósito
Captura y almacena el estado actual de un objeto para restaurarlo luego, sin violar el encapsulamiento.
# Problema
-
Restauración de Estado: Necesidad de volver atrás sin exponer la implementación interna.
-
Violación de Encapsulamiento: Evitar que objetos externos manipulen el estado privado.
# Solución
Delegar la creación de una copia del estado (Memento) al propio objeto (Originador). Un Cuidador gestiona el historial sin ver los detalles.
# Estructura
# Participantes
- Memento: El snapshot del estado.
- Originator: Crea el memento y restaura su estado a partir de él.
- Caretaker: Mantiene la pila de mementos (historial).
# Cuándo Usarlo
Implementar funcionalidad "undo/redo" o mantener historiales de estado sin exponer la clase origen.
# Ventajas
-
verified
Encapsulamiento: El estado sigue siendo privado.
-
verified
Simplificación: Originador no gestiona su propio historial.
# Desventajas
-
warning
Memoria: Muchos snapshots consumen recursos significativos.
-
warning
Incompatibilidad: Mementos viejos pueden fallar si la clase cambia.
# Ejemplo: Editor de Texto (Undo)
Almacenar el contenido del editor antes de cada cambio en una pila para permitir el retroceso.
# Código Java
class Memento {
private final String state;
public Memento(String s) { state = s; }
public String getState() { return state; }
}
class Editor {
private String text;
public Memento save() { return new Memento(text); }
public void undo(Memento m) { text = m.getState(); }
}
# Mapeo Participantes
- TextMemento: Memento.
- TextEditor: Originator.
- Caretaker: Gestor de pila de cambios.
# Conclusiones
Solución robusta para implementar la reversión de estados de forma limpia y mantenible.
# Patrones relacionados
Command
Para implementar acciones reversibles completas.
Iterator
Para navegar por el historial de mementos.