• 备忘录模式


    备忘录(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;
    }

    效果:

  • 相关阅读:
    字符串套餐(更新中)
    洛谷P4145 上帝造题的七分钟2 / 花神游历各国(重题:洛谷SP2713 GSS4
    [AHOI2013]作业
    我的配置
    [HAOI2006]受欢迎的牛
    洛谷P1456Monkey King
    洛谷P2331[SCOI2005]最大子矩阵
    如何更换博客背景
    洛谷P2419 [USACO08JAN]牛大赛Cow Contest
    JS正则表达式验证数字
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6877884.html
Copyright © 2020-2023  润新知