概念
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。对象行为型模式

主要角色
- 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。 ```java @Data public class LeiGamer { Integer coin;//剩余金币 Integer hp;//血量 Integer mp;//蓝量 Integer level;//等级 //以上的是内部状态,我们需要记录保存的信息
GameServer gameServer = new GameServer();
//保存游戏记录void saveGameRecord() throws Exception {System.out.println("正在保存当前记录....");GameRecord gameRecord = new GameRecord();//当前游戏信息保存到备忘录BeanUtils.copyProperties(gameRecord,this);//gameServer.add(gameRecord);}//从备忘录获取游戏历史存档LeiGamer getFromMemento(Integer id) throws Exception {System.out.println("获取历史存档信息....");LeiGamer record = gameServer.getRecord(id);return record;}//玩游戏void playGame(){int i = new Random().nextInt();System.out.println("......(〃'▽'〃)......"+i);coin = i;hp = i;mp = i;level = i;}//退出游戏void exitGame() throws Exception {System.out.println("退出&存档");saveGameRecord();}
}
```java
/**
* 备忘录(Memento)角色
*/
@Data
public class GameRecord {
Integer id; //代表生成记录的id
Integer coin;//剩余金币
Integer hp;//血量
Integer mp;//蓝量
Integer level;//等级
//获取当前备忘录信息
void getCurrent(){
System.out.println("coin:"+coin+";\t"+"hp:"+hp+";\t mp:"+mp);
}
}
/**
* 管理者(Caretaker)角色
*/
public class GameServer {
//管理备忘录信息的
Map<Integer,GameRecord> records = new HashMap<>();
int i = 1;
void add(GameRecord gameRecord){
gameRecord.setId(i++);
records.put(gameRecord.id,gameRecord);
}
LeiGamer getRecord(Integer id) throws Exception {
GameRecord gameRecord = records.get(id);
//获取到备忘录里面的内容以后还要逆转
LeiGamer leiGamer = new LeiGamer();
// leiGamer.setCoin(gameRecord.getCoin());
//BeanUtils:工具类,属性对拷
BeanUtils.copyProperties(leiGamer,gameRecord);
return leiGamer;
}
}
应用场景
- 游戏存档
- 数据库保存点事务(savepoint)
- session活化钝化
