news 2026/3/1 9:52:43

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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信息还原到前一状态。”
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/21 18:02:15

Nodejs+vue大学生二手电子数码产品交易平台设计与实现 _39qu9

文章目录系统设计背景技术架构核心功能模块安全与风控措施创新点与价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统设计背景 随着高校学生电子设备更新速度加快&#xff0c;二手电子数码产品交易需求显著增…

作者头像 李华
网站建设 2026/2/25 23:02:29

宠物行为AI实时分析,兽医误诊率砍半

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 宠物行为AI实时分析&#xff1a;兽医误诊率砍半的创新实践目录宠物行为AI实时分析&#xff1a;兽医误诊率砍半的创新实践 引言&#xff1a;宠物行为诊断的隐性危机 一、技术原理&#xff1a;LLM如何破解行为诊断困局 核心技术…

作者头像 李华
网站建设 2026/2/24 2:24:51

输入聚食的人数,预算和口味偏好,自动推荐附近的餐厅,还能生成聚餐菜单。

智能聚餐规划系统1. 项目概述实际应用场景在朋友、同事或家庭聚会时&#xff0c;组织一次成功的聚餐需要考虑多个因素&#xff1a;人数、预算、不同人的口味偏好、餐厅选择、菜品搭配等。传统方式需要人工查询、比较、协调&#xff0c;过程繁琐且容易遗漏重要信息。痛点分析- 信…

作者头像 李华
网站建设 2026/2/28 4:28:24

AI健身动作识别:预置运动实体模型,APP快速集成

AI健身动作识别&#xff1a;预置运动实体模型&#xff0c;APP快速集成 引言&#xff1a;让健身APP拥有专业教练的眼睛 想象一下这样的场景&#xff1a;用户在家跟着健身APP做深蹲时&#xff0c;手机摄像头能像专业教练一样实时指出"膝盖内扣了""下蹲幅度不够&…

作者头像 李华
网站建设 2026/2/19 3:17:02

AI威胁狩猎省钱攻略:按秒计费GPU比本地训练省90%成本

AI威胁狩猎省钱攻略&#xff1a;按秒计费GPU比本地训练省90%成本 1. 为什么红队工程师需要AI威胁狩猎&#xff1f; 想象一下你是一名网络安全专家&#xff0c;每天要面对海量的日志数据和潜在威胁。传统方法就像用放大镜在沙滩上找一粒特定的沙子——效率低下且容易遗漏关键线…

作者头像 李华