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;
}
程序运行结果如下: