《设计模式Design Pattern》读书笔记之十六
Memento模式
结构
目的
为了可以把一个对象恢复到以前的状态,却不想公开内部状态使得封装性被破坏。
优点
1, 通过把originator的内部状态保存到memento,而不是直接把内部状态公开,保持了originator的封装性。因为memento有两种接口,宽(wide)的接口只会被originator使用,使得别人不能访问这些内部状态。而caretaker只能看到memento的窄(narrow)的接口 -- 它只能把memento传递给其他对象(originator)。在C++中,这可以通过把originator设计成memento的friend class,把那些memento的不应该公开的接口设计成private函数。
2, 通过把originator的内部状态保存到外部的memento,而不是originator自己来保存,使得设计简单而易于理解。
缺点
如果需要把大量的数据从originator拷贝到memento,则可能会使得成本很大。
如果memento的创建和传回给originator是一个可以预见的有次序的过程,那么保存在memento里面的信息可以仅仅是那些发生了改变的数据(incremental change),而不必是整个originator的内部信息的完全拷贝。比如command模式中的History List,可以为每个command产生的memento只保存incremental change。
参考资料
《Design Pattern》 Gang-Of-4 1997