主要用来保存对象状态,并提供恢复机制。
import java.util.Stack;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Caretaker ct = new Caretaker();
Originator originator = new Originator();
System.out.println("操作1");
originator.setState("操作1");
ct.addMemento(originator.createMemento());
// 不要写成ct.addMemento(new Memento(originator));, 即不能让客户端感知道备忘录对象的存在
System.out.println("操作2");
originator.setState("操作2");
ct.addMemento(originator.createMemento());
System.out.println("操作3");
originator.setState("操作3");
ct.addMemento(originator.createMemento());
System.out.println("操作4");
originator.setState("操作4");
ct.addMemento(originator.createMemento());
originator.restoreMemento(ct.getMemento());
System.out.println("恢复到:" + originator.getState());
originator.restoreMemento(ct.getMemento());
System.out.println("恢复到:" + originator.getState());
originator.restoreMemento(ct.getMemento());
System.out.println("恢复到:" + originator.getState());
originator.restoreMemento(ct.getMemento());
System.out.println("恢复到:" + originator.getState());
originator.restoreMemento(ct.getMemento());
System.out.println("恢复到:" + originator.getState());
originator.restoreMemento(ct.getMemento());
System.out.println("恢复到:" + originator.getState());
}
}
// 被备份的对象
class Originator {
private String state;
public Originator () {
}
public Memento createMemento () {
return new Memento(this);
}
public void restoreMemento(Memento memento) {
if (memento == null) {
System.out.println("已恢复到尽头。。。");
return;
}
this.state = memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
// 备忘录
class Memento {
private String state;
// 把对象的状态保存到备忘录
public Memento (Originator originator) {
setState(originator.getState());
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
// 备忘录容器
class Caretaker {
private static final int MAX_SIZE = 1000;
private Stack<Memento> stack = new Stack<Memento>();
public void addMemento (Memento memento) {
if (stack.size() > MAX_SIZE) {
return; // No more memento
}
stack.push(memento);
}
public Memento getMemento () {
if (stack.isEmpty()) {
return null;
}
return stack.pop();
}
}
输出:
操作1
操作2
操作3
操作4
恢复到:操作4
恢复到:操作3
恢复到:操作2
恢复到:操作1
已恢复到尽头。。。
恢复到:操作1 // 最后一次恢复的状态
已恢复到尽头。。。
恢复到:操作1