RPG游戏是由玩家扮演某角色,该角色会在游戏中不断成长的游戏。以下是玩家扮演角色的成长史:
说明:
1.最左面的一个框框的是Hero
类图。
2.右边的三个框框是对象图,Player是类Hero的实例,三个Player对象图展示了Player的属性值变化情况。
游戏希望能增加这样一个特性:
能保存不同时刻的player状态,玩家如果不满意,可恢复到之前的任意状态。
于是你想到了以下两个方案,但好像都有不足之处。
方案一:在Hero类外部记录它的各属性值,在需要的时候重新恢复各属性值。
方案二:Hero类增加Save、Restore方法。
方案一的弊端:Hero类的各属性需要暴露出来,似乎不太好。
方案二的弊端:Save与Restore的实现与Hero类绑死了,并且Hero类也显得太庞大了。
如果应用备忘录
设计模式,会怎样呢?
说明:
1.Memento将Hero的状态与状态的保存隔离了。
2.Hero需要保存状态时,只需要CreateMemento(),如果需要恢复状态,只需要取到某个Memento,调用SetMemento()方法便可。
3.Memento的保存和恢复由MementoManager类来负责,具体实现方式没有限制,可以保存到
数据库,也可以保存成XML。
备忘录设计模式的精妙之处在于通过Memento来分离对象状态与状态的保存方法,备忘录模式的类图如下:
当需要保存对象多个状态,并且可以恢复到任意状态,可考虑备忘录模式。
将对象、对象状态和状态的保存办法分离,设计上会更加灵活。
但对象属性的备份、恢复、保存等动作,都是可能比较耗时的。
备忘录模式只是提供了保存对象状态的一种解决方案框架,真正应用时还需要解决这些问题:
1.如何设计Memento?
2.怎样保存多个对象?
3.怎样保存组织成树结构的多个对象?
请看下一文……
作者:张传波
创新工场创业课堂(敏捷课程)讲师
软件研发管理资深顾问
CMMI首席专家
《火球——UML大战需求分析》作者
www.umlonline.org创办人