设计模式之备忘录模式

前言

在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定? "状态变化" 模式为这一问题提供了一种解决方案

定义

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

动机

在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节

如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性

案例

代码

cpp 复制代码
class Memento
{
    string state;
    //..
public:
    Memento(const string & s) : state(s) {}
    string getState() const { return state; }
    void setState(const string & s) { state = s; }
};

class Originator
{
    string state;
    //....
public:
    Originator() {}
    Memento createMomento() {
        Memento m(state);
        return m;
    }
    void setMomento(const Memento & m) {
        state = m.getState();
    }
};

int main()
{
    Originator orginator;
    
    //捕获对象状态,存储到备忘录
    Memento mem = orginator.createMomento();
    
    //... 改变orginator状态
    
    //从备忘录中恢复
    orginator.setMomento(memento);
}

类图

总结

备忘录存储原发器对象的内部状态,在需要时恢复原发器状态

备忘录模式的核心是信息隐藏,即Originator需要向外界隐藏信息,保持其封装性。但同时又需要将状态保持到外界

由于现在语言运行时都具有相当的对象序列化支持,因此往往采用效率较高、又较容易正确实现的序列化方案来是备忘录模式

相关推荐
阿洵Rain几秒前
【C++】内存管理
java·jvm·c++
羑悻的小杀马特几秒前
面试题05.08绘制直线问题详解(考察点为位运算符)
c++·算法
碧海蓝天202233 分钟前
新版双向链表,添加了at, front, back, insert, emplace等为了兼容std.
数据结构·c++·链表
WZF-Sang40 分钟前
STL——map和set【map和set的介绍和使用】【multimap和multiset】
开发语言·数据结构·c++·b树·学习·leetcode·visual studio
It'sMyGo3 小时前
js设计模式-工厂模式 单例模式 观察者模式 发布订阅模式 原型模式 代理模式 迭代器模式
观察者模式·单例模式·设计模式
m0_689087073 小时前
9.26 C++杂项
开发语言·c++
边疆.3 小时前
C++入门基础 (超详解)
c语言·开发语言·c++
菲杰克PhyJack3 小时前
C++指针等于地址加偏移量
c++
码力码力我爱你3 小时前
C++软件试用期检测
java·服务器·c++·软件开发·软件试用