备忘录模式用于在不侵入原对象的情况下保存和回复对象状态。主要组成有原生类Originator,备忘录类Mementor,备忘录管理类CareTaker. Mementor负责记录Originator,CareTaker持有Mementor的引用,负责备忘录状态的管理。下面以一个可撤销的加减计算器为例说明备忘录模式。为了满足计算器类Calculator(相当于Originator)的功能完备性,Calculator对象持有了一个CareTaker对象的引用,这在标准的备忘录模式中是没有的。
原生类:Calculator.java,支持加减运算和撤销操作。
public class Calculator {
private int val;
private CareTaker careTaker;
public Calculator(int val) {
this.val = val;
this.careTaker = new CareTaker();
System.out.println("Initiate value to " + val);
save();
}
public void add(int addi) {
System.out.println(val + " + " + addi + " = " + (val + addi));
val += addi;
save();
}
public void subtract(int addi) {
System.out.println(val + " - " + addi + " = " + (val - addi));
val -= addi;
save();
}
private void save() {
careTaker.addMemento(new Memento(val));
}
public void undo() {
val = careTaker.popMemento().getState();
System.out.println("State restored to " + val);
}
}
备忘录类:Memento.java
public class Memento {
private int state;
public Memento(int state) {
this.state = state;
}
public int getState() {
return state;
}
}
备忘录管理类:CareTaker.java
import java.util.LinkedList;
public class CareTaker {
private LinkedList<Memento> mementoList;
public CareTaker() {
mementoList = new LinkedList<>();
}
public void addMemento(Memento memento) {
mementoList.add(memento);
}
public Memento popMemento() {
mementoList.removeLast();
return mementoList.getLast();
}
}
驱动类:Main.java,执行了一系列运算和撤销操作。
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator(0); // Initiate value to 0
cal.add(1); // 0 + 1 = 1
cal.add(2); // 1 + 2 = 3
cal.subtract(4); // 3 - 4 = -1
cal.subtract(5); // -1 - 5 = -6
cal.undo(); // State restored to -1
cal.add(7); // -1 + 7 = 6
cal.undo(); // State restored to -1
cal.undo(); // State restored to 3
cal.add(10); // 3 + 10 = 13
}
}