模式描述
备忘录设计模式(Memento Design Pattern)是一种行为型设计模式,它的主要目的是在不破坏对象封装性的前提下,捕捉和保存一个对象的内部状态,以便稍后可以将对象恢复到该状态。这种模式通常用于实现撤销和重做操作。
主要角色
- 备忘录(Memorandum):保存了发起人的状态,从而能够在适当的时候恢复状态。
- 发起人(Originator):创建一个备忘录,以表示其当前状态,并可以从备忘录中恢复状态。
引用场景
- 后退/前进:浏览器的后退/前进就是缓存页面状态的典型例子。
- 撤销/重做:通常基于备忘录模式实现撤销和重做操作。
- 快照:保存某个时间点对象的状态快照。
设计要点
- 仅仅存储状态:备忘录仅存储对象的内部状态,而不是存储对象的引用。
- 完全封装:外部不会访问到备忘录类。
- 避免权限问题:发起人应该具有创建和访问备忘录的权限。
优缺点
- 轻松实现对象状态的快照和恢复
- 分离了对象与状态的保存与恢复过程
- 需要额外的空间来存储状态
与备忘录模式类似的模式
- 原型模式:对一个对象进行克隆,产生一个与原对象类似的新对象。
Java代码示例
首先,我们创建一个发起人(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();
}
}
接下来,我们创建备忘录(Memento)类,用于保存发起人的状态:
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
现在,我们创建一个负责人(Caretaker)类,用于管理备忘录:
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
最后,我们在主类中使用这些类:
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("State #1");
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());
}
}
扩展知识点
备忘录模式与命令模式(Command Pattern)可以结合使用,以实现更加强大的撤销/重做功能。命令模式可以用来记录操作的顺序和执行操作,而备忘录模式用来记录操作前后的状态。这样一来,我们可以轻松地在操作序列中向前或向后移动,同时还可以保留每个操作的上下文信息。
文章评论