• 18.备忘录模式(Memento)


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

    上下文:某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公共接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的保存与恢复,但同时又不会因此而破坏对象本身的封装性?

    在这里插入图片描述

    Memento:存储Originator(原发器)的内部状态,原发器根据需要决定Memento存储自己的哪些内部状态;防止Originator以外的其他对象访问Memento。Memento实际有两个接口,Caretaker只能看到其窄接口(只能将Memento传递给其他对象);而Originator可以看到一个宽接口(允许访问返回到之前状态所需的数据)。理想情况是,只允许生成该Memento的那个Originator访问该Memento的内部状态。
    Originator:创建一个Memento,用以记录当前时刻的内部状态;使用Memento恢复内部状态。
    Caretaker:负责保存Memento;不能对Memento的内容进行操作或检查。

    在这里插入图片描述

    代码

    #include 
    #include 
    using namespace std;
     
     
    class Memento;
    class Originator{
    public:
        string state;
        string getState() const;
        void setState(const string &value);
        Memento *CreateMemento();
        void SetMemento(Memento *memento);
        void show();
    };
    class Memento
    {
    public:
        string state;
        Memento(string s):state(s){
     
        }
        string getState() const;
    };
    string Memento::getState() const
    {
        return state;
    }
     
    Memento *Originator::CreateMemento(){
        return new Memento(state);
    }
     
    void Originator::SetMemento(Memento *memento)
    {
        this->state = memento->state;
    }
     
    void Originator::show()
    {
        cout << "state:" << this->state << endl;
    }
    class Caretaker
    {
    public:
        Memento *memento;
     
     
        Memento *getMemento() const;
        void setMemento(Memento *value);
    };
     
    Memento *Caretaker::getMemento() const
    {
        return memento;
    }
     
    void Caretaker::setMemento(Memento *value)
    {
        memento = value;
    }
     
     
    string Originator::getState() const
    {
        return state;
    }
     
    void Originator::setState(const string &value)
    {
        state = value;
    }
     
    int main(void)
    {
        Originator *o = new Originator();
        o->state = "on";
        o->show();
     
        Caretaker *c = new Caretaker();
        c->memento = o->CreateMemento();
     
        o->state = "off";
        o->show();
     
        o->SetMemento(c->memento);
        o->show();
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

    结果

    state:on
    state:off
    state:on
    
    • 1
    • 2
    • 3
  • 相关阅读:
    我们被一个 kong 的性能 bug 折腾了一个通宵
    ZooKeeper设置ACL权限控制,删除权限
    DOM与BOM
    pandas Series矢量化的字符串函数——Series.str
    怎么实现一个登录时需要输入验证码的功能
    Probuf定义详解
    Vue收集表单数据
    【LeetCode】刷题模版/套路合集(持续更新)
    使用二叉树的递归套路来解决的问题
    2022年重庆成人本科可以考研吗?
  • 原文地址:https://blog.csdn.net/qq_40178082/article/details/133068068