但是在我们手指下的程序世界里,却有后悔药买。我们讲的备忘录模式就是程序世界里的“月光宝盒”。
一、什么是备忘录模式
二、为什么使用备忘录模式
三、备忘录模式适用场景
有很多备忘录模式的应用,知识我们已经见过,却没有细想这是备忘录模式的。
- 代码实例
- 生活实例
四、备忘录组成部分
- 备忘录(Memento)角色
- 备忘录(Originator)发起角色
- 备忘录管理者(Caretaker)角色
五、代码示例
- 备忘录角色(Memento)角色
public class Game {
// 生命
private int life = 0;
// 魔法
private int magic = 0;
// 游戏存档方法
public GameState save () {
return new GameState(this);
}
// 读档
public void load (GameState gameState) {
gameState.getState(this);
}
public Game (int life,int magic) {
this.life = life;
this.magic = magic;
}
public void action (int dLife, int dMana) {
this.life += dLife;
this.magic += dMana;
}
public void output() {
System.out.println("生命" + life + ",魔法" + magic);
}
public int getLife() {
return life;
}
public void setLife(int life) {
this.life = life;
}
public int getMagic() {
return magic;
}
public void setMagic(int magic) {
this.magic = magic;
}
}
- 备忘录角色(Memento)角色
public class GameState {
// 生命
private int life = 0;
// 魔法
private int magic = 0;
public GameState (Game game) {
life = game.getLife();
magic = game.getMagic();
}
public void setState(Game game) {
life = game.getLife();
magic = game.getMagic();
}
public void getState(Game game) {
game.setLife(life);
game.setMagic(magic);
}
}
- 备忘录管理者(Caretaker)角色
public class StateManager {
private GameState g1;
private GameState g2;
public void setG1(GameState gameState1) {
this.g1 = gameState1;
}
public GameState getG1() {
return g1;
}
public void setG2(GameState gameState2) {
this.g2 = gameState2;
}
public GameState getG2() {
return g2;
}
}
- 测试类
public class Test {
public static void main(String[] args) {
Game game = new Game(100, 100);
StateManager stateManager = new StateManager();
// 此时状态 生命100,魔法100
game.output();
// 保存状态1 生命100,魔法100
stateManager.setG1(game.save());
game.action(-100, -100);
// 此时状态 生命0,魔法0
game.output();
// 保存状态2 生命0,魔法0
stateManager.setG2(game.save());
// 读取状态1 生命100,魔法100
game.load(stateManager.getG1());
// 此时状态 生命100,魔法100
game.output();
// 读取状态2 生命0,魔法0
game.load(stateManager.getG2());
// 此时状态 生命0,魔法0
game.output();
}
}