首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >漫谈模式之备忘录模式

漫谈模式之备忘录模式

作者头像
孟君
发布2023-03-25 12:23:53
发布2023-03-25 12:23:53
5110
举报

今天,我们来分享行为型模式的另外一个成员:备忘录模式

备忘录模式是一种行为型模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

在平时,我们可能需要在某些时候对状态进行保存,然后可以恢复到之前的状态。

比如:下棋的时候可能会出现悔棋,恢复到上一步或者更上一步的状态。再比如,文本编辑器,会有撤销的场景。再比如,玩通关游戏,关卡可能分很多小关,打一个小Boss后需要打一个大Boss,我们需要在某些阶段对游戏快照进行保存,这样可能恢复到之前的状态,继续玩耍。

这种将对象状态外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态,这就是本文今天要说的备忘录模式,又叫快照模式或者Token模式。

备忘录模式的基本介绍

意图

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

结构

备忘录模式的基本结构如下:

这里涉及到的参与者有如下几种:

Memento(备忘录)

备忘录存储原发器对象的内部状态。原发器根据需要决备忘录存储原发器的哪些内部状态。

Originator(原发器)

  • 原发器创建一个备忘录,用于记录当前时刻它的内部状态
  • 使用备忘录恢复内部状态。

Caretaker(负责人)

  • 负责保存好备忘录
  • 不能对备忘录的内容进行操作或者检查。

备忘录模式的示例

接下来,我们就模拟一个游戏存档的场景来给出一个备忘录模式的示例。

Game.java(原发器)

GameProgressMemento.java(备忘录)

GameProgressCaretaker.java(负责人)

Client.java(客户端)

输出结果

至此一个简单的游戏状态保存和状态恢复的示例就完成了。

小结

优缺点

优点:

  • 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
  • 本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。
  • 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

缺点:

  • 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
  • 当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
  • 当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 备忘录模式的基本介绍
  • 备忘录模式的示例
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档