zoukankan      html  css  js  c++  java
  • 大话设计模式--备忘录 Memento -- C++实现实例

    1. 备忘录: 在不破坏封装性的前提下, 捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后可将该对象恢复到原先保存的状态。

    Originator 发起人: 负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。

    Memento 备忘录: 负责储存Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Mementor。

    Caretaker 管理者: 负责保存好备忘录Mementor,不能对备忘录的内容进行操作或检查。

    Memento模式比较使用与功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一个小部分, Originator可以根据

    保存的Mementor信息还原到前一状态。

    实例:

    originator.h originator.cpp

    #ifndef ORIGINATOR_H
    #define ORIGINATOR_H
    
    #include <string>
    #include <iostream>
    #include "memento.h"
    using namespace std;
    
    class Originator
    {
    public:
        Originator();
        void changeState();
        Memento* createMemento();
        void setMemento(Memento *memento);
        void show();
    
    private:
        string state;
    
    };
    
    #endif // ORIGINATOR_H
    #include "originator.h"
    
    Originator::Originator()
    {
        this->state = "state_xxxx";
    }
    
    void Originator::changeState()
    {
        state = "state_change";
    }
    
    Memento* Originator::createMemento()
    {
        return (new Memento(state));
    }
    
    void Originator::setMemento(Memento* memento)
    {
        state = memento->state;
    }
    
    void Originator::show()
    {
        cout << "state: " << state << endl;
    }



    memento.h memento.cpp

    #ifndef MEMENTO_H
    #define MEMENTO_H
    
    #include <string>
    #include <iostream>
    using namespace std;
    
    class Memento
    {
    public:    
        Memento(string state);
        string state;
    
    };
    
    #endif // MEMENTO_H
    #include "memento.h"
    
    Memento::Memento(string state)
    {
        this->state = state;
    }


    caretaker.h caretaker.cpp

    #ifndef CARETAKER_H
    #define CARETAKER_H
    
    #include "memento.h"
    
    class Caretaker
    {
    public:
        Caretaker();
        Memento *memento;
    };
    
    #endif // CARETAKER_H
    #include "caretaker.h"
    
    Caretaker::Caretaker()
    {
        memento = NULL;
    }
    

    main.cpp

    #include <iostream>
    #include "originator.h"
    #include "memento.h"
    #include "caretaker.h"
    using namespace std;
    
    int main()
    {
        cout << "Memento test!" << endl;
    
        Originator o;
        o.show();
    
        Caretaker c;
        c.memento = o.createMemento();
    
        o.changeState();
        o.show();
    
        o.setMemento(c.memento);
        o.show();
    
        return 0;
    }





     

  • 相关阅读:
    element-ui日期筛选:选择日期即触发查询
    js点击按钮复制内容到粘贴板
    axios配置及使用(发起请求时带上token)
    axios + vue导出excel文件
    textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)
    vue复制textarea文本域内容到粘贴板
    ElementUI动态表格数据转换formatter
    elementUI图片墙上传
    高德地图模糊搜索地址(elementUI)
    elementUI表单验证
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648183.html
Copyright © 2011-2022 走看看