动机 (Motivation)
    在软件的构建过程中,某些对象的状态在转换过程中,可能由于某种需要,
    要求程序能够回溯到对象之前某个点时的状态,如果使用一些公有接口来让
    其他对象得到对象的状态,便会暴露对象的细节实现。
   
    如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的
    封装性。
   
意图 (Intent)
    在不破坏封装性的前提下,捕获一个对象的内部状态,并在这个对象之外保存
    这个状态。这样就可以将对象恢复到原先保存的状态。
                                                《设计模式》———— GOF
                                               
从类图可以看出, ClockOption, MainForm, RemindData, RemindOparate 都实现了
一个 IMementoCapable 接口,这个接口定义如下:
1我的 WinClock 项目系列之四 (Memento 模式的应用)// IMementoCapable.cs
2}

很简单,只是能够把一个对象的状态保存为一个Properties对象,或者利用一个Properties
对象把这个对象的状态恢复到之前的状态。
这样做是很有必要的,比如对于 OptionForm,是需要可以预览的,这样用户在更改了一个
设置后马上就可以看到效果。比如拖动 Size 滑块,马上可以看到变大或者变小的效果。这样
的功能用到的还不少,使用 Memento 在窗体加载前先保存好原有的状态,在取消后就可以很
方便到恢复到之前的状态。下面是 Option 菜单执行的操作:
 1我的 WinClock 项目系列之四 (Memento 模式的应用)// OptionElement.cs
 2}
下面是 Remind 菜单要执行的操作:
 1我的 WinClock 项目系列之四 (Memento 模式的应用)// RemindElement.cs
 2}
RemindOperate 类实现的是对定时提醒任务的检测和保存,它利用一个 Timer, 每隔一
分钟检测一次是否有提醒任务。

  1我的 WinClock 项目系列之四 (Memento 模式的应用)// RemindOperate.cs
  2我的 WinClock 项目系列之四 (Memento 模式的应用)[Serializable()]
  3}
在这个软件中,Properties类是Memento的关键,同时也是以后要讲的持久化存储的关键。这里只要看他是如何设置和取得一个
属性的。主要是通过Get<T>,Set<T>两个泛型方法:


  1我的 WinClock 项目系列之四 (Memento 模式的应用)// Part of Properties.cs 
  2}
参考资料:
  李建忠 C#面向对象设计模式纵横谈(21):(行为型模式) Memento 备忘录模式
  SharpDevelop 3.0 源代码



相关文章: