备忘录模式的定义是“在不违反封装的情况下,将对象恢复到之前的状态”。这种情况在发生错误或失败时非常有用。

备忘录模式也被称为Token

撤销(Undo)或回退(Backspace)或Ctrl+Z是编辑器中最常用的操作之一。备忘录设计模式用于实现撤销操作。这是通过在对象改变状态时保存其当前状态来完成的。

优点:

  • 它保持了封装边界。
  • 它简化了发起者。

使用场景:

  • 它用于大多数软件中的撤销和重做操作。
  • 它也用于数据库事务。

备忘录模式的UML:

6-1.png

备忘录:

  • 存储发起者对象的内部状态。状态可以包括任意数量的状态变量。
  • 备忘录必须有两个接口,一个是给管理者的接口。这个接口不允许任何操作或访问备忘录存储的内部状态,从而维护封装。另一个接口是给发起者的,它允许发起者访问恢复先前状态所需的任何状态变量。

发起者(Originator):

  • 创建一个备忘录对象,该对象将捕获发起者的内部状态。
  • 使用备忘录对象恢复其之前的状态。

管理者(Caretaker):

  • 负责保存备忘录。
  • 备忘录对管理者是透明的,管理者不得对其进行操作。

备忘录模式的实现:

步骤 1:

创建一个Originator类,该类将使用备忘录对象恢复其之前的状态。

// 这是一个类
public class Originator { 
    private String state; 
    
    public void setState(String state) { 
        this.state = state; 
    } 
    
    public String getState() { 
        return state; 
    } 
    
    public Memento saveStateToMemento() { 
        return new Memento(state); 
    } 
    
    public void getStateFromMemento(Memento memento) { 
        state = memento.getState(); 
    } 
}

步骤 2:

创建一个Memento类,该类将存储发起者对象的内部状态。

// 这是一个类
public class Memento { 
    private String state; 
    
    public Memento(String state) { 
        this.state = state; 
    } 
    
    public String getState() { 
        return state; 
    } 
}

步骤 3:

创建一个Caretaker类,该类负责保存备忘录。

// 这是一个类
import java.util.ArrayList; 
import java.util.List; 

public class Caretaker { 
    private List<Memento> mementoList = new ArrayList<Memento>(); 
    
    public void add(Memento state) { 
        mementoList.add(state); 
    } 
    
    public Memento get(int index) { 
        return mementoList.get(index); 
    } 
}

步骤 4:

创建一个MementoPatternDemo类。

// 这是一个类
public class MementoPatternDemo { 
    public static void main(String[] args) { 
        Originator originator = new Originator(); 
        Caretaker careTaker = new Caretaker(); 
        
        originator.setState("State #1"); 
        careTaker.add(originator.saveStateToMemento()); 
        originator.setState("State #2"); 
        careTaker.add(originator.saveStateToMemento()); 
        originator.setState("State #3"); 
        careTaker.add(originator.saveStateToMemento()); 
        originator.setState("State #4"); 

        System.out.println("Current State: " + originator.getState());     
        originator.getStateFromMemento(careTaker.get(0)); 
        System.out.println("First saved State: " + originator.getState()); 
        originator.getStateFromMemento(careTaker.get(1)); 
        System.out.println("Second saved State: " + originator.getState()); 
        originator.getStateFromMemento(careTaker.get(2)); 
        System.out.println("Third saved State: " + originator.getState()); 
    } 
}

输出:

Current State: State #4
First saved State: State #1
Second saved State: State #2
Third saved State: State #3

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式