备忘录模式(Memento Pattern):游戏存档系统实战案例分析

肖哥弹架构 跟大家"弹弹" 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

开发一款角色扮演游戏(RPG)时,需要一个系统来保存玩家的游戏进度,包括角色的位置、状态、装备和任务进度等,以便玩家可以加载之前的存档继续游戏。

2. 为什么要使用备忘录设计模式

备忘录模式允许游戏状态的保存和恢复,使得玩家可以自由地进行游戏存档和读档操作,而不会影响当前的游戏逻辑。

3. 标准备忘录设计模式图

4. 业务备忘录设计模式图

5. 业务代码参考

java 复制代码
// 游戏角色状态
class PlayerStatus {
    // 角色状态属性
}

// 游戏项目(如武器、装备等)
class Item {
    // 项目属性
}

// 游戏状态
class GameState {
    private Vector playerPosition;
    private PlayerStatus playerStatus;
    private List<Item> equipment;
    private Map<String, Boolean> questProgress;

    // 构造函数、getter 和 setter

    public String getState() {
        // 转换游戏状态为字符串形式,用于存储
        return "状态信息";
    }
}

// 游戏类
class Game {
    private GameState currentState;

    public GameState saveGame() {
        // 保存当前游戏状态
        return new GameState(currentState); // 复制当前状态
    }

    public void loadGame(GameState gameState) {
        // 从存档中恢复游戏状态
        this.currentState = gameState;
    }
}

// 存档管理器
class SaveManager {
    private Stack<GameState> saves = new Stack<>();

    public void saveState(GameState gameState) {
        saves.push(gameState);
    }

    public GameState loadLastState() {
        return saves.isEmpty() ? null : saves.pop();
    }
}

// 客户端使用
class GameApp {
    public static void main(String[] args) {
        Game game = new Game();
        SaveManager saveManager = new SaveManager();

        // 玩家进行一系列操作后,决定保存游戏
        GameState savedState = game.saveGame();
        saveManager.saveState(savedState);

        // 玩家退出游戏或读取存档
        GameState loadedState = saveManager.loadLastState();
        if (loadedState != null) {
            game.loadGame(loadedState);
            // 游戏继续从存档状态进行
        }
    }
}

6. 使用备忘录设计模式的好处

  • 状态管理:允许游戏在不同时间点保存和恢复状态。
  • 灵活性:玩家可以随时保存和加载游戏,提高了游戏体验。

7. 其他使用备忘录设计模式场景参考

  • 图形设计软件:保存设计的不同版本。
  • 文档编辑:实现文档的版本控制。

总结

  • Git:虽然不是直接使用备忘录模式,但Git的版本控制思想与备忘录模式相似。

结论

备忘录模式为游戏存档系统提供了一种有效的方法来保存和恢复游戏状态,增强了游戏的可玩性和用户体验。

历史热点文章

相关推荐
刀法如飞17 小时前
AI时代:一文搞懂DDD领域驱动设计
后端·架构·ai编程
weixin_4684668517 小时前
Prometheus监控服务部署与实战指南
服务器·后端·python·docker·自动化·prometheus
会编程的土豆17 小时前
Go interface 底层的 itab 到底是什么
开发语言·后端·golang
candyTong17 小时前
Claude Code 每次调用 API 时,上下文是怎么"拼"出来的?
javascript·后端·架构
java_cj17 小时前
MySQL 执行原理深度剖析:查询成本计算与优化器内幕
数据库·后端·mysql
java_cj17 小时前
数据库范式化设计与性能优化全攻略
数据库·后端·性能优化·架构·开源
用户8524950718417 小时前
为什么变量能 未定义先使用?
javascript·程序员
用户8524950718417 小时前
Prompt 就像点外卖:写清楚"备注",AI 才能给你送对"菜
程序员
黄敬峰17 小时前
从 Python 模块化到提示词工程:构建高效的 LLM 交互流程
程序员
雪隐18 小时前
AI股票小助手01-量化交易基础概念
人工智能·后端·python