备忘录模式(大话设计模式)C/C++版本

备忘录模式

在这里插入图片描述

C++

#include <iostream>
#include <string>
using namespace std;// Memento类,备忘录,此处为角色状态存储箱
class RoleStateMemento
{
private:int m_vit; // 生命力int m_atk; // 攻击力int m_def; // 防御力
public:RoleStateMemento(int vit, int atk, int def) : m_vit(vit), m_atk(atk), m_def(def) {} // 把状态存入 备忘录中void setVitality(int vit) { m_vit = vit; }int getVitality() { return m_vit; }void setAttack(int atk) { m_atk = atk; }int getAttack() { return m_atk; }void setDefense(int def) { m_def = def; }int getDefense() { return m_def; }
};// Originator,发起人,此处为游戏角色
class GameRole
{
private:int m_vit; // 生命力int m_atk; // 攻击力int m_def; // 防御力public:RoleStateMemento *SaveState(){ // 保存角色状态return (new RoleStateMemento(m_vit, m_atk, m_def));}void RecoveryState(RoleStateMemento *memento) // 恢复角色状态{m_vit = memento->getVitality();m_atk = memento->getAttack();m_def = memento->getDefense();}// 获得初始状态void GetInitState(){m_atk = m_def = m_vit = 100;}void Fight(){m_atk = m_def = m_vit = 0;}void StateDisplay(){cout << "角色当前状态:" << endl;cout << "体力:" << m_vit << " "<< "攻击力:" << m_atk << " "<< "防御力:" << m_def << endl;}
};
// Caretaker,管理者,此处为游戏角色管理类
class RoleStateCaretaker
{
private:RoleStateMemento *m_memento;public:~RoleStateCaretaker(){delete m_memento;}void setMemento(RoleStateMemento *memento){m_memento = memento;}RoleStateMemento *getMemento(){return m_memento;}
};
int main()
{// 大战Boss前GameRole *lixiaoyao = new GameRole;lixiaoyao->GetInitState();lixiaoyao->StateDisplay();cout << "\n大战Boss中..." << endl;// 保存进度RoleStateCaretaker *stateAdmin = new RoleStateCaretaker;stateAdmin->setMemento(lixiaoyao->SaveState());// 大战Boss时,损耗严重lixiaoyao->Fight();lixiaoyao->StateDisplay();cout << "\n大战Boss后,恢复进度..." << endl;// 恢复之前状态lixiaoyao->RecoveryState(stateAdmin->getMemento());lixiaoyao->StateDisplay();delete lixiaoyao;delete stateAdmin;return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// Memento结构体,用于存储游戏角色的状态
typedef struct
{int vitality;int attack;int defense;
} RoleStateMemento;// 创建备忘录
RoleStateMemento *create_memento(int vit, int atk, int def)
{RoleStateMemento *memento = (RoleStateMemento *)malloc(sizeof(RoleStateMemento));memento->vitality = vit;memento->attack = atk;memento->defense = def;return memento;
}// 角色结构体
typedef struct
{int vitality;int attack;int defense;
} GameRole;// 初始化角色状态
void init_game_role(GameRole *role)
{role->vitality = 100;role->attack = 100;role->defense = 100;
}// 保存角色状态
RoleStateMemento *save_state(GameRole *role)
{return create_memento(role->vitality, role->attack, role->defense);
}// 恢复角色状态
void restore_state(GameRole *role, RoleStateMemento *memento)
{role->vitality = memento->vitality;role->attack = memento->attack;role->defense = memento->defense;
}// 显示角色状态
void display_state(GameRole *role)
{printf("角色当前状态:\n");printf("体力:%d 攻击力:%d 防御力:%d\n", role->vitality, role->attack, role->defense);
}// 管理者结构体,用于管理备忘录
typedef struct
{RoleStateMemento *memento;
} RoleStateCaretaker;// 设置备忘录
void caretaker_set_memento(RoleStateCaretaker *caretaker, RoleStateMemento *memento)
{caretaker->memento = memento;
}// 获取备忘录
RoleStateMemento *caretaker_get_memento(RoleStateCaretaker *caretaker)
{return caretaker->memento;
}// 释放角色状态和管理者
void cleanup(GameRole *role, RoleStateCaretaker *caretaker)
{free(caretaker->memento);free(caretaker);// 注意:此处未释放role的内存,因为在实际应用中可能需要继续使用或有其他管理机制
}int main()
{GameRole lixiaoyao;RoleStateCaretaker *stateAdmin = (RoleStateCaretaker *)malloc(sizeof(RoleStateCaretaker));init_game_role(&lixiaoyao);display_state(&lixiaoyao);printf("\n大战Boss中...\n");// 保存进度caretaker_set_memento(stateAdmin, save_state(&lixiaoyao));// 大战Boss后,状态受损lixiaoyao.vitality = lixiaoyao.attack = lixiaoyao.defense = 0;display_state(&lixiaoyao);printf("\n大战Boss后,恢复进度...\n");// 恢复状态restore_state(&lixiaoyao, caretaker_get_memento(stateAdmin));display_state(&lixiaoyao);cleanup(&lixiaoyao, stateAdmin);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运算放大器(运放)输入偏置电流、失调电流

输入偏置电流定义 理想情况下&#xff0c;并无电流进入运算放大器的输入端。而实际操作中&#xff0c;始终存在两个输入偏置电流&#xff0c;即IB和IB-(参见图1)。 I B I_B IB​的值大小不一&#xff0c;在静电计AD549中低至60 fA(每三微秒通过一个电子)&#xff0c;而在某些高…

JavaScript 输出与弹框

1.console.log()&#xff1b;控制台输出 JS 中常用的调试语句&#xff0c;该语句会将内容输出到控制台的 Console 中。 <script type"text/javascript"> console.log("哈喽&#xff01;&#xff01;&#xff01;"); </script> 2.docment.writ…

Matlab数学建模实战应用:案例3 - 投资组合优化

目录 前言 一、问题分析 二、模型建立 三、Matlab代码实现 完整代码示例 四、模型验证 五、模型应用 实例示范&#xff1a;投资组合优化 步骤 1&#xff1a;导入数据并计算统计量 步骤 2&#xff1a;建立优化模型并求解 步骤 3&#xff1a;绘制有效前沿&#xff08;…

CVPR 2024揭幕,清华大学论文接收量霸榜,轻松碾压斯坦福、麻省理工

CVPR2024 会议之眼 快讯 会议介绍 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月17日至21日正在美国西雅图召开。CVPR是计算机视觉和模式识别领域的顶级会议之一。与ICCV和ECCV并称为计算…

LeetCode 平衡二叉搜索树

//平衡二叉搜索数&#xff0c;关键在于平衡两个字&#xff0c;左右数的高度差不超过1&#xff0c;搜索树&#xff0c;左节点小于 根节点 小于右节点 //先谈平衡&#xff0c;我们找到数组的中间节点作为数的根节点&#xff0c;这个方法被论证过是可行的&#xff0c;然后…

TikTok账号运营:静态住宅IP为什么可以防封?

静态住宅IP代理服务是一种提供稳定、静态IP地址并可隐藏用户真实IP地址的网络代理服务。此类代理服务通常使用高速光纤网络来提供稳定、高速的互联网体验。与动态IP代理相比&#xff0c;静态住宅IP代理的IP地址更稳定&#xff0c;被封的可能性更小&#xff0c;因此更受用户欢迎…

整理好了!2024年最常见 20 道设计模式面试题(七)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道设计模式面试题&#xff08;六&#xff09;-CSDN博客 十三、请解释桥接模式&#xff0c;并给出一个使用场景。 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它将抽象部分与…

fastadmin完全自定义页面内容

fastadmin的后台管理页面全自动生成非常方便,但是有些复杂查询确不太好弄,需要完全自定义,但是遵从以下几个步骤即可轻松定制了 1.随便使用某个数据表生成页面所需内容 通过命令工具即可完成 2.自定义返回内容 在controller的index方法里面,删除掉原来返回的内容(主要是aja…

通过数字证书获取CRL吊销列表

在一些对安全性要求比较严格的企业,需要在每次使用证书时,要求对证书的有效性进行验证,如何验证可查看我的其他博客。其中验证的吊销列表(CRL)是可以从数字证书中获取吊销列表文件的发布地址的。 一、一般CRL的使用场景设计 证书颁发机构对CRL的发布也不是实时的,在证书…

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层&#xff08;DHCP&#xff09; 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP&#xff1a; 什么是DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&…

2024年,收付通申请开通流程

大家好&#xff0c;今天咱们来聊聊关于APP场景中开通微信收付通的一些实用小窍门。在如今的移动互联网时代&#xff0c;很多商家都选择通过APP来提供服务和产品&#xff0c;因此如何在APP中顺利集成微信收付通功能&#xff0c;让用户能够轻松完成支付&#xff0c;就显得尤为重要…

分支结构相关

1.if 语句 结构&#xff1a; if 条件语句&#xff1a; 代码块 小练习&#xff1a; 使用random.randint()函数随机生成一个1~100之间的整数&#xff0c;判断是否是偶数 import random n random.randint(1,100) print(n) if n % 2 0:print(str(n) "是偶数") 2.else语…

Vue中使用ElementUI组件Form组件的校验validate

先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的&#xff0c;如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧&#xff01; 1.在el-form中绑定一个ref&#xff0c;名字自拟,后续触发检验结果…

代码随想录算法训练营第四十四天|LeetCode198 打家劫舍、LeetCode213 打家劫舍Ⅱ

题1&#xff1a; 指路&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 对于这个题&#xff0c;拿房屋i举例&#xff0c;我们需要考虑的是否确定偷取这个房屋&#xff0c;如果确定偷取这个房屋&#xff0c;那么我们将得到房屋i的金…

QT-QPainter实现一个动态充电的电池

1、效果 2、核心代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>

php反序列化的一些知识

问题 <?php $raw O:1:"A":1:{s:1:"a";s:1:"b";}; echo serialize(unserialize($raw)); //O:1:"A":1:{s:1:"a";s:1:"b";}?> php反序列化的时按理说找不到A这个类&#xff0c;但是他没有报错&#xff0c;…

SpringBoot复习

第一章 SpringBoot开发入门 1.Springboot的优点。 ① 可快速构建独立的Spring应用。 ② 直接嵌入Tomcat、Jetty和Undertow服务器&#xff08;无须部署WAR文件&#xff09; ③ 通过依赖启动器简化构建配置 ④ 自动化配置Spring和第三方库 ⑤ 提供生产就绪功能 ⑥ 极少的代码生成…

使用Docker Compose运行Elasticsearch

使用Docker Compose运行Elasticsearch可以帮助你快速搭建和管理Elasticsearch服务。以下是具体步骤&#xff1a; 1. 安装Docker和Docker Compose 确保你已经安装了Docker和Docker Compose。如果没有安装&#xff0c;可以参考官方文档进行安装&#xff1a; Docker安装指南Doc…

永久更改R包的安装目录

要永久更改 R 包的安装目录&#xff0c;可以通过设置 R 配置文件来实现。以下是步骤说明&#xff1a; 1. 查找和修改 R 配置文件 R 有几个配置文件用于保存用户和系统的设置&#xff1a; 用户级配置文件&#xff1a;通常位于 ~/.Rprofile系统级配置文件&#xff1a;通常位于…

HJY-91A/8J电压继电器10-242VAC 辅助电源220VDC 约瑟JOSEF

系列型号 HJY-E1A/4D数字式交流电压继电器&#xff1b;HJY-E1A/4J数字式交流电压继电器&#xff1b; HJY-E1B/4D数字式交流电压继电器&#xff1b;HJY-E1B/4J数字式交流电压继电器&#xff1b; HJY-E2A/4D数字式交流电压继电器&#xff1b;HJY-E2A/4J数字式交流电压继电器&…