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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值