当前位置: 首页 > news >正文

14.设计模式-备忘录模式

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

需求

游戏的某个场景,一游戏角色有生命力、攻击力、防御力等等数据,在打Boss前和后一定会不一样的,我们允许玩家如果感觉与Boss决斗的效果不理想可以让游戏恢复到决斗前。

代码

业务类

#include<stdio.h>#include<stdlib.h>typedefstructRoleStateMemo{intvit;intatk;intdef;}RoleStateMemo;RoleStateMemo*InitRoleStateMemo(intvit,intatk,intdef){RoleStateMemo*obj=(RoleStateMemo*)malloc(sizeof(RoleStateMemo));obj->atk=atk;obj->vit=vit;obj->def=def;returnobj;}typedefstructPlayRole{intvit;intatk;intdef;// 金币intgold;RoleStateMemo*(*saveState)(structPlayRole*);void(*recoveryState)(structPlayRole*,RoleStateMemo*);void(*stateDisplay)(structPlayRole*);void(*fight)(structPlayRole*);}PlayRole;RoleStateMemo*SaveState(PlayRole*obj){RoleStateMemo*res=InitRoleStateMemo(obj->vit,obj->atk,obj->def);returnres;}voidRecoveryState(PlayRole*obj,RoleStateMemo*memo){obj->vit=memo->vit;obj->atk=memo->atk;obj->def=memo->def;return;}voidStateDisplay(PlayRole*obj){printf("角色状态信息:\n");printf("生命值:%d\n",obj->vit);printf("攻击力:%d\n",obj->atk);printf("防御力:%d\n",obj->def);printf("金币:%d\n",obj->gold);printf("======end======\n");}voidFight(PlayRole*obj){obj->vit=(obj->vit)/2;obj->def=(obj->def)/2;obj->gold+=100;}PlayRole*InitPlayRole(){PlayRole*obj=(PlayRole*)malloc(sizeof(PlayRole));obj->vit=100;obj->atk=10;obj->def=10;obj->gold=0;obj->saveState=SaveState;obj->recoveryState=RecoveryState;obj->stateDisplay=StateDisplay;obj->fight=Fight;returnobj;}typedefstructRoleStateManager{RoleStateMemo*memo;}RoleStateManager;

客户端

intmain(){// 大战BOSS前PlayRole*lixiaoyao=InitPlayRole();lixiaoyao->stateDisplay(lixiaoyao);// 保存进度RoleStateManager stateManager;stateManager.memo=lixiaoyao->saveState(lixiaoyao);// 大战lixiaoyao->fight(lixiaoyao);lixiaoyao->stateDisplay(lixiaoyao);// 恢复之前进度lixiaoyao->recoveryState(lixiaoyao,stateManager.memo);lixiaoyao->stateDisplay(lixiaoyao);return0;}

客户端打印:

角色状态信息: 生命值:100 攻击力:10 防御力:10 金币:0 ======end====== 角色状态信息: 生命值:50 攻击力:10 防御力:5 金币:100 ======end====== 角色状态信息: 生命值:100 攻击力:10 防御力:10 金币:100 ======end======

UML图

Originator(发起人,此处是PlayRole):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。

Memento(备忘录, 此处是RoleStateMemo):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。

Caretaker(管理者,此处是RoleStateManager):负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。

总结

  • 备忘录模式使用场景?
    “Memento模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。”
http://www.jsqmd.com/news/230759/

相关文章:

  • 15.设计模式-组合模式
  • Nodejs+vue大学生二手闲置物品置换交易管理系统
  • 2026年10款最佳降AI率工具推荐:论文AIGC检测轻松过关
  • Nodejs+vue大学生兼职应聘评分管理系统h4bmt
  • 导师不会告诉你的6个免费AI论文工具:1小时搞定全文告别熬夜
  • Nodejs+vue大学生兼职招聘评价系统_b8t93
  • 2025年同济大学计算机考研复试机试真题(解题思路 + AC 代码)
  • 2025年山东大学计算机考研复试机试真题(解题思路 + AC 代码)
  • 输入聚食的人数,预算和口味偏好,自动推荐附近的餐厅,还能生成聚餐菜单。
  • Unity3D AI Navigation 详解:从基础概念到实战应用
  • matlab实时脚本算拉普拉斯反变换和画图
  • 电-气-热综合能源系统耦合优化调度Matlab代码
  • Unity AI Navigation 从 0 到 1:一篇吃透新 NavMesh 系统的实战
  • (8-1)自动驾驶中的无地图环境路径探索:D* Lite算法简介
  • (8-2-01)自动驾驶中的无地图环境路径探索:基于Pygame的交互式路径规划器(1)
  • 计及多能耦合的区域综合能源系统电气热能流计算Matlab实现
  • Unity 的AI Navigation 系统详细总结
  • Unity3D AI Navigation 完全指南:从基础到实战,让角色智能导航
  • Unity3D AI导航系统完全指南:从核心概念到动画耦合
  • RabbitMQ在大数据风控系统中的应用案例
  • CRM服务质量差?提示工程架构师的3个Prompt解决方案
  • AI智能侦测开箱即用方案: Docker镜像+示例代码全家桶
  • AI安全技能树:零基础到精通的资源地图
  • 智能实体哨兵系统:7×24小时云端值守,月费不足人力1/10
  • 智能监控AI懒人包:一键部署复杂模型,省去7天配置时间
  • 跨平台用户画像构建:多源数据实体对齐,隐私合规
  • 【46】骰子数据集(有v5/v8模型)/YOLO骰子点数检测
  • AI侦测模型微调教程:云端GPU加速,3小时完成迭代
  • AI安全检测5大模型横评:云端3小时完成,比本地省时80%
  • UEBA行为分析避坑指南:云端GPU免配置,比自建省90%成本