4.8 《硬啃设计模式》 第25章 假如一切可以重来 - 备忘录模式(Memento Pattern)

来源:互联网 发布:开封知言小学怎么样 编辑:程序博客网 时间:2024/05/21 09:52
RPG游戏是由玩家扮演某角色,该角色会在游戏中不断成长的游戏。以下是玩家扮演角色的成长史:

备忘录1.png

说明:
1.最左面的一个框框的是Hero类图
2.右边的三个框框是对象图,Player是类Hero的实例,三个Player对象图展示了Player的属性值变化情况。

游戏希望能增加这样一个特性:
能保存不同时刻的player状态,玩家如果不满意,可恢复到之前的任意状态。

于是你想到了以下两个方案,但好像都有不足之处。
方案一:在Hero类外部记录它的各属性值,在需要的时候重新恢复各属性值。
方案二:Hero类增加Save、Restore方法。

方案一的弊端:Hero类的各属性需要暴露出来,似乎不太好。
方案二的弊端:Save与Restore的实现与Hero类绑死了,并且Hero类也显得太庞大了。

如果应用备忘录设计模式,会怎样呢?

备忘录2.png

说明:
1.Memento将Hero的状态与状态的保存隔离了。
2.Hero需要保存状态时,只需要CreateMemento(),如果需要恢复状态,只需要取到某个Memento,调用SetMemento()方法便可。
3.Memento的保存和恢复由MementoManager类来负责,具体实现方式没有限制,可以保存到数据库,也可以保存成XML。

备忘录设计模式的精妙之处在于通过Memento来分离对象状态与状态的保存方法,备忘录模式的类图如下:

备忘录3.png



当需要保存对象多个状态,并且可以恢复到任意状态,可考虑备忘录模式。
将对象、对象状态和状态的保存办法分离,设计上会更加灵活。
但对象属性的备份、恢复、保存等动作,都是可能比较耗时的。

备忘录模式只是提供了保存对象状态的一种解决方案框架,真正应用时还需要解决这些问题:
1.如何设计Memento?
2.怎样保存多个对象?
3.怎样保存组织成树结构的多个对象?

 


请看下一文……

 

 

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

www.umlonline.org创办人

原创粉丝点击