备忘录模式
目录
1.核心思想
个人理解
2.成员
3.优点
4.代码实现
4.1 备忘录
4.2 发起人
4.3 看护者
4.4 测试类
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()); // 打印恢复后的状态}
}