备忘录模式(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的版本控制思想与备忘录模式相似。

结论

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

历史热点文章

相关推荐
jump68017 分钟前
url输入到网页展示会发生什么?
前端
javadaydayup18 分钟前
同样是简化代码,Lambda 和匿名内部类的核心原理是什么?
后端
诸葛韩信20 分钟前
我们需要了解的Web Workers
前端
Yeats_Liao22 分钟前
时序数据库系列(六):物联网监控系统实战
数据库·后端·物联网·时序数据库
金銀銅鐵22 分钟前
[Java] 用 Swing 生成一个最大公约数计算器
java·后端
brzhang25 分钟前
我觉得可以试试 TOON —— 一个为 LLM 而生的极致压缩数据格式
前端·后端·架构
苏三的开发日记28 分钟前
库存预扣减之后,用户订单超时之后补偿库存的方案
后端
yivifu1 小时前
JavaScript Selection API详解
java·前端·javascript
这儿有一堆花1 小时前
告别 Class 组件:拥抱 React Hooks 带来的函数式新范式
前端·javascript·react.js
知其然亦知其所以然1 小时前
这波AI太原生了!SpringAI让PostgreSQL秒变智能数据库!
后端·spring·postgresql