设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

70 | 备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗?

数据改动备份
撤销操作
只备份必要的恢复信息
低频全量备份 + 高频增量备份
备份:架构设计或产品设计
备忘录模式:代码设计和实现
防丢失、撤销、恢复
不违背封装原则
保存状态以便恢复
捕获对象内部状态
备份在架构或产品设计中的应用场景
如何优化备份的内存和时间消耗?
备忘录模式如何不违背封装原则?
存储副本为何违背封装原则?
例子
优化内存和时间消耗
与备份的区别
应用场景
定义
课堂讨论
问题
备忘录模式

该思维导图由 AI 生成,仅供参考

上两节课,我们学习了访问者模式。在 23 种设计模式中,访问者模式的原理和实现可以说是最难理解的了,特别是它的代码实现。其中,用 Single Dispatch 来模拟 Double Dispatch 的实现思路尤其不好理解。不知道你有没有将它拿下呢?如果还没有弄得很清楚,那就要多看几遍、多自己动脑经琢磨一下。
今天,我们学习另外一种行为型模式,备忘录模式。这个模式理解、掌握起来不难,代码实现比较灵活,应用场景也比较明确和有限,主要是用来防丢失、撤销、恢复等。所以,相对于上两节课,今天的内容学起来相对会比较轻松些。
话不多说,让我们正式开始今天的学习吧!

备忘录模式的原理与实现

备忘录模式,也叫快照(Snapshot)模式,英文翻译是 Memento Design Pattern。在 GoF 的《设计模式》一书中,备忘录模式是这么定义的:
Captures and externalizes an object’s internal state so that it can be restored later, all without violating encapsulation.
翻译成中文就是:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

备忘录模式是一种行为型设计模式,旨在捕获对象的内部状态并在对象之外保存状态,以便之后恢复对象为先前的状态。本文通过一个面试题的例子详细介绍了备忘录模式的原理和实现。文章还讨论了在备份大对象时如何优化内存和时间消耗,提出了低频率全量备份和高频率增量备份相结合的方法。备忘录模式的实现灵活,但需要注意不违背封装原则,避免暴露不应该暴露的函数。此外,备忘录模式与备份的区别在于,备忘录模式更侧重于代码的设计和实现,而备份更侧重于架构设计或产品设计。总的来说,本文内容深入浅出,适合读者快速了解备忘录模式的概念和实际应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(60)

  • 最新
  • 精选
  • Demon.Lee
    System.out.println(inputText.toString()); ---> System.out.println(inputText.getText());

    作者回复: 嗯嗯,多谢!

    2020-04-13
    3
    5
  • Geek_5227ac
    感觉很像prototype原型模式啊,比如考虑到内存,时间的消耗采用增量备份这里,老师能说下具体有什么区别吗?

    作者回复: 优化内存和时间这一部分的方法确实有点类似prototype的设计思路。不过,备忘录本身并不是为了优化内存和时间,你可以看看文章的前半段解释。

    2020-06-18
    4
  • DexterPoker
    MySQL数据库低频全量备份,结合binlog增量备份,来恢复数据。
    2020-04-13
    90
  • 张晋 🇨🇳
    看了王争老师很多课了,觉得都很好,但是不知道是疲惫了还是这个模式不是很重要,感觉没讲好,后面查看了网上资料才知道 Originator:发起者,负责创建一个备忘录,并且可以记录、恢复自身的内部状态。可以根据需要决定Memento保存自身的那些内部状态 Memento:备忘录,用于存储Originator的状态,防止Originator以外的的对象访问Memento Caretaker:备忘录管理者,负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。 作者:MrTrying 链接:https://www.jianshu.com/p/78b519d39fe5 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 可能老师觉得比较基础所以没讲吧,感觉听的云里雾里的。
    2020-07-03
    4
    38
  • jaryoung
    游戏存档是不是很典型的例子?想当年,玩《勇者斗恶龙》的时候,打不过boss不断回到存档的地方,不断尝试。
    2020-04-13
    2
    23
  • Jackey
    想起了Redis主从同步的增量和全量模式
    2020-04-13
    1
    23
  • 何用
    老师用词太过主观了,灌输访问者模式难理解的潜意识。我倒觉得 Single Dispatch 和 Double Dispatch 容易理解,反倒是今天的备忘模式难理解了。。。
    2020-04-13
    7
    11
  • Smile @ Life
    redis通过备份的形式进行持久化,分为两种模式 1、RDS:低频率全量备份 2、AOF: 高频率增量备份 而在AOF模式下通过配置auto-aof-rewrite来达到全量备份和增量备份相结合以减小AOF的备份大小 https://redis.io/topics/persistence
    2020-07-31
    1
    9
  • 蹦哒
    理一下备忘录模式诞生的过程: 1.对于备份这个需求,一开始自然的想法是一个备份类(snapshot)里面保存一份数据(inputText)来做备份。inputText原来是用来表示数据的,没有提供setText这样的方法的必要,但是由于需要备份,使得inputText需要提供setText方法以便实现备份需求 2.为了实现备份需求,提供了setText方法,破坏了inputText原来的封装特性,即:类只需暴露有限的必要访问接口。这本不应该是inputText所应该提供的接口 3.为了解决破坏封装性问题,备忘录模式里面单独定义了用来备份的数据类(String)。从而备份的需求就不影响原来的inputText的设计了 4.除了备份还需要恢复,这个需求就不得不改动原来inputText的设计了,因为恢复的目标就是inputText,所以inputText需要提供相关恢复的restore方法 以上便诞生了备忘录模式:单独用一个新的类保存原来的数据(备份),原来对象提供新接口接收数据恢复(恢复)
    2020-06-27
    8
  • 忆水寒
    还有比如word写文章的时候,选择撤销。这也是一种备忘录模式的实现。可以参考这个文章https://mp.weixin.qq.com/s/J5a5ZcNCBBExpyCpU2o3wg
    2020-04-22
    8
收起评论
显示
设置
留言
60
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部