备忘录模式:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样在以后需要的情况下将该对象恢复到原先保存的状态。
备忘录模式通常用于可能有撤销操作的情况下,例如比较经典的将游戏还原到上一关等。
下面,我们模拟大家都很熟悉的将游戏还原到上一个保存点功能来了解这个设计模式。在游戏中,每打过一个小关卡时,玩家可以保存此时的状态。玩家继续玩游戏并在不幸挂掉的时候,游戏通常会在刚刚已通过的那个小关卡后复活。复活后的游戏角色的武器和弹药都会恢复原来的状态。
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 仅仅保存需要保存的信息!