📝 备忘录模式:快速恢复原始数据 🚀
🧐 问题描述
在开发中,我们经常会遇到需要恢复对象状态的情况。传统的解决方案通常是为每个对象创建一个保存状态的对象,但这种方法不仅保存不方便,还会增加开销和对象的数量。此外,这种方式还会暴露对象的内部细节,导致代码的可维护性降低。
🎯 备忘录模式简介
备忘录模式 是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样,我们可以在需要时方便地恢复对象的状态。
主要角色
- Originator(发起人):需要保存状态的对象。
- Memento(备忘录):负责保存和记录 Originator 的内部状态。
- CareTaker(守护者):负责保存多个备忘录对象,通常使用集合进行管理。
💻 代码示例
1. 基本备忘录模式实现
Memento 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Memento {
private String state;
}
Originator 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Originator {
private String state;
// 保存状态到备忘录
public Memento saveStateMemento() {
return new Memento(state);
}
// 从备忘录恢复状态
public void getStateFromMemento(Memento mem) {
state = mem.getState();
}
}
CareTaker 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CareTaker {
private List<Memento> mementos = new ArrayList<>();
public void add(Memento mem) {
mementos.add(mem);
}
// 获取指定索引的备忘录对象
public Memento get(int index) {
return mementos.get(index);
}
}
Client 类
public class Client {
public static void main(String[] args) {
Originator ori = new Originator();
CareTaker careTaker = new CareTaker();
ori.setState("状态1");
careTaker.add(ori.saveStateMemento());
ori.setState("状态2");
careTaker.add(ori.saveStateMemento());
ori.setState("状态3");
careTaker.add(ori.saveStateMemento());
System.out.println("当前状态:" + ori.getState());
// 恢复到状态1
ori.getStateFromMemento(careTaker.get(1));
System.out.println("当前状态:" + ori.getState());
}
}
2. 游戏角色状态恢复示例
Memento 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Memento {
private int vit; // 攻击力
private int def; // 防御力
}
GameRole 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class GameRole {
private int vit;
private int def;
// 创建备忘录
public Memento createMemento() {
return new Memento(vit, def);
}
// 从备忘录恢复状态
public void recoverGameRoleMemento(Memento memento) {
this.vit = memento.getVit();
this.def = memento.getDef();
}
// 显示当前状态
public void display() {
System.out.println("当前游戏角色的属性:攻击力-" + this.vit + " 防御力-" + this.def);
}
}
Client 类
public class Client {
public static void main(String[] args) {
GameRole gameRole = new GameRole(100, 100);
System.out.println("执行之前");
gameRole.display();
CareTaker careTaker = new CareTaker();
careTaker.setMemento(gameRole.createMemento());
System.out.println("执行之后:");
gameRole.setDef(30);
gameRole.setVit(30);
gameRole.display();
System.out.println("进行恢复");
gameRole.recoverGameRoleMemento(careTaker.getMemento());
gameRole.display();
}
}
CareTaker 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CareTaker {
private Memento memento;
// 如果需要保存多个状态
// private ArrayList<Memento> mementos;
// 如果需要保存多个游戏角色的状态
// private HashMap<String, ArrayList<Memento>> rolesMementos;
}
运行结果
📌 注意事项
- 恢复机制:备忘录模式提供了一种恢复对象状态的机制,适用于需要撤销操作或回滚的场景。
- 封装性:备忘录模式对信息进行了封装,外部无需了解对象的内部细节。
- 资源占用:如果类的成员变量过多,备忘录模式可能会占用较多的资源,因此在使用时需要注意。
- 适用场景:备忘录模式适用于需要撤销操作(如
Ctrl+Z
)、后悔药、数据库事务处理、浏览器后退等场景。
🎉 总结
备忘录模式是一种非常实用的设计模式,特别适合需要频繁保存和恢复对象状态的场景。通过合理使用备忘录模式,我们可以有效提升代码的可维护性和灵活性,尤其是在前端开发中,能够帮助我们快速恢复原始数据,优化用户体验。
希望这篇博客笔记对你有所帮助!🚀