Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Patrones de Diseño de Comportamiento

Memento

Capturar y restaurar estado de un objeto

Universidad Nacional de Rio Negro - Sede Andina

Definición

El patrón Memento (Recuerdo) es un patrón de diseño de comportamiento que permite capturar y externalizar el estado interno de un objeto sin violar su encapsulación, de forma que el objeto pueda ser restaurado a dicho estado posteriormente.

El patrón separa la responsabilidad de guardar el estado (Memento) de la lógica del objeto original (Originador) y de quien gestiona el historial (Cuidador).

Origen e Historia

Formalizado por el GoF en 1994, el Memento resolvió el dilema de cómo hacer copias de seguridad del estado de un objeto sin exponer sus atributos privados. Antes de este patrón, para guardar el estado de un objeto a menudo se necesitaba que este expusiera sus campos internos, lo que rompía los principios de la programación orientada a objetos.

Motivación

La motivación principal es el soporte para operaciones de “deshacer” (undo) o “puntos de control” (checkpoints). Necesitamos una forma de volver atrás en el tiempo sin que el sistema que gestiona el historial sepa cómo está construido el objeto por dentro.

Contexto

Cuando aplica

Cuando no aplica

Consecuencias de su uso

Positivas

Negativas

Alternativas

Estructura

Diagramas

Diagrama de Clases

Diagrama de Secuencia

Ejemplos

/**
 * El Memento: Es inmutable y solo el Originador puede leerlo de verdad.
 */
public class Memento {
    private final String estado;
    public Memento(String e) { this.estado = e; }
    public String getEstado() { return estado; }
}

/**
 * El Originador: El objeto que cambia y queremos guardar.
 */
public class Editor {
    private String contenido;
    public void escribir(String texto) { this.contenido = texto; }
    
    public Memento guardar() { return new Memento(contenido); }
    public void restaurar(Memento m) { this.contenido = m.getEstado(); }
}

/**
 * El Cuidador: El que maneja la lista de mementos (el historial).
 */
public class Historial {
    private Stack<Memento> estados = new Stack<>();
    public void push(Memento m) { estados.push(m); }
    public Memento pop() { return estados.pop(); }
}

Ejercicios

Resumen

El Memento es la “máquina del tiempo” de los objetos. Su gran valor es permitir que un sistema tenga memoria de sus estados pasados sin comprometer la integridad ni la privacidad de sus datos internos, logrando un equilibrio entre funcionalidad y diseño limpio.

Próximo paso

Para seguir, conviene pasar a el material siguiente, donde el recorrido continúa sobre esta base.