设计模式学习笔记(C++实现)(十九)--备忘录模式

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.《设计模式:可复用面向对象软件的基础》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值