java 设计模式 学习笔记 (14) 备忘录模式

备忘录模式:

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

备忘录模式通常用于可能有撤销操作的情况下,例如比较经典的将游戏还原到上一关等。



下面,我们模拟大家都很熟悉的将游戏还原到上一个保存点功能来了解这个设计模式。在游戏中,每打过一个小关卡时,玩家可以保存此时的状态。玩家继续玩游戏并在不幸挂掉的时候,游戏通常会在刚刚已通过的那个小关卡后复活。复活后的游戏角色的武器和弹药都会恢复原来的状态。

1. 在这里,我们主要模拟恢复弹药数量,这时候引入一个很重要的备忘录类(Memento),Memento 类用来保存弹药数量。

Memento 类很简单,为PlayRole 提供了一个 getBullenNum()方法,方便在恢复时,PlayRole 将保存在Memento 中的状态取出来并将自己的状态设置成以前的状态

Memento 有个带int 的构造方法,主要是被PlayRole 设置需要保存的状态(子弹数量)


 



2. 在上面两次提到了Memento 是为PlayRole 服务,那么现在就来说明PlayRole类

PlayRole也就是Originator ,它的作用: 

1. 在需要保存信息时建立一个Memento 备忘录,用来记录当前他的状态

2. 在需要恢复时从Memento 中取出保存的信息,并将自己从当前的状态恢复到之前的状态。




3.  建立CareTaker 类,这个类只能保存Memento,并为PlayRole 提供某一个Memento。

   在这里和网上流传的其他版本的额CareTaker 类有些区别。

    CareTaker 类内部用一个ArrryList 来保存所有Memento 对象,而非仅仅一个。这样就使游戏角色能够恢复到任意的某个游戏保存点,而非上一个保存点。



 



4. 编写测试代码来验证试验结果:

    首先游戏角色有 100 颗子弹,并保存了这个状态。

    接着游戏角色消耗了 50 颗子弹,还剩50颗子弹,并保存了这个状态。

    接着游戏角色消耗了25颗子弹,并挂掉了。

    游戏角色恢复到50 颗子弹的状态,然后觉得不爽,又恢复到了100颗子弹的状态



 结果输出:

 

initial:100

change:50

change again:25

rollback:50

rollback to initial:100



通过查看结果,得到了预想的结果。
备忘录模式的一个显著的好处就是使用Memento 来保存 PlayRole 的状态,并通过一个容器来保存Memento 对象。

有人会问:如果我直接用一个容器来保存PlayRole 对象,并你先用Memento,再用容器 保存Memento 还省了一道操作呢。
也就是中间的Memento 完全没有必要嘛。

 

值得注意的是,Memento 仅仅保存了PlayRole 需要保存的信息,例如在这个例子中没有保存武器和外观等信息。

如果不使用Memento,那容器里保存的PlayRole 对象将是非常巨大的。

Memento 仅仅保存需要保存的信息!

 



























 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值