设计模式之备忘录模式(Memento)的C++实现

1、备忘录模式的提出

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

2、需求描述

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

3、代码实现

(1)UML图如下:

设计模式之备忘录模式(Memento)的C++实现_第1张图片

(2)代码实现如下:

#include 
#include 

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"<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;
}

 程序运行结果如下:

设计模式之备忘录模式(Memento)的C++实现_第2张图片

 

 

 

你可能感兴趣的:(设计模式,设计模式,备忘录模式)