简介
备忘录模式是行为型模式模式的一种,其核心就是将对象的状态存储起来,以便在需要的时候恢复。在备忘录模式中,有Memento/Originator/CareTaker,其中Memento包含了对象的状态,Originator在Memento对象中存储状态,CareTaker负责恢复状态。在我们编写word时,经常使用Ctrl+Z和Ctrl+Y来实现redo和undo操作,下面就以这个例子来Demo示例。PS:在真正开发中,一般时使用备忘录模式+命令模式来实现redo和undo的操作。
Demo示例
1.首先定义Memento:
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getMementoState() {
return this.state;
}
}
2.定义Originator
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public Memento save() {
return new Memento(this.state);
}
}
3.定义CareTaker,里面实现了undo/redo功能
import java.util.Stack;
public class CareTaker {
private Stack<Memento> forward = new Stack<>();
private Stack<Memento> back = new Stack<>();
public void addMemento(Memento state) {
back.clear();
forward.push(state);
}
public Memento undo() {
if (forward.empty()) {
return new Memento(null);
}
if (forward.size() == 1) {
return forward.peek();
}
back.push(forward.pop());
return forward.peek();
}
public Memento redo() {
if (back.empty()) {
if (forward.empty()) {
return new Memento(null);
}
return forward.peek();
}
forward.push(back.pop());
return forward.peek();
}
public Memento getLastMemento() {
return forward.lastElement();
}
}
4.客户端测试调用
public class Test {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("state 1");
careTaker.addMemento(originator.save());
originator.setState("state 2");
careTaker.addMemento(originator.save());
originator.setState("state 3");
careTaker.addMemento(originator.save());
System.out.println(careTaker.undo().getMementoState()); // state 2
System.out.println(careTaker.undo().getMementoState()); // state 1
System.out.println(careTaker.undo().getMementoState()); // state 1
System.out.println(careTaker.redo().getMementoState()); // state 2
System.out.println(careTaker.redo().getMementoState()); // state 3
System.out.println(careTaker.redo().getMementoState()); // state 3
originator.setState("new state3");
careTaker.addMemento(originator.save());
System.out.println(careTaker.getLastMemento().getMementoState()); // new state3
}
}