您的位置: 首页 > IT文章 > C语言兑现《大话设计模式》中的备忘录模式例程 C语言兑现《大话设计模式》中的备忘录模式例程 分类: IT文章 • 2023-11-12 19:22:54 C语言实现《大话设计模式》中的备忘录模式例程#ifndef __ROLESTATEMEMENTO_H__ #define __ROLESTATEMEMENTO_H__ #include "rtthread.h" //角色状态存储箱类 typedef struct _RoleStateMemento RoleStateMemento; struct _RoleStateMemento { void *PrivateData; int (*GetVitality)(RoleStateMemento *me); //体力 void (*SetVitality)(RoleStateMemento *me, int Vit); int (*GetAttack)(RoleStateMemento *me); //攻击力 void (*SetAttack)(RoleStateMemento *me, int Atk); int (*GetDefense)(RoleStateMemento *me); //防御力 void (*SetDefense)(RoleStateMemento *me, int Def); void (*Destroy)(RoleStateMemento *me); //析构 }; extern RoleStateMemento *RoleStateMemento_Create(rt_size_t Size, int Vit, int Atk, int Def); #endif #include "RoleStateMemento.h" //私有变量放此处,外部无法操作得到 typedef struct _Private Private; struct _Private { int Vit; int Atk; int Def; }; static int GetVitality(RoleStateMemento *me) //体力 { return ((Private *)me->PrivateData)->Vit; } static void SetVitality(RoleStateMemento *me, int Vit) { ((Private *)me->PrivateData)->Vit = Vit; } static int GetAttack(RoleStateMemento *me) //攻击力 { return ((Private *)me->PrivateData)->Atk; } static void SetAttack(RoleStateMemento *me, int Atk) { ((Private *)me->PrivateData)->Atk = Atk; } static int GetDefense(RoleStateMemento *me) //防御力 { return ((Private *)me->PrivateData)->Def; } static void SetDefense(RoleStateMemento *me, int Def) { ((Private *)me->PrivateData)->Def = Def; } static void Destroy(RoleStateMemento *me) //析构 { rt_free(me->PrivateData); rt_free(me); } RoleStateMemento *RoleStateMemento_Create(rt_size_t Size, int Vit, int Atk, int Def) { Private *PrivateData; RoleStateMemento *me = (RoleStateMemento *)rt_malloc(Size); me->PrivateData = rt_malloc(sizeof(Private)); PrivateData = me->PrivateData; PrivateData->Vit = Vit; PrivateData->Atk = Atk; PrivateData->Def = Def; me->Destroy = Destroy; me->GetAttack = GetAttack; me->GetDefense = GetDefense; me->GetVitality = GetVitality; me->SetAttack = SetAttack; me->SetDefense = SetDefense; me->SetVitality = SetVitality; return me; } #ifndef __GAMEROLE_H__ #define __GAMEROLE_H__ #include "rtthread.h" #include "RoleStateMemento.h" //游戏角色类 typedef struct _GameRole GameRole; struct _GameRole { void *PrivateData; int (*GetVitality)(GameRole *me); //体力 void (*SetVitality)(GameRole *me, int Vit); int (*GetAttack)(GameRole *me); //攻击力 void (*SetAttack)(GameRole *me, int Atk); int (*GetDefense)(GameRole *me); //防御力 void (*SetDefense)(GameRole *me, int Def); void (*StateDisplay)(GameRole *me); //状态显示 void (*GetInitState)(GameRole *me); //获得初始状态 void (*Fight)(GameRole *me); //战斗 void (*Destroy)(GameRole *me); //析构 RoleStateMemento *(*SaveState)(GameRole *me); //保存角色状态 void (*RecoeveryState)(GameRole *me, RoleStateMemento *Memento); //恢复角色状态 }; extern GameRole *GameRole_Create(rt_size_t Size); //构造函数 #endif #include "GameRole.h" //私有变量放此处,外部无法操作得到 typedef struct _Private Private; struct _Private { int Vit; int Atk; int Def; }; static int GetVitality(GameRole *me) //体力 { return ((Private *)me->PrivateData)->Vit; } static void SetVitality(GameRole *me, int Vit) { ((Private *)me->PrivateData)->Vit = Vit; } static int GetAttack(GameRole *me) //攻击力 { return ((Private *)me->PrivateData)->Atk; } static void SetAttack(GameRole *me, int Atk) { ((Private *)me->PrivateData)->Atk = Atk; } static int GetDefense(GameRole *me) //防御力 { return ((Private *)me->PrivateData)->Def; } static void SetDefense(GameRole *me, int Def) { ((Private *)me->PrivateData)->Def = Def; } static void StateDisplay(GameRole *me) //状态显示 { Private *PrivateData = me->PrivateData; rt_kprintf(" 角色当前状态:\n"); rt_kprintf(" 体力:%d\n", PrivateData->Vit); rt_kprintf(" 攻击力:%d\n", PrivateData->Atk); rt_kprintf(" 防御力:%d\n", PrivateData->Def); } static void GetInitState(GameRole *me) //获得初始状态 { Private *PrivateData = me->PrivateData; PrivateData->Atk = 100; PrivateData->Vit = 100; PrivateData->Def = 100; } static void Fight(GameRole *me) //战斗 { Private *PrivateData = me->PrivateData; PrivateData->Atk = 0; PrivateData->Vit = 0; PrivateData->Def = 0; } static RoleStateMemento *SaveState(GameRole *me) //保存角色状态 { Private *PrivateData = me->PrivateData; return RoleStateMemento_Create(sizeof(RoleStateMemento), PrivateData->Vit, PrivateData->Atk, PrivateData->Def); } static void RecoeveryState(GameRole *me, RoleStateMemento *Memento) //恢复角色状态 { Private *PrivateData = me->PrivateData; PrivateData->Vit = Memento->GetVitality(Memento); PrivateData->Atk = Memento->GetAttack(Memento); PrivateData->Def = Memento->GetAttack(Memento); } static void Destroy(GameRole *me) //析构 { rt_free(me->PrivateData); rt_free(me); } //构造函数 GameRole *GameRole_Create(rt_size_t Size) { GameRole *me = (GameRole *)rt_malloc(Size); me->PrivateData = (Private *)rt_malloc(sizeof(Private)); me->Destroy = Destroy; me->Fight = Fight; me->GetAttack = GetAttack; me->GetDefense = GetDefense; me->GetVitality = GetVitality; me->GetInitState = GetInitState; me->RecoeveryState = RecoeveryState; me->SaveState = SaveState; me->SetAttack = SetAttack; me->SetVitality = SetVitality; me->SetDefense = SetDefense; me->StateDisplay = StateDisplay; return me; } #ifndef __ROLESTATECARETAKER_H__ #define __ROLESTATECARETAKER_H__ #include "rtthread.h" #include "RoleStateMemento.h" //角色状态管理者类 typedef struct _RoleStateCaretaker RoleStateCaretaker; struct _RoleStateCaretaker { void *PrivateData; RoleStateMemento *(*GetMemento)(RoleStateCaretaker *me); void (*SetMemento)(RoleStateCaretaker *me, RoleStateMemento *Memento); void (*Destroy)(RoleStateCaretaker *me); void (*Cleanup)(RoleStateCaretaker *me); }; extern RoleStateCaretaker *RoleStateCaretaker_Create(rt_size_t Size); #endif #include "RoleStateCaretaker.h" //私有变量放此处,外部无法操作得到 typedef struct _Private Private; struct _Private { RoleStateMemento *Memento; }; static RoleStateMemento *GetMemento(RoleStateCaretaker *me) { return ((Private*)me->PrivateData)->Memento; } static void SetMemento(RoleStateCaretaker *me, RoleStateMemento *Memento) { ((Private*)me->PrivateData)->Memento = Memento; } static void Cleanup(RoleStateCaretaker *me) { if(((Private *)me->PrivateData)->Memento != RT_NULL) { rt_free(((Private*)me->PrivateData)->Memento); } ((Private*)me->PrivateData)->Memento = RT_NULL; } static void Destroy(RoleStateCaretaker *me) { rt_free(me->PrivateData); rt_free(me); } RoleStateCaretaker *RoleStateCaretaker_Create(rt_size_t Size) { RoleStateCaretaker *me = (RoleStateCaretaker *)rt_malloc(Size); me->PrivateData = rt_malloc(sizeof(Private)); me->Destroy = Destroy; me->GetMemento = GetMemento; me->SetMemento = SetMemento; me->Cleanup = Cleanup; return me; } #ifndef __MEMENTO_H__ #define __MEMENTO_H__ #include "rtthread.h" #include "finsh.h" #include "GameRole.h" #include "RoleStateCaretaker.h" #include "RoleStateMemento.h" #endif #include "Memento.h" //客户端 void Memento(void) { GameRole *LiXiaoYao = GameRole_Create(sizeof(GameRole)); RoleStateCaretaker *StateAdmin = RoleStateCaretaker_Create(sizeof(RoleStateCaretaker)); //大战BOSS前 LiXiaoYao->GetInitState(LiXiaoYao); LiXiaoYao->StateDisplay(LiXiaoYao); //保存进度 StateAdmin->SetMemento(StateAdmin, LiXiaoYao->SaveState(LiXiaoYao)); //大战BOSS,损耗严重 LiXiaoYao->Fight(LiXiaoYao); LiXiaoYao->StateDisplay(LiXiaoYao); //恢复初态 LiXiaoYao->RecoeveryState(LiXiaoYao, StateAdmin->GetMemento(StateAdmin)); LiXiaoYao->StateDisplay(LiXiaoYao); StateAdmin->Cleanup(StateAdmin); LiXiaoYao->Destroy(LiXiaoYao); StateAdmin->Destroy(StateAdmin); } FINSH_FUNCTION_EXPORT(Memento, Memento Modle);