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

结论

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

历史热点文章

相关推荐
bluebonnet274 分钟前
【Rust练习】22.HashMap
开发语言·后端·rust
uhakadotcom27 分钟前
如何实现一个基于CLI终端的AI 聊天机器人?
后端
Myli_ing28 分钟前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
dr李四维1 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
Iced_Sheep1 小时前
干掉 if else 之策略模式
后端·设计模式
雯0609~1 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ1 小时前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z1 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
XINGTECODE1 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露