看完,你也能用备忘录模式手写一个游戏的存档功能!

2023-09-13 12:35:45 浏览数 (1)

今天和大家聊一聊备忘录模式(Memento Design Pattern)

简介

还是把这张概总图放这里。

备忘录模式,也叫快照(Snapshot)模式,英文翻译是Memento Design Pattern。在 GoF 的《设计模式》一书中,备忘录模式是这么定义的:

Captures and externalizes an object’s internal state so that it can be restored later, all without violating encapsulation.

翻译成中文就是:在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。

概念性的东西,表述得很正确,但如果不懂的,依旧不明白它在说什么。

举个例子给大家分享下:

游戏中的存档功能就是备忘录模式。我们在玩游戏时,到一定的进度时,我们觉得当前的状态就是最有利的,因此我们会调用存档的功能,把当前的状态存储到某个地方或者某个文件中。当我们后续的某个操作出现问题时,再读取存档就能回到我们刚才保存的进度。

示例解析

就刚才的例子。我们把整个游戏看做一个对象:Game。在这个游戏中,我们的进度,就是描述的当前游戏的状态,比如我们赚取的金布数量。因此,在 Game 中始终有一个金币数量的状态:money。

现在,我们想要把这个金币的数量进行存档。在游戏中,是不是经常有一个存档的功能?这就对应着:Game中有一个存档的功能方法。同样,我们进行读档的时候,对应着的就是 Game 中读档的功能方法。

存档或读档的数据也是游戏的一种状态。我们不会把这个存档的状态和 Game 中现有的状态混在一起。因为在读档的时候,存档中的状态会覆盖 Game 中原有的状态。因此,我们需要一个独立的对象来表示这个存档状态(为什么用对象呢?因为我们的状态可能不止金币,可能还有装备,或者其他的):Memento。

目前,我们已经提到了备忘录中的两个角色了:发起者角色(Game)和备忘录角色(Memento)。

注意,这里还有一个角色:备忘录管理者角色。它用来管理备忘录,仅提供备忘录的存储和获取。为什么呢?因为你的备忘录可能不止一个,就像你的存档不止一个一样。

0 人点赞