备忘录模式(大话设计模式)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;而在某些高…

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并称为计算…

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

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

计算机网络 —— 应用层(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;名字自拟,后续触发检验结果…

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和第三方库 ⑤ 提供生产就绪功能 ⑥ 极少的代码生成…

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数字式交流电压继电器&…

【Android面试八股文】你刚刚提到了V2签名使用美团的Walle实现多渠道打包,那么你能讲一讲Android 签名的 v1、v2、v3、v4版本的区别吗?

文章目录 前言一、简介二、APK 签名方案 v1 (JAR签名)2.1. 签名过程2.2 验证过程2.3 详细例子2.4 优缺点2.5 美团基于V1版本的多渠道打包方案三、APK 签名方案 v23.1 为什么要设计APK 签名方案 v2 ?3.2 APK 签名方案 v2 : 签名前和签名后的 APK3.2.1 签名前和签名后的 APK3.2…

[17] 使用Opencv_CUDA 进行滤波操作

使用Opencv_CUDA 进行滤波操作 邻域处理操作 > 滤波操作&#xff0c;拒绝或者允许某特定频段通过如果图像某处的灰度级变化缓慢&#xff0c;那么就是低频区域&#xff0c;如果灰度级变化剧烈&#xff0c;就是高频区域邻域滤波即卷积操作形态学处理&#xff1a;膨胀&#xf…

全网最全postman接口测试教程和项目实战~从入门到精通

Postman实现接口测试内容大纲一览&#xff1a; 一、什么是接口&#xff1f;为什么需要接口&#xff1f; 接口指的是实体或者软件提供给外界的一种服务。 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改。从而使得内部和外部实现数据交互。所以需要接口。 比如&…

Spring Boot -- 图书管理系统(登录、展示+翻页、添加/修改图书)

文章目录 一、应用分层二、数据库的设计三、登录功能四、展示列表&#xff08;使用虚构的数据&#xff09;五、翻页 展示功能六、添加图书七、修改图书 一、应用分层 为什么我们需要应用分层&#xff1a;当代码量很多时&#xff0c;将其全部放在一起查找起来就会很麻烦&#…

Docker 可用镜像源

当使用 docker 发现拉取不到镜像时&#xff0c;可以编辑 /etc/docker/daemon.json 文件&#xff0c;添加如下内容&#xff1a; 这文章不涉及政治&#xff0c;不涉及敏感信息&#xff0c;三番五次的审核不通过&#xff0c;一删再删&#xff0c;只好换图片了。 重新加载服务配置…

Zookeeper基础教程

Zookeeper基础教程 资料来源&#xff1a;Zookeeper Tutorial (tutorialspoint.com) zookeeper就是Hadoop生态动物园的管理员 1. Zookeeper-概述 ZooKeeper是一种分布式协调服务&#xff0c;用于管理大型主机集群(large set of hosts)。在分布式环境中协调和管理服务是一个复…

解决navicat连接oracle19c数据库缺少oci.dll

下载oci.dll文件 搜索Oracle Instant Client Downloads Oracle Instant Client Downloads点击 Oracle Instant Client Downloads 超链接 根据自己的操作系统按需选择 以windows64位为例&#xff0c;下载 Version 19.23.0.0.0的OCI压缩包 解压到Navicat的安装根路径下&#xff…

Qt creator day1 练习

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面&#xff0c;要求&#xff1a;第行代码都有注释 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("贪玩蓝月——是兄弟就来砍我 登入&#…