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
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(60)
- 最新
- 精选
- Demon.LeeSystem.out.println(inputText.toString()); ---> System.out.println(inputText.getText());
作者回复: 嗯嗯,多谢!
2020-04-1335 - Geek_5227ac感觉很像prototype原型模式啊,比如考虑到内存,时间的消耗采用增量备份这里,老师能说下具体有什么区别吗?
作者回复: 优化内存和时间这一部分的方法确实有点类似prototype的设计思路。不过,备忘录本身并不是为了优化内存和时间,你可以看看文章的前半段解释。
2020-06-184 - DexterPokerMySQL数据库低频全量备份,结合binlog增量备份,来恢复数据。2020-04-1390
- 张晋 🇨🇳看了王争老师很多课了,觉得都很好,但是不知道是疲惫了还是这个模式不是很重要,感觉没讲好,后面查看了网上资料才知道 Originator:发起者,负责创建一个备忘录,并且可以记录、恢复自身的内部状态。可以根据需要决定Memento保存自身的那些内部状态 Memento:备忘录,用于存储Originator的状态,防止Originator以外的的对象访问Memento Caretaker:备忘录管理者,负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。 作者:MrTrying 链接:https://www.jianshu.com/p/78b519d39fe5 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 可能老师觉得比较基础所以没讲吧,感觉听的云里雾里的。2020-07-03438
- jaryoung游戏存档是不是很典型的例子?想当年,玩《勇者斗恶龙》的时候,打不过boss不断回到存档的地方,不断尝试。2020-04-13223
- Jackey想起了Redis主从同步的增量和全量模式2020-04-13123
- 何用老师用词太过主观了,灌输访问者模式难理解的潜意识。我倒觉得 Single Dispatch 和 Double Dispatch 容易理解,反倒是今天的备忘模式难理解了。。。2020-04-13711
- Smile @ Liferedis通过备份的形式进行持久化,分为两种模式 1、RDS:低频率全量备份 2、AOF: 高频率增量备份 而在AOF模式下通过配置auto-aof-rewrite来达到全量备份和增量备份相结合以减小AOF的备份大小 https://redis.io/topics/persistence2020-07-3119
- 蹦哒理一下备忘录模式诞生的过程: 1.对于备份这个需求,一开始自然的想法是一个备份类(snapshot)里面保存一份数据(inputText)来做备份。inputText原来是用来表示数据的,没有提供setText这样的方法的必要,但是由于需要备份,使得inputText需要提供setText方法以便实现备份需求 2.为了实现备份需求,提供了setText方法,破坏了inputText原来的封装特性,即:类只需暴露有限的必要访问接口。这本不应该是inputText所应该提供的接口 3.为了解决破坏封装性问题,备忘录模式里面单独定义了用来备份的数据类(String)。从而备份的需求就不影响原来的inputText的设计了 4.除了备份还需要恢复,这个需求就不得不改动原来inputText的设计了,因为恢复的目标就是inputText,所以inputText需要提供相关恢复的restore方法 以上便诞生了备忘录模式:单独用一个新的类保存原来的数据(备份),原来对象提供新接口接收数据恢复(恢复)2020-06-278
- 忆水寒还有比如word写文章的时候,选择撤销。这也是一种备忘录模式的实现。可以参考这个文章https://mp.weixin.qq.com/s/J5a5ZcNCBBExpyCpU2o3wg2020-04-228
收起评论