📜  纪念品设计模式

📅  最后修改于: 2021-09-10 02:52:14             🧑  作者: Mango

备忘录模式是一种行为设计模式。备忘录模式用于将对象的状态恢复到以前的状态。随着您的应用程序的进展,您可能希望在应用程序中保存检查点,并在以后恢复到这些检查点。

UML 图纪念品设计模式

记忆图

设计组件

  • originator :要为其保存状态的对象。它创建纪念品并在将来使用它来撤消。
  • memento :将要维护发起者状态的对象。它只是一个POJO。
  • caretaker :跟踪多个纪念品的对象。就像维护保存点一样。

看护人想同时具有回滚可能性对始发执行操作。看守者在发起者上调用 createMemento()方法,要求发起者向它传递一个纪念品对象。此时,发起者创建了一个保存其内部状态的纪念品对象,并将该纪念品传递给看守者。看守人维护备忘录对象并执行操作。在需要撤消操作的情况下,看守者在传递维护的备忘录对象的发起者上调用 setMemento() 方法。发起者将接受纪念品,用它来恢复其先前的状态。

让我们看一个 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 savedTimes = new ArrayList();
   
        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));   
   
    }
}

输出:

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.

优势

  • 我们可以使用序列化来实现更通用的备忘录模式实现,而不是每个对象都需要拥有自己的备忘录类实现的备忘录模式。

坏处

  • 如果 Originator 对象非常大,那么 Memento 对象也将非常大并使用大量内存。