1.备忘录模式简介
- 英文名称
Memento - 主要目的
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。 - 使用场景
1.必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时,它才能恢复到先前的状态;
2.如果一个用接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
2.备忘录模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 代码说明
1.VersionState–版本状态结构,需要保存所有需要恢复的信息;
2.VerMemento–备忘录类,用来存放版本状态;
3.UpdetePro–发起人类,在本例中是指自动升级程序;
3.VersionCaretaker–管理者类,用来保存版本备忘录。注意:
1.本例用备忘录模式来描述软件系统升级失败后的回滚操作;
2.通过备忘录模式,我们可以将软件升级前的状态提前保存,以便升级失败后直接回滚。具体代码
#include <iostream>
#include <string>
using namespace std;
//版本状态值类
typedef struct VersionState
{
string m_SoftWareVersion; //软件版本
string m_FirmWareVersion; //固件版本
int m_InterValue; //校验值,用来表示该版本的唯一性
};
//备忘录类,存放版本状态
class VerMemento
{
public:
//函数功能:版本备忘录类构造函数
//参数: VersionState verState[IN] -- 版本信息
//返回值: 无
VerMemento(const VersionState verState)
{
this->m_VerState = verState;
}
//函数功能:获取版本状态
//参数: 无
//返回值: VersionState -- 存储的版本状态
VersionState GetVersionState()
{
return this->m_VerState;
}
private:
VersionState m_VerState; //版本状态值
};
//发起人类,这里用来表示自动升级程序
class UpdetePro
{
public:
//函数功能:设置版本状态
//参数: const VersionState verState[IN] -- 版本状态
//返回值: 无
void SetVersionState(const VersionState verState)
{
this->m_VerState = verState;
}
//函数功能:获取版本状态
//参数: 无
//返回值: VersionState -- 存储的版本状态
VersionState GetVersionState()
{
return this->m_VerState;
}
//函数功能:利用当前版本状态创建一个备忘录
//参数: 无
//返回值: VerMemento* -- 新建的备忘录指针
VerMemento* CreateVersionMemento()
{
return new VerMemento(this->m_VerState);
}
//函数功能:更新当前版本状态
//参数: VerMemento* verMemento[IN] -- 备忘录指针
//返回值: 无
void SetVersionMemento(VerMemento* verMemento)
{
this->m_VerState = verMemento->GetVersionState();
}
//函数功能:显示版本信息
//参数: 无
//返回值: 无
void ShowVersion()
{
cout << "当前版本信息如下:" << endl;
cout << "软件版本:" << this->m_VerState.m_SoftWareVersion.c_str() << endl;
cout << "固件版本:" << this->m_VerState.m_FirmWareVersion.c_str() << endl;
cout << "版本校验值:" << this->m_VerState.m_InterValue << endl;
}
private:
VersionState m_VerState; //版本状态
};
//管理者类,用来保存备忘录
class VersionCaretaker
{
public:
//函数功能:保存当前版本备忘录
//参数: VerMemento* verMemento[IN] -- 备忘录指针
//返回值: 无
void SetVersionMemento(VerMemento* verMemento)
{
this->m_VersionMemento = verMemento;
}
//函数功能:获取保存的版本备忘录
//参数: 无
//返回值: VerMemento* -- 保存的版本备忘录
VerMemento* GetMemento()
{
return this->m_VersionMemento;
}
private:
VerMemento* m_VersionMemento; //版本备忘录
};
int main()
{
//软件自动升级前
UpdetePro* pUpdater = new UpdetePro();
VersionState verState;
verState.m_SoftWareVersion = "1.0.0.1";
verState.m_FirmWareVersion = "2.1.0.1";
verState.m_InterValue = 1;
pUpdater->SetVersionState(verState);
cout << "软件升级前:" << endl;
pUpdater->ShowVersion();
//保存升级前版本状态
VerMemento* pBeforUpdateMemento = pUpdater->CreateVersionMemento();
VersionCaretaker* pVersinSaver = new VersionCaretaker();
pVersinSaver->SetVersionMemento(pBeforUpdateMemento);
cout << "---------------------------------------------------------" << endl;
//版本升级
cout << "版本升级中..." << endl;
cout << "升级失败!" << endl;
VersionState verStateUpdated;
verStateUpdated.m_SoftWareVersion = "未知软件版本";
verStateUpdated.m_FirmWareVersion = "未知固件版本";
verStateUpdated.m_InterValue = 0;
pUpdater->SetVersionState(verStateUpdated);
pUpdater->ShowVersion();
cout << "---------------------------------------------------------" << endl;
cout << "升级失败,回滚到升级前版本..." << endl;
pUpdater->SetVersionMemento(pVersinSaver->GetMemento());
pUpdater->ShowVersion();
delete pUpdater;
pUpdater = NULL;
delete pBeforUpdateMemento;
pBeforUpdateMemento = NULL;
delete pVersinSaver;
pVersinSaver = NULL;
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(十八)–中介者模式
下一篇:设计模式学习笔记(C++实现)(二十)–观察者模式
参考文献:
1.《设计模式:可复用面向对象软件的基础》