生活随笔
收集整理的這篇文章主要介紹了
设计模式C++实现(12)——备忘录模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
備忘錄模式:在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)[DP]。舉個(gè)簡(jiǎn)單的例子,我們玩游戲時(shí)都會(huì)保存進(jìn)度,所保存的進(jìn)度以文件的形式存在。這樣下次就可以繼續(xù)玩,而不用從頭開(kāi)始。這里的進(jìn)度其實(shí)就是游戲的內(nèi)部狀態(tài),而這里的文件相當(dāng)于是在游戲之外保存狀態(tài)。這樣,下次就可以從文件中讀入保存的進(jìn)度,從而恢復(fù)到原來(lái)的狀態(tài)。這就是備忘錄模式。
? ? ? ? 給出備忘錄模式的UML圖,以保存游戲的進(jìn)度為例。
? ? ? ? ? Memento類定義了內(nèi)部的狀態(tài),而Caretake類是一個(gè)保存進(jìn)度的管理者,GameRole類是游戲角色類。可以看到GameRole的對(duì)象依賴于Memento對(duì)象,而與Caretake對(duì)象無(wú)關(guān)。下面給出一個(gè)簡(jiǎn)單的是實(shí)現(xiàn)。
[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;?? }??
? ?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的设计模式C++实现(12)——备忘录模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。