Skip to content

备忘录模式:这款游戏你玩过吗?是不是经常”重来“?

lvgo edited this page Nov 28, 2020 · 1 revision

备忘录(Memento)模式

在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。

还记得那些年你的游戏存档吗?

Don't Starve

Don't Starve.jpg

unascribed-game1

unascribed-game.jpg

unascribed-game2

unascribed-game2.jpg

自己实现一个简易版的游戏存档功能

今天写一个游戏存档功能练习一下编码基本功。

需求分析

  1. 需要有个管理存档的角色,那么多个存档总要有人来管啊,想存档或者读档需要它说了算。
  2. 还需要有个具体的存档对象,方便我们管理呀。

需求设计

  1. 存档对象的管理角色 Caretaker 管理存档对象
  2. 存档对象 Memento 具体的存档对象
  3. 存档的创建者 Originator 管理“存档”这件事,创建恢复存档。

代码 📃

完整源码关注回复“源码获取”

memento-source

测试结果

memento-test

展示存档列表

memento-list-test

备忘录模式类图 📌

memento-UML1

上面的代码是以这种类图方式实现的,不过这在 Java 中显然有可以优化的地方。即将 Caretaker 角色优化掉。优化后的类图

memento-UML2

两个写法的完整源码关注回复“源码获取”,优化版代码在 optimization 目录中

总结 📚

由于备忘录模式使用这种代码构建的方式在 Java 中并不多,这要得益于 Java 的 Serializable 接口,可以使用序列化来完成备份的操作。所以只是简单的使用一个游戏存档案例记录一下这个知识点,配合学习理解的最好的再就应该是文档编辑功能中的 ctrl+z了。

备忘录模式可以使我们对一个对象的状态进行保存,在需要的时候快速恢复。不得不说的就是备忘录模式如果保存的大量的对象时,内存的占用还是需要关注一下的。在备忘录模式中保存对象的时候,可以配合原型模式来一起使用。

最后,这个模式在 Java 中应该不太香,原因上面也说了。所以我对这个设计模式仅作为了解,真正要使用它的话我还是会尽可能的考虑使用 Serializable

**优点:**无侵入备份/恢复对象状态(在 Java 里不是很香)。

缺点:GOF 中的写法在 Java 中不香,同时使用这种模式需考虑内存占用问题。

目录

首页_HOME

1. 单例模式: 资源!要合理的分配使用!

2. 原型模式:啥?盗图、盗文章的人居然用的是一种设计模式!原型模式?

3. 工厂模式:像工厂一样创建对象,让业务代码更专注!

4. 抽象工厂模式:抽象工厂模式和工厂模式有区别吗?

5. 建造者模式:学个设计模式还和人生扯上关系了?

6. 代理模式:有什么问题跟我律师说吧!

7. 装饰者模式:玩了把坦克大战居然彻底搞懂了装饰者模式!

8. 桥接模式:这个不常用的设计模式居然被我学的最透,草率了!

9. 适配器模式:今天轻松点,就说说什么是“榫”,什么是“卯”,什么是“榫卯”!

10. 外观模式:书生的家书是谁送的?书童到底是个什么角色?

11. 享元模式:如果让你开发英雄联盟的兵线,你会怎么设计?

12. 组合模式:使用组合模式做一个简单的推荐功能

13. 策略模式:学习JDK的比较器架构是如何设计的

14. 模板方法模式:你知道AQS它是干什么的吧,那这个框架是怎么设计的呢?

15. 观察者模式:原来观察者模式是JDK与生俱来的

16. 责任链模式:“张三为了纪念王二请假的悲催经历想出来的一种设计模式”

17. 备忘录模式:这款游戏你玩过吗?是不是经常”重来“?

18. 迭代器模式:你真的“会”遍历list吗?

19. 命令模式:如果把请求变成一个对象,在一些场景更好用!

20. 状态模式:从工作状态,再到订单状态一点点深入学习状态模式

21. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。

22. 访问者模式:是“凡尔赛”让我“认清”了访问者模式!

23. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。


个人博客 Star Dust

Clone this wiki locally