定义
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
- 它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。
- 实现了信息的封装,不需要关心状态的保存细节。
- 缺点:消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
备忘录模式的角色
- originator : 对象(需要保存状态的对象)
- Memento : 备忘录对象,负责保存好记录,即Originator内部状态
- Caretaker: 守护者对象,负责保存多个备忘录对象, 使用集合管理,提高效率
- 说明:如果希望保存多个originator对象的不同时间的状态,也可以,只需要要 HashMap <String, 集合>
代码
- 示例:游戏状态保存
package com.example.demo;
public class test16 {
public static void main(String[] args) {
Game game =new Game();
System.out.println("游戏开始,打到了第五关");
game.setPlayerOffSeveral(5);
System.out.println("备份一下");
GameMemento gameMemento = game.createGameMemento();
Caretaker caretaker = new Caretaker();
caretaker.saveMemento(gameMemento);
System.out.println("备份完成");
game.play();
System.out.println("重新开始:"+game.getPlayerOffSeveral());
game.restore(caretaker.retrieveMemento());
System.out.println("恢复完成:"+game.getPlayerOffSeveral());
}
}
class GameMemento {
//玩家的关数
private int playerOffSeveral;
/**
* 备份游戏
*
* @return
*/
public GameMemento(int playerOffSeveral) {
this.playerOffSeveral = playerOffSeveral;
}
public int getPlayerOffSeveral() {
return playerOffSeveral;
}
public void setPlayerOffSeveral(int playerOffSeveral) {
this.playerOffSeveral = playerOffSeveral;
}
}
class Game {
//玩家的关数
private int playerOffSeveral;
public int getPlayerOffSeveral() {
return playerOffSeveral;
}
public void setPlayerOffSeveral(int playerOffSeveral) {
this.playerOffSeveral = playerOffSeveral;
}
/**
* 备份
*/
public GameMemento createGameMemento() {
return new GameMemento(playerOffSeveral);
}
/**
* 开始游戏
*/
public void play() {
playerOffSeveral = 0;
}
/**
* 恢复备份
*
* @param gameMemento
*/
public void restore(GameMemento gameMemento) {
playerOffSeveral = gameMemento.getPlayerOffSeveral();
}
}
//备份信息管理类
class Caretaker {
private GameMemento gameMemento;
//恢复备份
public GameMemento retrieveMemento(){
return this.gameMemento;
}
//保存备份
public void saveMemento(GameMemento gameMemento){
this.gameMemento =gameMemento;
}
}