(十三)备忘录模式

Posted walkinginthesun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(十三)备忘录模式相关的知识,希望对你有一定的参考价值。

1. 定义

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

技术分享图片

  • Originator(发起人),负责创建一个备忘录(Memento),用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态;
  • Memento(备忘录),负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento;
  • Caretaker(管理者),负责保存好备忘录(Memento),不能对备忘录的内容进行操作或查看;

2. 示例

#include <iostream>
#include <string>

struct State
{
    std::string m_switch;
    std::string m_other;
};

class Memento
{
public:
    Memento(State s) :m_state(s){}
    State GetState(){ return m_state; }
private:
    State m_state;
};

class Originator
{
public:
    Memento* CreateMemento(){
        return new Memento(m_state);
    }
    void Recovery(Memento *m){
        m_state = m->GetState();
    }

    void SetState(const State &s){
        m_state = s;
    }
    void Show(){
        std::cout << "state is " << m_state.m_switch << std::endl;
    }
private:
    State m_state;
};

class Caretaker
{
public:
    void SetMemento(Memento *m){
        m_memento = m;
    }
    Memento* GetMemento(){
        return m_memento;
    }
private:
    Memento *m_memento;
};


void Client()
{
    Originator* o = new Originator();
    o->SetState(State{ "on", "" });
    o->Show();

    Memento* m = o->CreateMemento();
    Caretaker c;
    c.SetMemento(m);

    o->SetState(State{ "off", "" });
    o->Show();

    o->Recovery(c.GetMemento());
    o->Show();

    delete o;
    delete m;
}

int main()
{
    Client();
    return 0;
}

技术分享图片

3. 总结

备忘录模式最常见的是用于游戏存档。

以上是关于(十三)备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶篇设计模式之十三 ---- 观察者模式和空对象模式

C#常用代码片段备忘

Flutter 布局备忘录

python基础学习(十三)

python基础学习笔记(十三)

设计模式备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )