0
点赞
收藏
分享

微信扫一扫

GraphScope,开源图数据分析引擎的领航者

笑望叔叔 2023-08-23 阅读 61

1、备忘录模式的提出

在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不破坏对象封装性的前提下,增加一个备忘录类,用于保存捕获对象的内部状态。当该对象需要回溯到之前状态时,只需调用备忘录接口获取之前的状态,并设置状态。

2、需求描述

有一个设备信息,该设备的状态有打开设备、打开app1、app2等操作。设计一个可以回溯设备状态信息的功能代码。

3、代码实现

(1)UML图如下:

(2)代码实现如下:

#include <iostream>
#include <string>

class Memento
{
private:
    std::string m_strState;
public:
    Memento(std::string state):m_strState(state){};

    std::string getState()const
    {
        return m_strState;
    }
};

class DevInfo
{
private:
    std::string m_strState;

public:
    void setState(const std::string& state)
    {
        m_strState = state;
    }

    std::string getState()const
    {
        return m_strState;
    }

    Memento* createMemento()
    {
        return new Memento(m_strState);
    }

    void restoreMemento(Memento* memento)
    {
        m_strState = memento->getState();
    }
};

class Client
{
private:
    DevInfo* m_devInfo{nullptr};
    Memento* m_memento{nullptr};

public:
    Client()
    {
        m_devInfo = new DevInfo();
    }
    ~Client()
    {
        std::cout << "~Client"<<std::endl;
        delete m_devInfo;
        m_devInfo = nullptr;
        delete m_memento;
        m_memento = nullptr;
    }

    void setDevState(std::string state)
    {
        m_devInfo->setState(state);
        std::cout << "setDevState: "<< m_devInfo->getState() << std::endl;
    }
    void saveDevState()
    {
         m_memento = m_devInfo->createMemento();
         std::cout << "saveDevState "<<  std::endl;
    }
    void restoreDevState()
    {
        m_devInfo->restoreMemento(m_memento);
        std::cout << "restoreDevState: "<< m_devInfo->getState() << std::endl;
    }
};

int main()
{
    Client obj;
    obj.setDevState("Open Dev");
    obj.setDevState("Open app 1");
    obj.setDevState("Open app 2");
    obj.saveDevState();
    obj.setDevState("Open app 3");
    obj.restoreDevState();
    return 0;
}

 程序运行结果如下:

 

 

 

举报

相关推荐

0 条评论