在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,
要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让
其他对象得到对象的状态,便会暴露对象的细节实现。
如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的
封装性。
意图 (Intent)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在这个对象之外保存
这个状态。这样就可以将对象恢复到原先保存的状态。
《设计模式》———— GOF
从类图可以看出, ClockOption, MainForm, RemindData, RemindOparate 都实现了
一个 IMementoCapable 接口,这个接口定义如下:
1
// IMementoCapable.cs
2
}
2
很简单,只是能够把一个对象的状态保存为一个Properties对象,或者利用一个Properties
对象把这个对象的状态恢复到之前的状态。
这样做是很有必要的,比如对于 OptionForm,是需要可以预览的,这样用户在更改了一个
设置后马上就可以看到效果。比如拖动 Size 滑块,马上可以看到变大或者变小的效果。这样
的功能用到的还不少,使用 Memento 在窗体加载前先保存好原有的状态,在取消后就可以很
方便到恢复到之前的状态。下面是 Option 菜单执行的操作:
1
// OptionElement.cs
2
}
下面是 Remind 菜单要执行的操作:2
1
// RemindElement.cs
2
}
RemindOperate 类实现的是对定时提醒任务的检测和保存,它利用一个 Timer, 每隔一2
分钟检测一次是否有提醒任务。
1
// RemindOperate.cs
2
[Serializable()]
3
}
在这个软件中,Properties类是Memento的关键,同时也是以后要讲的持久化存储的关键。这里只要看他是如何设置和取得一个2
3
属性的。主要是通过Get<T>,Set<T>两个泛型方法:
1
// Part of Properties.cs
2
}
参考资料:2
李建忠 C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式
SharpDevelop 3.0 源代码