美文网首页C++设计模式
【C++设计模式】 备忘录模式

【C++设计模式】 备忘录模式

作者: 小鱼号的代码日记 | 来源:发表于2021-03-05 14:59 被阅读0次
/* 小鱼号的代码日志
 * 设计模式
 * 备忘录模式
 * 在不破坏封装性的前提下
 * 捕获一个对象的内部状态
 * 并在该对象之外保存这个状态
 * 这样以后可将对象恢复到原先保存的状态
 */

#include<iostream>
#include<list>
#include<map>
#include<vector>
using namespace std;

///备忘录对象 保存一些信息
class Memento
{
public:
    Memento(string state)
    {
        m_state = state;
    }
    string getState()
    {
        return m_state;
    }
private:
    string m_state;
};

///原始的对象 一些状态信息需要保存
class Originator
{
public:
    string getState()
    {
        cout << "current state" << m_state << endl;
        return m_state;
    }
    void setState(string strState)
    {
        cout << "changed state" << strState << endl;
        m_state = strState;
    }
    //保存状态对象 返回memento
    Memento* saveState()
    {
        return new Memento(m_state);
    }
    //通过备忘录恢复到原来的状态 从Memento获取
    void getSatetFromMemento(Memento* mem)
    {
        m_state = mem->getState();
        cout << "restore state" << m_state << endl;
    }
private:
    string m_state;
};

///负责保存多个多种备忘录对象
class Caretaker
{
public:
    void add(Memento* mem)
    {
        m_vMem.push_back(mem);
    }

    Memento* get(unsigned int index)
    {
        if(index < m_vMem.size())
            return m_vMem[index];
        else
            return nullptr;
    }
private:
    vector<Memento*> m_vMem;
};

///备忘录模式
void testMemento()
{
    cout << "memento patterns" << endl;
    Originator* originalObj = new Originator();
    Caretaker* car = new Caretaker();
    originalObj->setState("state1");
    ///保存当前状态
    car->add(originalObj->saveState());

    originalObj->setState("state2");
    ///保存当前状态
    car->add(originalObj->saveState());

    originalObj->setState("state3");
    ///保存当前状态
    car->add(originalObj->saveState());

    originalObj->getState();
    originalObj->getSatetFromMemento(car->get(0));
    originalObj->getState();
}

相关文章

网友评论

    本文标题:【C++设计模式】 备忘录模式

    本文链接:https://www.haomeiwen.com/subject/npwrqltx.html