在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
应用场景
-
需要保存某个对象在某一时刻的状态。
-
外界想访问对象的状态,但是又不想直接暴露接口给外部,这时候可以将对象状态保存下来,间接的暴露给外部。
-
当你正在开发一个功能,这个功能需要存档的时候就应该想到它。例如游戏,文档编辑器等等,都需要在你下次重新打开的时候恢复到你关闭它时候的状态。
// 定义游戏Originator
public class GameOriginator {
private int currentScore;
//将需要保存的状态分装在Memento里对外提供
public GameProgressMemento saveProcess() {
return new GameProgressMemento(currentScore);
}
//通过从外部接收的Memento恢复状态
public void restoreProcess(GameProgressMemento memento) {
currentScore = memento.getScore();
}
//对内部状态的使用
public void playGame() {
System.out.println("------------------开始游戏------------------");
System.out.println("当前分数为:"+ currentScore);
System.out.println("杀死一个小怪物得1分");
currentScore++;
System.out.println(String.format("总分为:%d", currentScore));
}
public void exitGame(){
System.out.println("退出游戏");
currentScore=0;
System.out.println("-----------------退出游戏-------------------");
}
}
// 构建备忘录Memento
public class GameProgressMemento {
private int score;
public GameProgressMemento(int score) {
this.score = score;
}
public int getScore() {
return score;
}
}
// 构建CareTaker
public class GameCareTaker {
private List<GameProgressMemento> memento= new ArrayList<>();
public void saveMemento(GameProgressMemento memento) {
this.memento.add(memento);
}
public GameProgressMemento getMemento(int index) {
return this.memento.get(index);
}
}
// 客户端使用
public class MementoClient {
public void replayGame() {
GameOriginator originator = new GameOriginator();
GameCareTaker careTaker = new GameCareTaker();
//玩游戏
originator.playGame();
//保存进度
careTaker.saveMemento(originator.saveProcess());
//退出游戏
originator.exitGame();
//重新打开游戏,恢复进度
originator.restoreProcess(careTaker.getMemento(0));
originator.playGame();
}
}
// 输出结果
------------------开始游戏------------------
当前分数为:0
杀死一个小怪物得1分
总分为:1
退出游戏
-----------------退出游戏-------------------
------------------开始游戏------------------
当前分数为:1
杀死一个小怪物得1分
总分为:2
备忘录模式同原型模式混合使用。在备忘录模式中,通过定义“备忘录”来备份“发起人”的信息,而原型模式的 clone() 方法具有自备份功能,所以,如果让发起人实现 Cloneable 接口就有备份自己的功能,这时可以删除备忘录类。
class OriginatorPrototype implements Cloneable {
private String state;
public String getState() {
return state;
}
public OriginatorPrototype createMemento() {
return this.clone();
}
public void restoreMemento(OriginatorPrototype opt) {
this.setState(opt.getState());
}
}
根据以下文章总结:
-
Java设计模式:23种设计模式全面解析(超级详细)HYPERLINK http://c.biancheng.net/design_pattern/
-
设计模式 https://blog.csdn.net/shusheng0007/category_8638565.html
-
java设计模式 https://blog.csdn.net/qq_37909508/category_8976362.html
-
设计模式 https://www.cnblogs.com/zuoxiaolong/category/509144.html
-
设计模式 在源码中的应用 https://blog.csdn.net/qq_36970993/category_10620886.html
-
Android系统设计中存在设计模式分析 https://www.2cto.com/kf/201208/150650.html
-
Android设计模式系列 - 基于android的各种代码分析各种设计模式 https://www.cnblogs.com/qianxudetianxia/category/312863.html