备忘录 java_Java设计模式学习记录-备忘录模式

本文介绍了备忘录模式,一种行为设计模式,用于在不破坏封装的前提下,捕获对象的内部状态并恢复。通过一个游戏类的例子展示了备忘录模式的使用,包括原发器、备忘录和负责人类的角色。该模式适用于需要撤销/重做功能的场景,但也存在资源消耗大的潜在问题。
摘要由CSDN通过智能技术生成

前言

这次要介绍的是备忘录模式,也是行为模式的一种 。现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了。那么备忘录模式又是什么样子的呢?是不是和手机上的备忘录一样呢?下面来介绍一下。

备忘录模式

概念介绍

备忘录模式是指在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。简单的来说就是平时玩的通关游戏,第一次前进了5步,第二次前进时踩到便便了,然后要回到之前的进度。例如下图结构:

46affb03180a7a0159681840944dc2b7.png

举例

我们还是用一个小例子来简单介绍一下备忘录模式,在玩一个步骤游戏时,每走一步时步数都加一,遇到道具可以快速走几步,或者减几步。用备忘录模式的思想来实现这个逻辑,就是如下代码。

游戏类

/*** 游戏*/@Datapublic classGame {/*** 玩家走的步数*/

private intplayerStep;/*** 备份游戏

*@return

*/

publicGameMemento createGameMemento(){return newGameMemento(playerStep);

}/*** 开始玩游戏*/

public voidplay(){

playerStep= 0;

}/*** 恢复备份

*@paramgameMemento*/

public voidrestore(GameMemento gameMemento){this.playerStep =gameMemento.getPlayerSteps();

}

}

备份

/*** 备份*/@Getterpublic classGameMemento {/**步数*/

private intplayerSteps;/*** 备份步数

*@paramplayerSteps*/

public GameMemento(intplayerSteps){this.playerSteps =playerSteps;

}

}

备份信息管理类

/*** 备份信息管理类*/

public classCaretaker {/**备份*/

privateGameMemento gameMemento;/**恢复备份*/

publicGameMemento retrieveMemento(){return this.gameMemento;

}/**保存备份*/

public voidsaveMemento(GameMemento gameMemento){this.gameMemento =gameMemento;

}

}

测试

public classPlayer {public static voidmain(String[] args) {

Game game= newGame();

System.out.println("游戏开始,捡到滑板,前进10步");

game.setPlayerStep(10);//备份当前状态

System.out.println("备份当前状态");

GameMemento gameMemento=game.createGameMemento();

Caretaker caretaker= newCaretaker();

caretaker.saveMemento(gameMemento);

System.out.println("备份完成");

game.play();

System.out.println("踩到便便了,当前步数为:"+game.getPlayerStep());

System.out.println("还原到之前一步");

game.restore(caretaker.retrieveMemento());

System.out.println("恢复完成,当前玩家步数是:"+game.getPlayerStep());

}

}

运行结果

游戏开始,捡到滑板,前进10步

备份当前状态

备份完成

踩到便便了,当前步数为:0还原到之前一步

恢复完成,当前玩家步数是:10

上面的这个例子使用了lombok插件的注解例如:@Getterhe@Data所以少写了getter和setter方法。看完了这个小例子,大概应该知道备忘录模式是个什么逻辑了吧,有点类似咱们平时知道的事务回滚的机制。下面还是分析一下,备忘录模式都是由哪些部分组成的。

备忘录模式结构

结构图如下

f46b95abf7286c315ef325b76ac498cd.png

备忘录模式的构成角色如下所示。

原发器类(Originator):创建一个备忘录对象,使用备忘录存储它的内部状态。

负责人类(CareTaker):负责保存好备忘录对象,不能检查或操作备忘录的内容。

备忘录类(Memento):将原发器的内部状态存储起来,原发器根据需要决定备忘录存储原发器的哪些内部状态。

总结

优点

1、它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。

2、备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。

缺点

资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。

适用场景

1、保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时它能够恢复到先前的状态,实现撤销操作。

2、防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值