设计模式:Memento
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. 参考文章
- 《设计模式_可复用面向对象软件的基础》,
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,转载请注明作者及原网址。
抱歉,暂停评论。