Patrón de Diseño Memento: Persistencia de Estados en Objetos

El patrón Memento permite capturar y almacenar el estado interno de un objeto sin violar su encapsulamiento, de manera que posteriormente se pueda restaurar el objeto a ese estado guardado.

Componentes del Patrón

Originador (Originator): Es el objeto cuyo estado necesita ser guardado y restaurado. Se encarga de crear un objeto Memento que contiene una copia de su estado actual, y también de restaurar su estado a partir de un Memento previamente almacenado. El Originador decide qué información específica de su estado debe ser persistida.

Memento: Este componente es el responsable de almacenar el estado interno del Originador. Implementa un mecanismo de protección que impide el acceso directo desde otros objetos que no sean el Originador. El Memento proporciona dos tipos de inetrfaces: una interfaz restringida (窄接口) que el Gestor puede utilizar únicamente para almacenar y retrieve el memento, y una interfaz completa (宽接口) que permite al Originador acceder a todos los datos necesarios para la restauración.

Gestor (Caretaker): Actúa como responsable de custodiar los objetos Memento. Su único propósito es mantener el Memento de forma segura, sin realizar operaciones directas sobre su contenido ni examinarlo. El Gestor solicita al Originador la creación del Memento cuando necesita guardar un estado, y le proporciona el Memento cuando se requiere restaurar un estado anterior.

Ejemplo de Implementación

public class Originador
{
    private string datosEstado;
    public string DatosEstado 
    { 
        get { return datosEstado; }
        set { datosEstado = value; }
    }

    public Memento GenerarMemento()
    {
        return new Memento(datosEstado);
    }
    
    public void RestaurarDesdeMemento(Memento m)
    {
        datosEstado = m.ObtenerEstado();
    }
    
    public void MostrarEstado()
    {
        Console.WriteLine("Estado actual: " + datosEstado);
    }
}

public class Memento
{
    private string estadoAlmacenado;
    
    public string ObtenerEstado()
    {
        return estadoAlmacenado;
    }
    
    public Memento(string estado)
    {
        estadoAlmacenado = estado;
    }
}

public class Gestor
{
    private Memento historialEstado;
    
    public Memento Historial
    {
        get { return historialEstado; }
        set { historialEstado = value; }
    }
}

Código fuente``` Originador objeto = new Originador(); objeto.DatosEstado = "Activo"; objeto.MostrarEstado();

        Gestor manejador = new Gestor();
        manejador.Historial = objeto.GenerarMemento();

        objeto.DatosEstado = "Inactivo";
        objeto.MostrarEstado();

        objeto.RestaurarDesdeMemento(manejador.Historial);
        objeto.MostrarEstado();
        Console.Read();


Código fuente

La implementación permite encapsular todos los detalles de la información que requiere persistencia dentro de la clase Memento. Esto proporciona flexibilidad para modificar la estructura de almacenamiento sin afectar el código cliente que utiliza el patrón.

**Casos de Uso Apropiados**

El patrón Memento resulta especialmente útil cuando se requiere funcionalidad compleja con historial de estados en clases que necesitan mantener un registro de sus cambios, o cuando únicamente una fracción de las propiedades del objeto necesita ser preservada mientras el resto puede descartarse. El Originador tiene la capacidad de reconstruir cualquier estado anterior utilizando la información almacenada en el Memento correspondiente.

**Limitaciones**

Un aspecto a considerar es que el almacenamiento completo del estado del objeto en el Memento puede generar un consumo considerable de memoria, especialmente cuando los objetos contienen grandes volúmenes de datos o estructuras complejas que deben ser duplicadas para su preservación.

Etiquetas: patrones-de-diseño programación-orientada-a-objetos C# ingeniería-de-software desarrollo-de-software

Publicado el 6-27 00:48