生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(12)——备忘录模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態[DP]。舉個簡單的例子,我們玩游戲時都會保存進度,所保存的進度以文件的形式存在。這樣下次就可以繼續玩,而不用從頭開始。這里的進度其實就是游戲的內部狀態,而這里的文件相當于是在游戲之外保存狀態。這樣,下次就可以從文件中讀入保存的進度,從而恢復到原來的狀態。這就是備忘錄模式。
? ? ? ? 給出備忘錄模式的UML圖,以保存游戲的進度為例。
? ? ? ? ? Memento類定義了內部的狀態,而Caretake類是一個保存進度的管理者,GameRole類是游戲角色類。可以看到GameRole的對象依賴于Memento對象,而與Caretake對象無關。下面給出一個簡單的是實現。
[cpp]?view plaincopy print?
?? class?Memento???? {?? public:?? ????int?m_vitality;??? ????int?m_attack;????? ????int?m_defense;???? public:?? ????Memento(int?vitality,?int?attack,?int?defense):??? ??????m_vitality(vitality),m_attack(attack),m_defense(defense){}?? ????Memento&?operator=(const?Memento?&memento)??? ????{?? ????????m_vitality?=?memento.m_vitality;?? ????????m_attack?=?memento.m_attack;?? ????????m_defense?=?memento.m_defense;?? ????????return?*this;?? ????}?? };?? ?? class?GameRole???? {?? private:?? ????int?m_vitality;?? ????int?m_attack;?? ????int?m_defense;?? public:?? ????GameRole():?m_vitality(100),m_attack(100),m_defense(100)?{}?? ????Memento?Save()???? ????{??? ????????Memento?memento(m_vitality,?m_attack,?m_defense);?? ????????return?memento;?? ????}?? ????void?Load(Memento?memento)???? ????{?? ????????m_vitality?=?memento.m_vitality;?? ????????m_attack?=?memento.m_attack;??? ????????m_defense?=?memento.m_defense;?? ????}?? ????void?Show()?{?cout<<"vitality?:?"<<?m_vitality<<",?attack?:?"<<?m_attack<<",?defense?:?"<<?m_defense<<endl;?}?? ????void?Attack()?{?m_vitality?-=?10;?m_attack?-=?10;??m_defense?-=?10;?}?? };?? ?? class?Caretake???? {?? public:?? ????Caretake()?{}?? ????void?Save(Memento?menento)?{?m_vecMemento.push_back(menento);?}?? ????Memento?Load(int?state)?{?return?m_vecMemento[state];?}?? private:?? ????vector<Memento>?m_vecMemento;?? };??
? ? ? ? 客戶使用方式:
[cpp]?view plaincopy print?
?? int?main()?? {????? ????Caretake?caretake;?? ????GameRole?role;??? ????role.Show();????? ????caretake.Save(role.Save());??? ????role.Attack();????? ????role.Show();???? ????role.Load(caretake.Load(0));??? ????role.Show();???? ????return?0;?? }??
? ?
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的设计模式C++实现(12)——备忘录模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。