设计模式(二十)——备忘录模式(Memento)
保存一个对象的某个状态,以便在适当的时候恢复对象
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
应用实例
游戏存档,ctrl+z,数据库事务
优点
-
给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
-
实现了信息的封装,使得用户不需要关心状态的保存细节
缺点
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
实现
实现游戏存档功能。
Memento类,存储在列表中的存档
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
类似游戏进程,保存游戏时将Originator转化成Memento类,不会对Originator进行任何修改
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){
this.state = memento.getState();
}
}
存储进度列表,实现读取存档功能
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public List<Memento> getMementoList() {
return mementoList;
}
public void add(Memento memento){
mementoList.add(memento);
}
public Memento get(int index){
return mementoList.get(index);
}
}
public class Main {
public static void main(String[] args) {
//相当于游戏进度
Originator originator = new Originator();
//进度的列表
CareTaker careTaker = new CareTaker();
originator.setState("状态一,游戏刚刚开始,等级3");
System.out.println(originator.getState());
//保存游戏
careTaker.add(originator.saveStateToMemento());
originator.setState("状态二,游戏运行到中期,等级20");
System.out.println(originator.getState());
//继续游戏,但是之前的状态二进度没有保存
originator.setState("状态三,游戏运行到后期,等级50");
System.out.println(originator.getState());
//保存游戏
careTaker.add(originator.saveStateToMemento());
//读取进度
originator.getStateFromMemento(careTaker.get(0));
System.out.println("读取进度,当前的进度是:"+originator.getState());
//保存的进度列表
System.out.println("\n所有保存的进度");
for (Memento memento : careTaker.getMementoList()) {
System.out.println(memento.getState());
}
}
}
运行结果:


备忘录模式旨在在不破坏对象封装性的情况下,捕获并保存对象的内部状态,以便在需要时恢复。文章通过游戏存档的例子解释了如何实现这一模式,包括Originator(原发器)和CareTaker(管理者)角色,以及Memento(备忘录)类的使用。在示例中,Originator保存和恢复其状态,CareTaker管理多个Memento实例,提供存档和读档功能。
4485

被折叠的 条评论
为什么被折叠?



