0 引言
0.1 目的
本文档给出设计模式之——Memento模式的简化诠释,并给出其C++实现。
0.2 说明
| Project | Design Pattern Explanation(By K_Eckel) | 
| Authorization | Free Distributed but Ownership Reserved | 
| Date |  | 
| Test Bed | MS Visual C++ 6.0 | 
0.3 参考
在本文档的写作中,参考了以下的资源,在此列出表示感谢:
u 书籍
[GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software
Addison-Wesley 2000/9.
[Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.
0.4 联系作者
| Author | K_Eckel | 
| State | Candidate for Master’s Degree School of  | 
| E_mail | 
2 Memento模式
2.1 问题
没有人想犯错误,但是没有人能够不犯错误。犯了错误一般只能改过,却很难改正(恢复)。世界上没有后悔药,但是我们在进行软件系统的设计时候是要给用户后悔的权利(实际上可能也是用户要求的权利:)),我们对一些关键性的操作肯定需要提供诸如撤销(Undo)的操作。那这个后悔药就是Memento模式提供的。
2.2 模式选择
       Memento模式的关键就是要在不破坏封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作。为了达到这个目标,可以在后面的实现中看到我们采取了一定语言支持的技术。Memento模式的典型结构图为:

图2-1:Memento Pattern结构图
2.3 实现
2.3.1  完整代码示例(code)
       Memento模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。
  
| 代码片断1:Memento.h //Memento.h #ifndef _MEMENTO_H_ #include <string> class Memento; class Originator  Originator();  Originator(const State& sdt);  ~Originator();  Memento* CreateMemento();  void SetMemento(Memento* men);  void RestoreToMemento(Memento* mt);  State GetState();  void SetState(const State& sdt);  void PrintState(); protected: private:  Memento* _mt; class Memento protected: private:  Memento();  Memento(const State& sdt);  ~Memento();  void SetState(const State& sdt);  State GetState(); private: }; #endif //~_MEMENTO_H_ | 
| 代码片断2:Memento.cpp //Memento.cpp #include "Memento.h" #include <iostream> typedef string State; Originator::Originator()  _mt = 0; Originator::Originator(const State& sdt)  _mt = 0; Originator::~Originator() } Memento* Originator::CreateMemento() State Originator::GetState() void Originator::SetState(const State& sdt) void Originator::PrintState() void Originator::SetMemento(Memento* men) } void Originator::RestoreToMemento(Memento* mt) //class Memento Memento::Memento() Memento::Memento(const State& sdt) State Memento::GetState() void Memento::SetState(const State& sdt) | 
| 代码片断3:main.cpp //main.cpp #include "Memento.h" #include <iostream> int main(int argc,char* argv[])  o->SetState("old"); //备忘前状态  o->PrintState();  Memento* m = o->CreateMemento(); //将状态备忘  o->SetState("new"); //修改状态  o->PrintState();  o->RestoreToMemento(m);          //恢复修改前状态  o->PrintState();  return 0; | 
2.3.2  代码说明
Memento模式的关键就是friend class Originator;我们可以看到,Memento的接口都声明为private,而将Originator声明为Memento的友元类。我们将Originator的状态保存在Memento类中,而将Memento接口private起来,也就达到了封装的功效。
在Originator类中我们提供了方法让用户后悔:RestoreToMemento(Memento* mt);我们可以通过这个接口让用户后悔。在测试程序中,我们演示了这一点:Originator的状态由old变为new最后又回到了old。
2.4 讨论
在Command模式中,Memento模式经常被用来维护可以撤销(Undo)操作的状态。这一点将在Command模式具体说明。
 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号