import java.util.Stack;
// 备忘录类
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;
System.out.println("State set to: " + state);
}
public String getState() {
return state;
}
// 创建备忘录
public Memento saveStateToMemento() {
return new Memento(state);
}
// 从备忘录恢复状态
public void getStateFromMemento(Memento memento) {
state = memento.getState();
System.out.println("State restored to: " + state);
}
}
// 管理者类
class Caretaker {
private Stack<Memento> undoStack = new Stack<>();
private Stack<Memento> redoStack = new Stack<>();
public void saveState(Memento memento) {
undoStack.push(memento);
redoStack.clear(); // 每次保存新状态时清空重做栈
}
public Memento undo() {
if (!undoStack.isEmpty()) {
Memento memento = undoStack.pop();
redoStack.push(memento);
return memento;
}
return null;
}
public Memento redo() {
if (!redoStack.isEmpty()) {
Memento memento = redoStack.pop();
undoStack.push(memento);
return memento;
}
return null;
}
}
// 测试类
public class MementoWithStack {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("State #1");
caretaker.saveState(originator.saveStateToMemento());
originator.setState("State #2");
caretaker.saveState(originator.saveStateToMemento());
originator.setState("State #3");
caretaker.saveState(originator.saveStateToMemento());
// 撤销操作
originator.getStateFromMemento(caretaker.undo()); // 回到 State #2
originator.getStateFromMemento(caretaker.undo()); // 回到 State #1
// 重做操作
originator.getStateFromMemento(caretaker.redo()); // 回到 State #2
}
}