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

news2024/10/23 6:23:59

备忘录模式

在这里插入图片描述

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.coloradmin.cn/o/1843343.html

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

相关文章

基于SpringBoot+Vue流浪狗领养管理设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

眼见不一定为实之MySQL中的不可见字符

目录 前言 一、问题的由来 1、需求背景 2、数据表结构 二、定位问题 1、初步的问题 2、编码是否有问题 3、依然回到字符本身 三、深入字符本身 1、回归本质 2、数据库解决之道 3、代码层解决 四、总结 前言 在开始今天的博客内容之前&#xff0c;正在看博客的您先来…

如何更换OpenHarmony SDK API 10

OpenHarmony社区已经发布OpenHarmony SDK API 10 beta版本&#xff0c;有些 Sample案例 也有需要API10。那么如何替换使用新的OpenHarmony SDK API 10呢&#xff1f;本文做个记录。 1、如何获取OpenHarmony SDK 1.1 每日构建流水线 可以从OpenHarmony每日构建站点获取最新的…

【ARMv8/v9 GIC 系列 2 -- GIC SPI 中断的 enable和 disable 配置】

文章目录 GIC 中断 Enable 和 DisableGICD_ISENABLER<n>GICD_ICENABLER<n>参数 n使用举例代码实现注意事项 GIC 中断 Enable 和 Disable 在ARMv8架构中&#xff0c;通用中断控制器&#xff08;GIC&#xff09;负责管理处理器的中断。为了控制和管理这些中断&#…

SPI协议——对外部SPI Flash操作

目录 1. W25Q32JVSSIQ背景知识 1.1 64个可擦除块 1.2 1024个扇区&#xff08;每个块有16个扇区&#xff09; 1.3 页 1. W25Q32JVSSIQ背景知识 W25Q32JV阵列被组织成16,384个可编程页&#xff0c;每页有256字节。一次最多可以编程256个字节。页面可分为16组(4KB扇区清除&…

排序方法——《归并排序》

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

chatgpt: linux 下用纯c 编写ui

在Linux下用纯C语言编写用户界面&#xff08;UI&#xff09;&#xff0c;通常会使用GTK或Xlib。GTK是一个更高级的库&#xff0c;提供了丰富的控件和功能&#xff0c;而Xlib则是一个更底层的库&#xff0c;提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…

第二十四节:带你梳理Vue2 : Vue具名插槽/作用域插槽/v-slot指令

1. 具名插槽 1.1 没有使用具名插槽的问题 有的时候我们在使用子组件时,在子组件模板上不同的位置插入不同的内容, 只有一个插槽显然没法满足我们的需求,看示例: 需求如下: 子组件是一篇文章的结构父组件在调用子组件是给文章插入标题,正文,时间信息 示例代码如下: <di…

随机森林算法详解

随机森林算法详解 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并将它们的预测结果结合起来&#xff0c;来提高模型的准确性和稳定性。随机森林在分类和回归任务中都表现出色&#xff0c;广泛应用于各类机器学习问题。本文…

MySQL功能测试-之应用工程

MySQL功能测试-之应用工程 前言pom.xmlapplication.yml 文件common.vo 包ResultVO config 包properties 包DruidConfigPropertyDruidMonitorProperty AutoFillMetaObjectHandlerDruidConfigFluxConfigurationMyBatisPlusConfig controller 包ClientControllerDruidControllerWe…

Python开发日记--手撸加解密小工具(2)

目录 1. UI设计和代码生成 2.运行代码查看效果 3.小结 1. UI设计和代码生成 昨天讨论到每一类算法设计为一个Tab&#xff0c;利用的是TabWidget&#xff0c;那么接下来就要在每个Tab里设计算法必要的参数了&#xff0c;这里我们会用到组件有Label、PushButton、TextEdit、Ra…

RSA 加密算法的基础数论、基本原理与 Python 实现

Title: RSA 加密算法的基础数论、基本原理与 Python 实现 文章目录 前言I. 数学原理1. 整数环2. 单位元3. 欧拉定理 II. 算法原理1. 扩展欧几里得算法2. RSA 非对称加密算法 III. 算法实现1. 源代码2. 测试结果 总结参考文献 前言 1977 年美国 MIT 的三位数学家 Ronald L. Riv…

gunicorn超时报错[CRITICAL] WORKER TIMEOUT

一. 问题描述 2024-06-18T08:40:39.858804039Z [2024-06-18 08:40:39 0000] [1] [CRITICAL] WORKER TIMEOUT (pid:332) 2024-06-18T08:40:40.918093090Z [2024-06-18 08:40:40 0000] [1] [ERROR] Worker (pid:332) was sent SIGKILL! Perhaps out of memory?二. 原因分析 从…

企业如何做好供应链管理工作?8个步骤及应用详解!

供应链就是采购把东西买进来&#xff0c;生产去加工增值&#xff0c;物流去配送给客户&#xff0c;环环相扣&#xff0c;就形成了供应链。它是将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。 而供应链管理就是做好每个环节的管理&…

前沿重器[50] | 聊聊搜索系统3:文档内容处理

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

【Maven】项目的Maven插件报错

1. 找到本地maven库 2. 删除本地插件 3. 在IDEA上更新pom.xml

【简易版tinySTL】 deque容器

文章目录 基本概念功能思路数据结构循环数组实现 代码实现deque.htest.cpp 代码详解变量push_frontpush_backpop_front、pop_backoperator[]clearprintElementsresize 本实现版本 和 C STL标准库实现版本的区别&#xff1a; 基本概念 功能&#xff1a; 双端数组&#xff0c;可…

300PLC连接Modbus转Profibus网关与阀岛modbusRTU通讯

一、概况 300PLC作为常见的控制器设备&#xff0c;在与阀岛Modbus RTU通讯时&#xff0c;通常需要借助Modbus转Profibus网关&#xff08;XD-MDPB100&#xff09;来实现连接和数据交换。PLC通过Modbus转Profibus网关&#xff08;XD-MDPB100&#xff09;与阀岛Modbus RTU通讯是比…

无约束动态矩阵控制(DMC)

0、前言 动态矩阵控制&#xff08;Dynamic Matrix Control&#xff0c;DMC&#xff09;是一种典型的模型预测控制方法&#xff0c;其不需要被控对象的数学模型&#xff0c;只需要获取被控对象的阶跃响应序列即可实现控制效果&#xff0c;但其需要被控对象是渐近稳定的。 1、稳…

PTA - 编写函数计算薪资

某公司销售员底薪为5000&#xff0c;销售业绩与利润提成的关系如下表所示&#xff08;计量单位&#xff1a;元&#xff09; 编写函数&#xff0c;计算员工月薪。 函数接口定义&#xff1a; salary(sales) 其中 参数 sales表示员工的月销售业绩。 裁判测试程序样例&#xff…