首页 > 代码库 > 备忘录模式

备忘录模式

备忘录(Memento)模式

意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。

应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。

代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 记录要保存的数据
class Memento
{
public:
    Memento(string s) :_state(s){}
    string getState() { return _state; }
private:
    string _state;
};

class Originator
{
public:
    void setState(string s)
    {
        _state = s;
    }
    
    string getState()
    {
        return _state;
    }

    Memento *saveStateToMemento()
    {
        return new Memento(_state);
    }

    void getStateFromMemento(Memento *m)
    {
        _state = m->getState();
    }

private:
    string _state;
};


//管理类
class CareTaker
{
public:
    CareTaker()
    {
        _mementoList.clear();
    }

    ~CareTaker()
    {
        for (auto it = _mementoList.begin(); it != _mementoList.end(); ++it)
        {
            delete *it;
        }
        _mementoList.clear();
    }

    void add(Memento *m)
    {
        _mementoList.push_back(m);
    }

    Memento *get(int index) {
        if (index < 0 || index >= _mementoList.size())
            return NULL;
        return _mementoList[index];
    }

private:
    vector<Memento*> _mementoList;
};

void test()
{
    Originator orignator;
    CareTaker careTaker;
    orignator.setState("State #1");
    orignator.setState("State #2");
    careTaker.add(orignator.saveStateToMemento());
    orignator.setState("State #3");
    careTaker.add(orignator.saveStateToMemento());
    orignator.setState("State #4");
    cout << "Current State: " << orignator.getState() << endl;
    orignator.getStateFromMemento(careTaker.get(0));
    cout << "Current State: " << orignator.getState() << endl;
    orignator.getStateFromMemento(careTaker.get(1));
    cout << "Current State: " << orignator.getState() << endl;
}

int main()
{
    test();
    cin.get();
    return 0;
}

效果:

技术分享

 

备忘录模式