4.8 《硬啃设计模式》 第25章 假如一切可以重来 - 备忘录模式(Memento Pattern)
来源:互联网 发布:开封知言小学怎么样 编辑:程序博客网 时间:2024/05/21 09:52
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.最左面的一个框框的是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创办人
- 4.8 《硬啃设计模式》 第25章 假如一切可以重来 - 备忘录模式(Memento Pattern)
- 设计模式23:Memento Pattern (备忘录模式)
- 设计模式之备忘录模式(Memento Pattern)
- 设计模式------备忘录模式(Memento pattern)
- 设计模式之备忘录模式--- Pattern Memento
- Java设计模式--备忘录模式【Memento Pattern】
- 设计模式【备忘录模式Memento Pattern】
- 备忘录模式(Memento Pattern)
- 备忘录模式(Memento Pattern)
- 备忘录模式(Memento Pattern)
- 备忘录模式 Memento Pattern
- 备忘录模式(Memento Pattern)
- 备忘录模式(Memento Pattern)
- 备忘录模式(Memento Pattern)
- 备忘录模式-Memento Pattern
- 备忘录模式-Memento Pattern
- 备忘录模式 | Memento Pattern
- Memento(备忘录)设计模式
- oracle 权限
- ping
- C++编程。。长见识篇
- 索引视图
- 关于同时设置 VAR_FILTERS 和 DEFAULT_FILTER 造成数据二次过滤的BUG
- 4.8 《硬啃设计模式》 第25章 假如一切可以重来 - 备忘录模式(Memento Pattern)
- CodePage
- upx壳的一些简单脱壳,望大牛勿喷。
- aspack的简单脱壳,望大牛勿喷。
- 北斗ncpack的简单脱壳。
- Java进行FTP操作
- uip代码之#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
- 数据挖掘数据集资源
- 查看mysql数据库字符集,设置mysql字符集为utf8