目录
1.核心思想
不用知道对象内部,实现对象的保存和删除后的恢复
个人理解
结合栈或者队列,去达到获取某一个特定位置的元素,换成备忘录模式,就是获取某一个阶段的对象状态
2.成员
Originator(发起人):负责创建一个备忘录对象,用于保存当前的内部状态。它也可以使用备忘录对象来恢复之前的状态。
Memento(备忘录):用于存储发起人的内部状态。备忘录对象不暴露任何关于发起人状态的具体实现细节。
Caretaker(看护者):负责保存备忘录对象。看护者无法对备忘录的内容进行修改,只能存取备忘录对象。
3.优点
封装内部状态:
备忘录模式通过备忘录对象封装了对象的内部状态,保护了对象的内部结构和实现细节。这样,外部代码无需了解对象的内部状态即可保存和恢复对象的状态。
支持状态恢复:
该模式允许对象在特定时间点保存其状态,并能够在需要时恢复到这些保存的状态。这对于实现“撤销”和“恢复”功能非常有用,例如文本编辑器中的撤销操作,或者游戏中的存档和恢复功能。
分离状态管理:
备忘录模式将状态的保存和恢复从对象的业务逻辑中分离出来,使得对象可以专注于自身的核心功能,而看护者类负责管理状态的保存和恢复。这种分离提高了代码的可维护性和可读性。
历史记录管理:
看护者类可以保存多个备忘录对象,从而管理对象的历史状态。这样可以实现对对象状态的历史回溯,支持复杂的撤销和重做操作。
4.代码实现
4.1 备忘录
//备忘录类
public class Memento {
private final String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
4.2 发起人
//发起人
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();
}
}
4.3 看护者
//看护者
public class Caretaker {
private final Stack<Memento> mementoStack = new Stack<>();
public void saveMemento(Memento memento) {
mementoStack.push(memento);
}
public Memento getLastMemento() {
return mementoStack.pop();
}
}
4.4 测试类
public class Test {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 设置初始状态并保存
originator.setState("状态 #1");
caretaker.saveMemento(originator.saveStateToMemento());
// 修改状态并保存
originator.setState("状态 #2");
caretaker.saveMemento(originator.saveStateToMemento());
// 再次修改状态
originator.setState("状态 #3");
System.out.println("当前状态: " + originator.getState()); // 打印当前状态
// 从备忘录中恢复到上一个状态
originator.getStateFromMemento(caretaker.getLastMemento());
System.out.println("恢复到: " + originator.getState()); // 打印恢复后的状态
// 从备忘录中恢复到之前的状态
originator.getStateFromMemento(caretaker.getLastMemento());
System.out.println("恢复到: " + originator.getState()); // 打印恢复后的状态
}
}