针对问题

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

介绍

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

实现

Memento模式的静态图如下:

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

Memento模式的活动图如下:

实现Memento模式时,需要注意以下两点:
1、Memento对象需要支持两类接口:为Originator提供的宽接口和为其他对象提供的窄接口,也就是说,应该对Originator以外的对象隐藏Originator相关的接口。C++中可以用友元函数实现。… Read the rest