C++ 設(shè)計模式 —— 18.備忘錄模式

  • 備忘錄模式:一種行為型設(shè)計模式

  • 應(yīng)用場景:
    備忘錄模式是對原型模式的進一步思考利职,因為有些時候我們并不需要一個完整對象的拷貝掏颊,只需要拷貝對象的一部分數(shù)據(jù)作為備份即可糟红。
    最典型的例子是虛擬機VWware,它的快照功能用以保存系統(tǒng)當(dāng)前狀態(tài)以便日后恢復(fù)乌叶。但如果是使用原型模式實現(xiàn)這個功能盆偿,每次快照時都需要生成一個完整的系統(tǒng)文件,是非常占用空間的准浴。于是便進一步思考事扭, 備份的時候只備份系統(tǒng)中必要的狀態(tài)信息,日后通過這份不完整的備份信息乐横,也可以使系統(tǒng)恢復(fù)到快照中的狀態(tài)求橄,就可以避免無用的備份信息占用空間。
    每次的快照就是備忘記錄葡公,再指定一個管理者來管理所有的快照罐农,這就是備忘錄模式

  • 舉例:
    假設(shè)有一個游戲角色催什,它有很多屬性涵亏,如姓名、血量蒲凶、攻擊力等气筋,在存檔備份的時候并不需要生成一個完整的角色對象作為拷貝,只需要存儲血量旋圆、攻擊力即可宠默,因為姓名不會隨著游戲進度更改。

  • 實現(xiàn)方式:
    為角色類創(chuàng)建一個對應(yīng)的備份類灵巧,該類中只將必要的備份信息作為成員變量
    在角色類中實現(xiàn)一個方法光稼,該方法創(chuàng)建一個備份類對象作為返回值。
    然后再創(chuàng)建一個管理者類孩等,使用容器存放備份類對象。


以下是備忘錄模式的簡單代碼實現(xiàn)
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//單條備忘的記錄
class Memento
{
public:
    Memento(uint32_t uiLevel, uint32_t uiHp, uint32_t uiAttack)
        :m_uiLevel(uiLevel),m_uiHp(uiHp),m_uiAttack(uiAttack)
    {
    }
public:
    uint32_t m_uiLevel;
    uint32_t m_uiHp;
    uint32_t m_uiAttack;
};

//需要保存的數(shù)據(jù)類
class GameRole
{
public:
    GameRole(string strName)
        :m_strName(strName)
        ,m_uiLevel(1)
        ,m_uiHp(100)
        ,m_uiAttack(10)
    {
    }

    void Show()
    {
        cout << "Name:" << m_strName << " Level:" << m_uiLevel << " HP:" << m_uiHp << " ATK:" << m_uiAttack << endl;
    }

    Memento* Save()
    {
        Memento* pSaveInfo = new Memento(m_uiLevel, m_uiHp, m_uiAttack);
        return pSaveInfo;
    }

    void Load(Memento* pMem)
    {
        m_uiLevel = pMem->m_uiLevel;
        m_uiHp = pMem->m_uiHp;
        m_uiAttack = pMem->m_uiAttack;
        cout << "Loaded" << endl;
    }

private:
    string m_strName;
public:
    uint32_t m_uiLevel;
    uint32_t m_uiHp;
    uint32_t m_uiAttack;
};

//備忘管理者
class Recorder
{
public:
    void Record(Memento* pMem)
    {
        vecMemento.push_back(pMem);
        cout << "Saved" << endl;
    }
    Memento* Get(uint32_t uiIndex)
    {
        return vecMemento[uiIndex];
    }

private:
    vector<Memento*> vecMemento;
};
主函數(shù)中的使用
int main()
{
    Recorder oRecorder;
    GameRole oPlayer("Mark");
    oPlayer.Show();

    oRecorder.Record(oPlayer.Save());

    oPlayer.m_uiLevel = 100;
    oPlayer.m_uiHp = 1000;
    oPlayer.m_uiAttack = 100;
    oPlayer.Show();

    oPlayer.Load(oRecorder.Get(0));
    oPlayer.Show();

    return 0;
}
控制臺輸出結(jié)果
Name:Mark Level:1 HP:100 ATK:10
Saved
Name:Mark Level:100 HP:1000 ATK:100
Loaded
Name:Mark Level:1 HP:100 ATK:10

如有錯誤采够,歡迎指正

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肄方,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹬癌,更是在濱河造成了極大的恐慌权她,老刑警劉巖虹茶,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隅要,居然都是意外死亡蝴罪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門步清,熙熙樓的掌柜王于貴愁眉苦臉地迎上來要门,“玉大人,你說我怎么就攤上這事廓啊』端眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵谴轮,是天一觀的道長炒瘟。 經(jīng)常有香客問我,道長第步,這世上最難降的妖魔是什么疮装? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任粘都,我火速辦了婚禮廓推,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘受啥。我一直安慰自己,他們只是感情好鸽心,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布滚局。 她就那樣靜靜地躺著,像睡著了一般顽频。 火紅的嫁衣襯著肌膚如雪藤肢。 梳的紋絲不亂的頭發(fā)上糯景,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天嘁圈,我揣著相機與錄音蟀淮,去河邊找鬼最住。 笑死,一個胖子當(dāng)著我的面吹牛涨缚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播策治,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼脓魏,長吁一口氣:“原來是場噩夢啊……” “哼兰吟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茂翔,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎珊燎,沒想到半個月后惭嚣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡俐末,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卓箫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片载矿。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烹卒,靈堂內(nèi)的尸體忽然破棺而出闷盔,到底是詐尸還是另有隱情旅急,我是刑警寧澤逢勾,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站溺拱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谣辞。R本人自食惡果不足惜迫摔,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泥从。 院中可真熱鬧句占,春花似錦躯嫉、人聲如沸纱烘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帆阳,卻和暖如春啤它,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工变骡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芭逝。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓塌碌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旬盯。 傳聞我的和親對象是個殘疾皇子台妆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 定義 備忘錄模式又叫做快照模式(Snapshot Pattern)或Token模式,是對象的行為模式胖翰。 備忘錄對象...
    步積閱讀 2,932評論 0 2
  • 1.初識備忘錄模式 在不破壞封裝性的前提下接剩,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)萨咳。這樣以后就可將該對...
    王偵閱讀 468評論 0 0
  • 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述備忘錄(Memento)模式的:備忘錄模式又叫做快照模式(Sna...
    Ant_way閱讀 782評論 0 0
  • 面向?qū)ο蟮牧笤瓌t 單一職責(zé)原則 所謂職責(zé)是指類變化的原因懊缺。如果一個類有多于一個的動機被改變,那么這個類就具有多于...
    JxMY閱讀 931評論 1 3
  • 我家小女初長成培他, 課外之余練寫生鹃两。 如今求學(xué)他鄉(xiāng)去, 姑且保留兩幅圖舀凛。 閑來沒事翻舊冊俊扳, 發(fā)現(xiàn)藏著小鳥圖。 雖然初...
    風(fēng)兒也溫柔閱讀 9,964評論 89 145