terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat memento.md
guest@codeandosimple: ~/blog/design-patterns $ cat memento.md

Patrón Memento_

// "No dejes que lo que no puedes hacer interfiera con lo que puedes hacer" - John Wooden

# 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

Estructura UML Memento

# 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.

Ejemplo Memento Editor

# 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.