news 2026/4/19 22:39:20

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/4/18 20:24:22

导师不会告诉你的6个免费AI论文工具:1小时搞定全文告别熬夜

想知道为什么你隔壁实验室的同学总能提前交稿&#xff0c;而你还在一字一句地苦熬&#xff1f;因为他们在用一些“不该知道”的秘密武器。今天&#xff0c;我就来为你揭秘这些藏在水面之下的“学术黑科技”&#xff0c;特别是那个能让论文效率提升10倍的终极神器。 前言&#x…

作者头像 李华
网站建设 2026/4/16 12:55:12

计及多能耦合的区域综合能源系统电气热能流计算Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/4/19 12:34:22

AI侦测模型微调教程:云端GPU加速,3小时完成迭代

AI侦测模型微调教程&#xff1a;云端GPU加速&#xff0c;3小时完成迭代 引言 作为一名算法工程师&#xff0c;你是否遇到过这样的困境&#xff1a;公司GPU资源被其他项目占用&#xff0c;但你又急需优化行业专用模型&#xff1f;传统本地训练动辄需要数天时间&#xff0c;而项…

作者头像 李华
网站建设 2026/4/17 7:07:41

金融实体关系图谱构建:云端分布式计算,按需扩容

金融实体关系图谱构建&#xff1a;云端分布式计算&#xff0c;按需扩容 引言 作为一名反洗钱分析师&#xff0c;你是否经常遇到这样的困境&#xff1a;面对千万级的交易数据&#xff0c;本地电脑跑个简单的图计算都要卡死&#xff0c;更别提复杂的实体关系分析了&#xff1f;…

作者头像 李华
网站建设 2026/4/17 18:26:35

AI智能体游戏开发:独立制作人的智能NPC解决方案

AI智能体游戏开发&#xff1a;独立制作人的智能NPC解决方案 引言&#xff1a;为什么你的游戏需要智能NPC&#xff1f; 想象一下&#xff0c;你正在玩一款开放世界RPG游戏。当你走进酒馆时&#xff0c;里面的NPC&#xff08;非玩家角色&#xff09;不仅会机械地重复固定台词&a…

作者头像 李华
网站建设 2026/4/17 19:33:26

AI侦测技术体验馆:新模型第一时间尝鲜,不花冤枉钱

AI侦测技术体验馆&#xff1a;新模型第一时间尝鲜&#xff0c;不花冤枉钱 1. 为什么需要AI侦测技术体验馆 作为一名技术极客&#xff0c;每次看到arXiv上发布的新AI论文都跃跃欲试&#xff0c;但实际部署时总会遇到各种问题&#xff1a;环境配置冲突、依赖包版本不兼容、GPU资…

作者头像 李华