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号