备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。后期可以直接将该对象恢复到原先保存的状态。
备忘录模式
备忘录模式 Memento[məˈmentoʊ] Pattern
:常用于存档,编辑回退等场景,主要是保存某个对象当前的状态。
类图结构
结构解析
Originator[əˈrɪdʒəˌnetɚ]
发起者,复杂类有多个属性。负责创建一个备忘录,用于记录当前内部状态,并可以使用备忘录恢复状态。Originator
来决定需要备忘录存储哪些状态或属性。Memento
备忘录,负责存储Originator
指定的内部状态。只能通过Originator
创建修改状态,其他类仅仅可以获取状态。CareTaker
管理类,负责存储管理保存好的备忘录列表,但是不能修改备忘录中保存的状态。
Originator
负责指定 Memento
保存自己的哪些内部状态,CareTaker
维护一个列表保存 Memento
,后期可以通过这个列表恢复到指定状态。
示例
1 | // 1. Memento |
总结
按照 GOF
定义的备忘录模式,需要备忘录只能对发起方 Originator
可见,其他类无法获取其状态,这样根据备忘录的可见性,可以做如下分类:
- 白箱模式
备忘录完全可见,暴露给其他类,这种是最常见的备忘录模式,上面的代码示例即为白箱模式。 - 黑箱模式
备忘录抽象一个空接口出来,而备忘录则以内部类的形式在Originator
中实现对应功能,这样外部类在访问的时候,只能拿到空接口。
备忘录中的宽窄接口:接口类中提供比较完备的操作状态的方法,我们称它为宽接口;而只是一个标示或者空接口,我们称它为窄接口。备忘录角色在实现这两种接口类时,可以控制对于“备忘发起角色”采用宽接口进行访问,而对于其他的角色或者对象则采用窄接口进行访问。黑箱模式正是采用了这种方式来实现的。
参考文档
- 大话设计模式
Android
源码设计模式解析与实战- 备忘录模式