备忘录模式(Memento)在游戏中可用来做存储功能。在书中使用备忘录模式”存储成就记录”
直接将数据存盘功能实现于游戏功能类中,一般来说不太理想,因为违反了单一职责原则(SRP)。也就是说,各个游戏功能类应该专心处理与游戏相关的功能。
而记录保存,也应交由专职的记录保存类
为说明要专门写一个记录保存类呢?
书中给出了解释说明:
如果在功能模块中实现,会将内部成员数据全部公开。
虽然可以少写代码,缺违背了接口隔离原则(ISP)即除非必要,类应该尽量减少对外显示内部的数据接口,以减少客户端有机会破坏内部成员的记录,而对外公布过多的操作方法,容易增加与其他系统的耦合度。
GOF对备忘录模式的定义:
在不违反封装的原则下,获取一个对象的内部状态并保留在外部,让该对象可以在日后恢复到原先保留时的状态。
实现思路
这里列出几个问题,来做思考。
如何在“不违反封装的原则” 还能提供内部的详细信息?
就是由游戏系统本身“主动提供内部信息”存盘功能,而且也“主动”向存盘功能提供自己“系统”有关的信息。
这与原本由游戏本身提供一大堆“存取内部成员”的方法,有什么不同?最大的不同在于:
游戏系统提供存取内部成员方法,是让游戏系统处于“被动”状态。
备忘录模式则是将游戏系统由“被动”改为“主动提供”,意思是,
游戏系统自己决定要提供什么信息和记录存盘功能,也由游戏系统决定要从存盘功能中,读取什么样的数据及记录还原给内部成员。
而这些信息记录的设置和获取的实现地点都在“游戏系统类内”,不会发生在游戏系统类以外的地方,如此就可确保类的“封装的原则”不会被破坏。
备忘录模式的说明
记录拥有者Originator
记录保存者Memento
管理记录保存者Caretaker
记录拥有者Originator
public class Originator{
string m_State; //状态,需要被保存
public void SetInfo(string State){
m_State = State;
}
public void