备忘录模式(大话设计模式)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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机的篮球计分器设计

一.硬件方案 本设计用由AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。该系统具有赛程定时设置、赛程时间暂停、及时刷新甲乙双方的成绩等功能。 电路主要由STC89C52单片机最小系统数码管显示模块数码管驱动模块蜂鸣器模块按键模块&#xff1b; 二.设计功能 &…

为什么有人认为Linux不如macOS?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;首先要明确你说的是哪个Lin…

Zynq学习笔记--了解中断配置方式

目录 1. 简介 2. 工程与代码解析 2.1 Vivado 工程 2.2 Vitis 裸机代码 2.3 关键代码解析 3. 总结 1. 简介 Zynq 中的中断可以分为以下几种类型&#xff1a; 软件中断&#xff08;Software Generated Interrupt, SGI&#xff09;&#xff1a;由软件触发&#xff0c;通常…

Python学习笔记15:进阶篇(四)文件的读写。

文件操作 学习编程操作中&#xff0c;我觉得文件操作是必不可少的一部分。不管是读书的时候学习的c&#xff0c;c&#xff0c;工作的前学的java&#xff0c;现在学的Python&#xff0c;没学过的php和go&#xff0c;都有文件操作的模块以及库的支持&#xff0c;重要性毫无疑问。…

【因果推断python】45_估计量1

目录 问题设置 目标转换 到目前为止&#xff0c;我们已经了解了如何在干预不是随机分配的情况下对我们的数据进行纠偏&#xff0c;这会导致混淆偏差。这有助于我们解决因果推理中的识别问题。换句话说&#xff0c;一旦单位是可交换的&#xff0c;或者 &#xff0c;就可以学习…

AI绘画ComfyUI-插件-面部修复,快速入门安装使用!

这期给大家分享一个插件AI绘画 ComfyUI的——Impact Pack ComfyUI也是隶属于Stable Diffusion的工作流形式的AI绘画工具。 这是一个综合节点&#xff0c;这期先介绍下这个插件中的面部修复功能 Impact Pack插件 1、下载插件 在ComfyUI管理器中安装节点&#xff0c;搜索Imp…

[信号与系统]傅里叶变换、卷积定理、和为什么时域的卷积等于频域相乘。

前言 最近学习以下IIR滤波器和FIR滤波器 前置 1. 时域和频域 时域和频域代表着频率和时间与振幅的一一对应关系 2. 卷积运算 关于卷积的定义&#xff0c;详情请看 这篇文章能让你明白卷积 卷积运算是一种数学运算&#xff0c;广泛应用于信号处理、图像处理、控制系统和概…

Unity和UE免费领恐怖书本头怪兽角色模型恐怖或奇幻游戏monster适合FPS类型PBR202406202143

Unity和UE免费领恐怖书本头怪兽角色模型恐怖或奇幻游戏monster适合FPS类型PBR202406202143 Unity恐怖书本头怪兽角色模型&#xff1a;https://prf.hn/l/zpBqgVl UE恐怖书本头怪兽角色模型&#xff1a;https://prf.hn/l/4PzY1Qy 作者其他资产&#xff1a;https://prf.hn/l/0…

RX8025/INS5T8025实时时钟-国产兼容RS4TC8025

该模块是一个符合I2C总线接口的实时时钟&#xff0c;包括一个32.768 kHz的DTCXO。 除了提供日历&#xff08;年、月、日、日、时、分、秒&#xff09;功能和时钟计数器功能外&#xff0c;该模块还提供了大量其他功能&#xff0c;包括报警功能、唤醒定时器功能、时间更新中断功能…

深入理解和实现Windows进程间通信(管道)

进程间通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;是指在不同进程之间的数据传输。进程是操作系统分配资源和调度的独立单位&#xff0c;每个进程都有自己独立的地址空间&#xff0c;一个进程无法直接访问另一个进程的数据。因此&#xff0c;当需…

深度解析RocketMq源码-持久化组件(四) CommitLog

1.绪论 commitLog是rocketmq存储的核心&#xff0c;前面我们介绍了mappedfile、mappedfilequeue、刷盘策略&#xff0c;其实commitlog的核心组件我们基本上已经介绍完成。 2.commitLog的组成 commitLog的核心其实就是MqppedFilequeue&#xff0c;它本质上就是多个mappedFile…

SCI一区TOP|局部强化优化算法(PRO)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;A Taheri受到部分强化效应(PRE)理论启发&#xff0c;提出了局部强化优化算法&#xff08;Partial Reinforcement Optimizer, PRO&#xff09;。 2.算法原理 2.1算法思…

Python数据科学 | 是时候跟Conda说再见了

本文来源公众号“Python数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;是时候跟Conda说再见了 1 简介 conda作为Python数据科学领域的常用软件&#xff0c;是对Python环境及相关依赖进行管理的经典工具&#xff0c;通…

【漏洞复现】红帆iOffice.net wssRtSyn接口处存在SQL注入

【产品&&漏洞简述】 红帆iOffice.net从最早满足医院行政办公需求&#xff08;传统OA&#xff09;&#xff0c;到目前融合了卫生主管部门的管理规范和众多行业特色应用&#xff0c;是目前唯一定位于解决医院综合业务管理的软件&#xff0c;是最符合医院行业特点的医院综…

SVN学习(001 svn安装)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第1p-第p19的内容 介绍 为什么使用版本控制工具 版本控制工具的功能 版本控制简介 客户端服务器结构 c/s结构 服务端的结构&#xff1a; 服务程序 、版本库(存放我们上传的文件) 客户端的三个基本操作&#…

记录一次递归查询导致的 java.lang.StackOverflowError: null

问题截图&#xff1a; 由于作者使用递归统计信息&#xff0c;刚开始这个接口运行得正常&#xff0c;但是上线运行一段时间后接口就出现了&#xff0c;如图的栈溢出错误。可以看出确实是堆栈溢出了&#xff0c;解决栈溢出目前只有两种方式&#xff1a; 第一种调大栈的大小&…

小程序开发的技术难点

小程序开发是一项技术难度较高的工作&#xff0c;需要开发者具备多方面的知识和技能&#xff0c;小程序开发的技术难点主要体现在以下几个方面。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 多端兼容 小程序需要在微信、支付宝…

Flow Matching For Generative Modeling

Flow Matching For Generative Modeling 一、基于流的&#xff08;Flow based&#xff09;生成模型 生成模型 我们先回顾一下所谓的生成任务&#xff0c;究竟是想要做什么事情。我们认为&#xff0c;世界上所有的图片&#xff0c;是符合某种分布 p d a t a ( x ) p_{data}(…

MES管理系统如何设计生产质量管理功能

在现代制造业中&#xff0c;MES管理系统作为连接企业计划层与车间操作层的关键桥梁&#xff0c;其生产者计量管理功能的设计显得尤为重要。一个完善的MES管理系统生产质量管理模块&#xff0c;不仅要求能够实时、准确地采集和分析生产过程中的质量数据&#xff0c;还需要能够与…

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述 游戏暂停的功能是通过设置timeScale0实现的&#xff0c;不过在暂停游戏的时候&#xff0c;需要对角色进行预览和设置&#xff0c;为了实现这个功能&#xff0c;是通过鼠标控制相机的操作&#xff0c;为了使相机的操作丝滑&#xff0c;获取鼠标操作系数乘以Time.delta…