-
備忘錄模式:一種行為型設(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
如有錯誤采够,歡迎指正