目录
[显示]

1.摘要

Memento模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。它经常会与Command模式合用,使Command模式支持“撤销”、“重做”等操作。

2. 针对问题

有时程序需要记录对象的内部状态,在对象内部状态改变后可以利用记录恢复之前的状态。但是面向对象编程中通常封装了对象内部的状态信息,使得这些状态不能被其他对象访问,而暴露对象内部状态又破坏了封装原则。Memento模式利用独立的状态对象保存对象状态,解决了这两者间的冲突。

3. 介绍

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

4. 实现

Memento模式的静态图如下:

其中:
Originator提供两个接口:
1、创建Memento,并将自身状态保存在Memento中。
2、通过Memento对象恢复自身状态。
Memento对象可存入或取出Originator对象的状态。
Caretaker负责保存Memento对象。

Memento模式的活动图如下:

实现Memento模式时,需要注意以下两点:
1、Memento对象需要支持两类接口:为Originator提供的宽接口和为其他对象提供的窄接口,也就是说,应该对Originator以外的对象隐藏Originator相关的接口。C++中可以用友元函数实现。
2、Memento对象可以保存Originator对象中的所有状态,但是,如果状态变化是顺序的,那么每个Memento对象可以只保存状态改变的增量。

5. 特点

1、Memento模式分离了“对象”与“状态”,在不破坏原有对象封装的前提下可以取得或恢复对象的内部状态。
2、Memento模式将状态的保存工作从对象中分离,需要在对象之外保存已取得的状态。

6. 相关文章

设计模式总结

7. 参考文章

  1. 《设计模式_可复用面向对象软件的基础》,