从零开始学习Java设计模式 | 行为型模式篇:备忘录模式

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始学习Java设计模式 | 行为型模式篇:备忘录模式相关的知识,希望对你有一定的参考价值。

在本讲,我们来学习一下行为型模式里面的第十个设计模式,即备忘录模式。

概述

在学习备忘录模式的概念之前,我们先来看下面这段描述。

备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题,或者就想回到之前的历史步骤时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如Word、记事本、PhotoShop、IDEA等软件在编辑时按Ctrl+Z组合键时就能撤销当前操作,使文档恢复到之前的状态;还有在浏览器中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这种状态恢复的实现机制,而这种状态恢复的实现机制正是备忘录模式提供的。

接下来,我们就可以看一下备忘录模式的概念了。

备忘录模式又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。

知道了备忘录模式的概念之后,接下来,我们就来看看备忘录模式的结构,也就是它里面所拥有的角色。

结构

备忘录模式的主要角色如下:

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能(注意,这俩功能是必须提供的),实现其他业务功能(当然了,有的话你就实现,没有的话你就可以不实现了),它可以访问备忘录里的所有信息。
  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

知晓备忘录模式里面的角色之后,大家一定要明白一点,就是管理者角色是不能对备忘录里面的内容进行访问或者修改的。那如何来保证这一点呢?要想知道答案,那么接下来我们就得先认识一下备忘录里面的两个等效的接口了。

备忘录有两个等效的接口,它们分别是:

  • 窄接口:管理者(Caretaker)对象(和其他发起人对象之外的任何对象)看到的都是备忘录的窄接口(narror Interface),这个窄接口只允许他把备忘录对象传给其他的对象。

    现在大家应该知道什么是窄接口了吧!窄接口就是只能允许管理者对象去获取备忘录对象,而不允许他对备忘录里面的数据进行访问或者修改。

  • 宽接口:与管理者看到的窄接口相反,发起人对象可以看到一个宽接口(wide Interface),这个宽接口允许他读取所有的数据(也即允许发起人对象读取备忘录里面的所有数据,或者对备忘录里面的数据进行修改),以便根据这些数据恢复这个发起人对象的内部状态。

案例实现

接下来,按照惯例我们通过一个案例来让大家再去理解一下备忘录模式的概念,以及它里面所包含的角色,而这个案例就是在游戏中挑战Boss。

游戏中的某个场景,一游戏角色有生命力、攻击力、防御力等数据,在打Boss前和后一定会不一样的,于是我们允许玩家如果感觉与Boss决斗的效果不理想可以让游戏恢复到决斗之前的状态。

看到让游戏恢复到决斗之前的状态,那么想必你已经知道了肯定是要用到备忘录模式的。而这里我们要实现上述案例,是可以有两种方式的:

  1. 白箱备忘录模式
  2. 黑箱备忘录模式

那什么是白箱备忘录模式?什么又是黑箱备忘录模式呢?接下来我一个一个来为大家讲述,这里不妨先来看看白箱备忘录模式。

白箱备忘录模式

概述

备忘录角色对任何对象都提供一个接口,即宽接口,这样的话,备忘录角色的内部所存储的状态就对所有对象公开。

看到这里,大家应该明白一点,就是这好像违背了备忘录模式的意思,因为刚才我们就讲过窄接口和宽接口,而备忘录模式只会对发起人对象提供一个宽接口,对其他的对象则全部提供一个窄接口。有意思的是这恰巧描述的是黑箱备忘录模式,别急,后面我就会讲到。

案例

我们先来看一下下面的这张类图,这张类图就是针对于上述案例进行设计的。

以上是关于从零开始学习Java设计模式 | 行为型模式篇:备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

从零开始学习Java设计模式 | 行为型模式篇:状态模式

从零开始学习Java设计模式 | 行为型模式篇:状态模式

从零开始学习Java设计模式 | 行为型模式篇:命令模式

从零开始学习Java设计模式 | 行为型模式篇:命令模式

从零开始学习Java设计模式 | 行为型模式篇:责任链模式

从零开始学习Java设计模式 | 行为型模式篇:责任链模式