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);