概念

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

主要角色

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。 ```java @Data public class LeiGamer { Integer coin;//剩余金币 Integer hp;//血量 Integer mp;//蓝量 Integer level;//等级 //以上的是内部状态,我们需要记录保存的信息

    GameServer gameServer = new GameServer();

  1. //保存游戏记录
  2. void saveGameRecord() throws Exception {
  3. System.out.println("正在保存当前记录....");
  4. GameRecord gameRecord = new GameRecord();
  5. //当前游戏信息保存到备忘录
  6. BeanUtils.copyProperties(gameRecord,this);
  7. //
  8. gameServer.add(gameRecord);
  9. }
  10. //从备忘录获取游戏历史存档
  11. LeiGamer getFromMemento(Integer id) throws Exception {
  12. System.out.println("获取历史存档信息....");
  13. LeiGamer record = gameServer.getRecord(id);
  14. return record;
  15. }
  16. //玩游戏
  17. void playGame(){
  18. int i = new Random().nextInt();
  19. System.out.println("......(〃'▽'〃)......"+i);
  20. coin = i;
  21. hp = i;
  22. mp = i;
  23. level = i;
  24. }
  25. //退出游戏
  26. void exitGame() throws Exception {
  27. System.out.println("退出&存档");
  28. saveGameRecord();
  29. }

}

```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活化钝化