设计模式—行为型模式之备忘录模式

设计模式—行为型模式之备忘录模式

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

有如下角色:

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

示例

比如我们有一个奥特曼游戏,每一个奥特曼有血量,等级,我们可以建一个游戏备份来保存这些有用的内容,并使用游戏服务器管理他们。

奥特曼类如下:

@Data
public class Ultraman {
   
    private Integer hp;//血量
    private Integer level;//等级

    //备忘录管理者
    private GameServer gameServer = new GameServer();

    /**
     * 进行游戏
     */
    public void play(){
   
        hp = level = new Random().nextInt();
    }

    /**
     * 保存备忘录
     */
    public void saveRocord() throws Exception {
   
        System.out.println("保存备忘录");
        gameServer.addRecord(this);
    }

    /**
     * 获取备忘录
     */
    public Ultraman restoreRecord(Integer id) throws Exception {
   
        System.out.println("获取记录");
        return gameServer.getRecord(id);
    }

    public void exit() throws Exception {
   
        System.out.println("退出并存档");
        gameServer.addRecord(this);
    }
}

记录类如下:

/**
 * 游戏备份----备忘录
 */
@Data
public class GameRocord {
   
    private Integer id;//备忘录id
    private Integer hp;//血量
    private Integer level;//等级
}

游戏服务器类如下:

/**
 * 游戏服务器——备忘录管理者
 */
public class GameServer {
   
    //记录id
    private Integer i = 1;
    //备忘录管理
    private Map<Integer,GameRocord> recordMap = new HashMap<>();

    /**
     * 添加备忘录
     */
    public void addRecord(Ultraman ultraman) throws Exception {
   
        GameRocord gameRocord = new GameRocord();
        BeanUtils.copyProperties(gameRocord,ultraman);
        gameRocord.setId(i++);
        recordMap.put(gameRocord.getId(),gameRocord);
    }

    /**
     * 恢复备忘录
     */
    public Ultraman getRecord(Integer id) throws Exception{
   
        GameRocord gameRocord = recordMap.get(id);
        Ultraman ultraman = new Ultraman();
        BeanUtils.copyProperties(ultraman,gameRocord);
        return ultraman;
    }

}

测试类如下:

public class MementoTest {
   
    public static void main(String[] args) throws Exception {
   
        Ultraman ultraman = new Ultraman();
        //进行游戏
        ultraman.play();
        //存档
        ultraman.saveRocord();
        ultraman.setHp(1);
        ultraman.saveRocord();
        Ultraman ultramanRecord = ultraman.restoreRecord(1);
        ultraman.exit();
    }
}

运行截图如下:

运行截图

相关推荐

  1. 设计模式: 行为备忘录模式(13)

    2024-01-23 19:46:01       43 阅读
  2. 设计模式(020)行为备忘录模式

    2024-01-23 19:46:01       44 阅读
  3. 行为设计模式备忘录模式

    2024-01-23 19:46:01       43 阅读
  4. 设计模式行为设计模式——备忘录模式

    2024-01-23 19:46:01       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-23 19:46:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-23 19:46:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-23 19:46:01       87 阅读
  4. Python语言-面向对象

    2024-01-23 19:46:01       96 阅读

热门阅读

  1. Hotspot源码解析-第22章-vtable和itable的重新初始化

    2024-01-23 19:46:01       53 阅读
  2. 25. string和const char哪个更合理?

    2024-01-23 19:46:01       57 阅读
  3. 免费chartGPT网站汇总

    2024-01-23 19:46:01       53 阅读
  4. 如何从软硬件层面优化MySQL?

    2024-01-23 19:46:01       53 阅读
  5. 【Poetry】python包管理工具简介

    2024-01-23 19:46:01       60 阅读
  6. 一键生成-微信问一问解答

    2024-01-23 19:46:01       56 阅读
  7. Midjourney常见命令(极速版)

    2024-01-23 19:46:01       55 阅读
  8. 10个常用python自动化脚本

    2024-01-23 19:46:01       45 阅读
  9. 装进肚子(贪心)

    2024-01-23 19:46:01       51 阅读
  10. linux信号处理机制

    2024-01-23 19:46:01       58 阅读
  11. YOLOv8加入AIFI模块,附带项目源码链接

    2024-01-23 19:46:01       65 阅读