Patrón de diseño de recuerdo

El patrón Memento es un patrón de diseño de comportamiento. El patrón Memento se utiliza para restaurar el estado de un objeto a un estado anterior. A medida que su aplicación avanza, es posible que desee guardar los puntos de control en su aplicación y restaurar esos puntos de control más tarde.

Patrón de diseño de recuerdo de diagrama UML

Memento-Diagram

Componentes de diseño

  • originador: el objeto para el que se va a guardar el estado. Crea el memento y lo usa en el futuro para deshacer.
  • memento : el objeto que va a mantener el estado de originador. Es solo un POJO.
  • cuidador: el objeto que realiza un seguimiento de múltiples recuerdos. Como mantener puntos de guardado.

A un Guardián le gustaría realizar una operación en el Originador mientras tiene la posibilidad de retroceder. El cuidador llama al método createMemento() en el creador y le pide que le pase un objeto de recuerdo. En este punto, el creador crea un objeto de recuerdo guardando su estado interno y pasa el recuerdo al cuidador. El cuidador mantiene el objeto de recuerdo y realiza la operación. En caso de que sea necesario deshacer la operación, el cuidador llama al método setMemento() en el creador que pasa el objeto de recuerdo mantenido. El creador aceptaría el recuerdo, usándolo para restaurar su estado anterior.

Veamos un ejemplo del patrón de diseño Memento.

import java.util.List;
import java.util.ArrayList;
  
class Life
{
    private String time;
   
    public void set(String time) 
    {
        System.out.println("Setting time to " + time);
        this.time = time;
    }
   
    public Memento saveToMemento() 
    {
        System.out.println("Saving time to Memento");
        return new Memento(time);
    }
   
    public void restoreFromMemento(Memento memento) 
    {
        time = memento.getSavedTime();
        System.out.println("Time restored from Memento: " + time);
    }
   
    public static class Memento 
    {
        private final String time;
   
        public Memento(String timeToSave) 
        {
            time = timeToSave;
        }
   
        public String getSavedTime() 
        {
            return time;
        }
    }
}
  
class Design 
{
      
    public static void main(String[] args) 
    {
          
        List<Life.Memento> savedTimes = new ArrayList<Life.Memento>();
   
        Life life = new Life();
   
        //time travel and record the eras
        life.set("1000 B.C.");
        savedTimes.add(life.saveToMemento());
        life.set("1000 A.D.");
        savedTimes.add(life.saveToMemento());
        life.set("2000 A.D.");
        savedTimes.add(life.saveToMemento());
        life.set("4000 A.D.");
   
        life.restoreFromMemento(savedTimes.get(0));   
   
    }
}

Producción:

Setting time to 1000 B.C.
Saving time to Memento
Setting time to 1000 A.D.
Saving time to Memento
Setting time to 2000 A.D.
Saving time to Memento
Setting time to 4000 A.D.
Time restored from Memento: 1000 B.C.

Ventaja

  • Podemos usar la serialización para lograr una implementación de patrón de recuerdo que sea más genérica que el patrón de recuerdo, en el que cada objeto debe tener su propia implementación de clase de recuerdo.

Desventaja

  • Si el objeto Originator es muy grande, el tamaño del objeto Memento también será enorme y usará mucha memoria.

Lectura adicional: método Memento en Python

Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *