设计模式-备忘录模式
备忘录模式
在一些有关卡的游戏中,总会有一些存档的操作,这就可以通过备忘录模式来对该状态进行存储;又或者说这是世界上买不到的药后悔药
。
主要解决:在不破坏封装的前提下,捕获对象的一个内部状态,并在对象外对这个状态进行保存,方便以后恢复到该状态。
所属类型:行为型模式
如何解决:通过一个备忘录类专门存储状态信息
关键代码:客户不与备忘录耦合,与备忘录管理类耦合
优点:1、提供了容易实现的恢复能力;2、保持关键对象的数据封装;3、将被存储的状态放在外面,不要和关键对象混在一起,还可以帮忙维护内聚
缺点:消耗资源,如果要进行存储的存档
过多,那么就会耗费大量资源。这可能就是为什么有的游戏会对存档的数量进行限制的原因把。
这个就是备忘录模式中要存储的存档
,这个存档
中保存着备忘录
中的数据。
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
Originator这里相当于是作为存档和备忘录的一个中转站把,通过Originator对象能够很好地对备忘录中的状态信息进行存储,而无需每次都创建一个新的对象,只有在存档时才进行Memento
对象的创建。
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
这里是备忘录模式的核心,这里通过了一个ArrayList
来实现了所谓的备忘录
,通过这个ArrayList
来对状态信息进行记录。
public class CareTaker {
private ArrayList<Memento> mementos = new ArrayList<>();
public void add(Memento state){
mementos.add(state);
}
public Memento get(int index){
return mementos.get(index);
}
}
接下来对备忘录模式进行运行。originator用来记录对应的状态,careTaker负责对状态进行存档
,这里对第一次的状态和第四次的状态进行存储,所以备忘录
里面就存储了两条记录。
public class MementoDemo {
public static void main(String[] args) {
CareTaker careTaker = new CareTaker();
Originator originator = new Originator();
originator.setState("State #1");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #2");
originator.setState("State #3");
originator.setState("State #4");
careTaker.add(originator.saveStateToMemento());
System.out.println(careTaker.get(0).getState());
System.out.println(careTaker.get(1).getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println(originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println(originator.getState());
}
}
运行结果如下所示:
State #1
State #4
State #1
State #4
Tips
简单进行一次总结,备忘录模式
能够帮助我们对数据进行存储,方便进行数据的恢复等相关操作,真正实现了有后悔药可吃
。但是在进行存储存档
时需要注意内存的消耗问题,要尽量减少对资源的耗费问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!