🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Memento
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

El patrón Memento

Descripción

El patrón Memento tiene como objetivo salvaguardar y restablecer el estado de un objeto sin violar la encapsulación.

Ejemplo

Durante la compra online de un vehículo nuevo, el cliente puede seleccionar opciones suplementarias que se agregarán a su carrito de la compra. No obstante, existen opciones incompatibles como, por ejemplo, asientos deportivos frente a asientos en cuero o reclinables.

La consecuencia de esta incompatibilidad es que si se han seleccionado asientos reclinables y a continuación se elijen asientos en cuero, la opción de los asientos reclinables se elimina del carrito de la compra.

Queremos incluir una opción para poder anular la última operación realizada en el vehículo. Suprimir la última opción agregada no es suficiente puesto que es necesario también restablecer las opciones presentes y que se han eliminado debido a la incompatibilidad. Una solución consiste en memorizar el estado del carrito de la compra antes de agregar la nueva opción.

Además, deseamos ampliar este comportamiento para gestionar un histórico de los estados del carrito de la compra y poder volver a cualquier estado anterior. Es preciso entonces, en este caso, memorizar todos los estados sucesivos del vehículo.

Para preservar la encapsulación del objeto que representa el carrito de la compra, una solución consistiría en memorizar estos estados intermedios en el propio carrito. No obstante esta solución tendría como efecto un aumento inútil...

Estructura

1. Diagrama de clases

La figura 4-7.2 detalla la estructura genérica del patrón.

images/figure23-2.png

Figura 4-7.2 - Estructura del patrón Memento

2. Participantes

Los participantes del patrón son los siguientes:

  • Memento es la clase de los mementos que son los objetos que memorizan el estado interno de los objetos originales (o una parte de este estado). El memento posee dos interfaces: una interfaz completa destinada a los objetos originales que ofrece la posibilidad de memorizar y de restaurar su estado y una interfaz reducida para los objetos de gestión del estado que no tienen permisos para acceder al estado interno de los objetos originales.

  • ObjetoOriginal (CarritoOpciones) es la clase de los objetos que crean un memento para memorizar su estado interno y que pueden restaurarlo a partir de un memento.

  • GestiónEstado es el responsable de la gestión de los mementos y no accede al estado interno de los objetos originales.

3. Colaboraciones

Una instancia de GestiónEstado solicita un memento al objeto original llamando al método creaMemento, lo salvaguarda y en caso de necesitar su anulación y retornar al estado memorizado en el memento, lo transmite de nuevo al objeto original mediante el método setMemento.

Dominios de aplicación

El patrón se utiliza en el caso en que el estado interno de un objeto debe memorizarse (total o parcialmente) para poder ser restaurado posteriormente sin que la encapsulación de este objeto quede fragmentada.

Ejemplo en C#

Comenzamos presentando este ejemplo escrito en C# con el memento. Éste está descrito por la interfaz Memento y la clase MementoImpl. La clase incluye la propiedad estado cuya invocación está reservada al carrito de la compra. La interfaz está vacía, de modo que sólo sirve para determinar un tipo para los demás objetos que deben referenciar el memento sin poder acceder a la propiedad estado.

El memento almacena el estado del carrito de opciones, a saber una lista que está constituida por un duplicado de la lista de opciones del carrito.

public interface Memento 
{ 
} 
 
 
using System.Collections.Generic; 
 
public class MementoImpl : Memento 
{ 
    protected IList<OpcionVehiculo> opciones = 
        new List<OpcionVehiculo>(); 
 
    public IList<OpcionVehiculo> estado 
    { 
        get 
        { 
            return opciones; 
        } 
        set 
        { 
            this.opciones.Clear(); 
            foreach (OpcionVehiculo opcion in value) 
                this.opciones.Add(opcion); 
        } ...