备忘录(Memento)模式是一种用于实现对象状态保存和恢复的设计模式,它可以实现对象状态的快照、历史记录等功能。
什么是备忘录模式
备忘录模式其主要思想是在不破坏封装性的前提下,保存对象的内部状态,从而可以在不影响对象本身的情况下,实现对象状态的保存、恢复、历史记录等功能。备忘录模式主要分为三个角色:发起人(Originator)、备忘录(Memento)和负责人(Caretaker)。
备忘录模式的使用场景
备忘录模式通常应用于需要实现对象状态的历史记录、撤销功能等领域,例如文本编辑器的历史记录功能、游戏中的存档系统等。
备忘录模式的代码示例
// 定义备忘录类
class Memento {
private String state; // 用于保存状态信息
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
// 定义发起人类
class Originator {
private String state;
// 保存状态
public void setState(String state) {
this.state = state;
}
// 加载状态
public String getState() {
return state;
}
// 创建备忘录
public Memento createMemento() {
return new Memento(state);
}
// 恢复备忘录
public void restoreMemento(Memento memento) {
this.state = memento.getState();
}
}
// 定义负责人类
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);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 创建发起人
Originator originator = new Originator();
// 创建负责人
Caretaker caretaker = new Caretaker();
// 设置发起人初始状态
originator.setState("状态1");
// 保存当前状态
caretaker.add(originator.createMemento());
// 更新状态
originator.setState("状态2");
// 保存当前状态
caretaker.add(originator.createMemento());
// 更新状态
originator.setState("状态3");
// 保存当前状态
caretaker.add(originator.createMemento());
// 恢复状态
originator.restoreMemento(caretaker.get(0));
System.out.println("恢复后的状态:" + originator.getState());
// 恢复状态
originator.restoreMemento(caretaker.get(1));
System.out.println("恢复后的状态:" + originator.getState());
// 恢复状态
originator.restoreMemento(caretaker.get(2));
System.out.println("恢复后的状态:" + originator.getState());
}
}
以上是一个基本的备忘录设计模式的代码示例,其中 Memento 类负责保存发起人 Originator 的状态;Originator 负责创建备忘录和恢复状态;Caretaker 负责保存和获取备忘录。
在客户端代码中,我们通过频繁修改 Originator 对象的状态,然后通过 createMemento 方法保存状态,并将备忘录对象添加到 Caretaker 中,这样就可以实现备忘录模式。最后,我们通过恢复操作将状态恢复到备忘录中所保存的状态。
以上代码的结果为:
恢复后的状态:状态1
恢复后的状态:状态2
恢复后的状态:状态3
可以看到,我们将 Originator 对象的状态从 “状态1” 到 “状态2” 再到 “状态3” 进行了多次修改,并将每次的状态保存到备忘录中。在恢复状态时,我们从 Caretaker 中获取备忘录对象,并调用 Originator 的 restoreMemento 方法将状态恢复到对应备忘录中所保存的状态。
因此,客户端运行结果按顺序输出了三个状态的恢复结果,分别为 “状态1”、“状态2” 和 “状态3”。
这个示例虽然简单,但是比较清晰地展示了备忘录模式的核心思想。备忘录模式适用于保存对象历史记录、提供恢复数据的场合,具有很好的扩展性和灵活性,是一个很好的设计模式。
备忘录模式的实际应用
-
Java中的UndoManager:Java中的UndoManager类是用来管理撤销、恢复操作的类,实现了备忘录模式,它利用了栈来保存Commands操作,利用了备忘录模式中的保存历史状态等功能。
-
Android中的onSaveInstanceState/onRestoreInstanceState:在Android平台中,通过实现 onSaveInstanceState/onRestoreInstanceState 方法,可以保存和恢复Activity的状态信息,并且随时取出相关数据。这个功能也是基于备忘录模式实现的。
总结
备忘录模式是一种用于实现对象状态保存和恢复的设计模式,它可以在不破坏对象封装性的前提下,将对象状态保存到备忘录对象中。备忘录模式适用于需要实现对象历史记录、撤销操作等功能的场景。该模式的核心是备忘录类,用于保存对象状态;发起人类则是保存和恢复状态的对象;负责人类则是负责管理备忘录对象。备忘录模式具有很好的扩展性,可以通过继承和实现接口来增加功能,同时也可以与其他模式进行结合使用。
关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩💻👨💻!