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;
}
?程序運行結果如下:
?
?
?