简介
保存一个对象的状态,以便在需要的时候来恢复它,可以理解为回滚,备忘录主要将其内部状态保存为memento对象,再从memento对象恢复到以前的状态,该模式属于行为型。
适用场景
1、保存及恢复数据相关业务场景
2、对象的内部状态应该保存在外部,以便稍后可以将对象恢复到此状态
3、不能违反对象的封装
优点
1、为用户提供一种可恢复机制
2、存档信息的封装
缺点
1、资源占有
代码示例
游戏类,saveToMemento保存游戏数据到memento对象中,restoreFromMemento从memento对象中恢复数据到game对象中。
public class Game {
private int level;
private int progress;
public Game(int level, int progress) {
this.level = level;
this.progress = progress;
}
public GameMemento saveToMemento(){
System.out.println("当前等级到"+level+",当前进度:"+progress);
return new GameMemento(level,progress);
}
public void restoreFromMemento(GameMemento gameMemento){
this.level = gameMemento.getLevel();
this.progress = gameMemento.getProgress();
System.out.println("恢复等级到"+this.level+",恢复进度:"+this.progress);
}
}
游戏备忘录类
public class GameMemento {
private int level;
private int progress;
public GameMemento(int level, int progress) {
this.level = level;
this.progress = progress;
}
public int getLevel() {
return level;
}
public int getProgress() {
return progress;
}
}
游戏管理类
public class GameManage {
private static Stack<GameMemento> stack = new Stack<>();
public void addMemento(GameMemento gameMemento){
stack.push(gameMemento);
}
public GameMemento getGameMemento(){
return stack.pop();
}
}
测试类
public class MementoTest {
public static void main(String[] args) {
Game game = new Game(1,2);
Game game2 = new Game(2,3);
GameManage gameManage = new GameManage();
gameManage.addMemento(game.saveToMemento());
gameManage.addMemento(game2.saveToMemento());
game.restoreFromMemento(gameManage.getGameMemento());
game2.restoreFromMemento(gameManage.getGameMemento());
}
}
输出结果为:
当前等级到1,当前进度:2
当前等级到2,当前进度:3
恢复等级到2,恢复进度:3
恢复等级到1,恢复进度:2
源码分析
spring中应用
在webflow包下,StateManageableMessageContext
中使用了备忘录模式,
DefaultMessageContext
是StateManageableMessageContext
的子类,
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载