Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. 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 Java
  3. El patrón Memento
Extrait - Patrones de diseño en Java Los 23 modelos de diseño: descripciónes y soluciónes ilustradas en UML 2 y Java [3ª edición]
Extractos del libro
Patrones de diseño en Java Los 23 modelos de diseño: descripciónes y soluciónes ilustradas en UML 2 y Java [3ª 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 eligen 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 en la complejidad...

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 Java

Comenzamos presentando este ejemplo escrito en Java con el memento. Éste está descrito por la interfaz Memento y la clase MementoImpl. La clase incluye los métodos getEstado y setEstado 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 los métodos getEstado y setEstado.

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  
{  
}  
  
import java.util.ArrayList;  
import java.util.List;  
public class MementoImpl implements Memento  
{  
    protected List<OpcionVehiculo> opciones =  
        new ArrayList<OpcionVehiculo>();  
  
    public void setEstado(List<OpcionVehiculo> opciones)  
    {  
        this.opciones.clear();  
        this.opciones.addAll(opciones);  
    }  
    public List<OpcionVehiculo> getEstado()  
    {  
        return opciones;  
    }  
} 

La clase CarritoOpciones describe el carrito. El método agregaOpcion consiste en suprimir aquellas opciones incompatibles con la nueva opción antes de agregarla. Este método crea un nuevo memento que recibe...