备忘录(Memento、Snapshot)模式属于行为型模式的一种。
备忘录模式主要用于捕获一个对象的内部状态,以便在将来的某个时候恢复此状态。
备忘录模式的核心思想是将对象的状态保存在一个独立的对象中,这样既能保持对象的封装性,又能方便地恢复对象到之前的状态。
我们使用的几乎所有软件都用到了备忘录模式。大多数软件提供的保存、打开,以及编辑过程中的Undo、Redo都是备忘录模式的应用。Java的序列化也可以看作是备忘录模式。
备忘录模式适合在有撤销操作、恢复状态、对象状态追踪等场景下使用。
备忘录模式通常有以下组成部分:
- Memento(备忘录):存储对象的内部状态。备忘录通常是一个不可变的对象,即在创建之后不允许更改它的内容。
- Originator(发起人):发起人是需要保存其状态的对象。它创建一个备忘录,保存当前的状态,并可以通过备忘录恢复到之前的状态。发起人负责生成和恢复备忘录,但它对备忘录的内部状态一无所知。
- Caretaker(看护者):看护者负责保存备忘录,但它不能修改备忘录的内容。看护者是一个管理者,通常用于保存多个备忘录的状态,供需要时进行恢复。
如果我们使用的编程语言支持嵌套类(如Java、C++、 C# 等),则可将备忘录嵌套在Originator类中; 如果不支持(如PHP等), 那么我们可以从备忘录类中抽取一个空接口,然后让其他所有对象通过接口来引用备忘录。 我们还可以在该接口中添加一些元数据操作,但不能暴露Originator类的状态。
我们用备忘录模式实现一个简单的文本编辑器中的撤销功能。当用户输入文本时,编辑器会保存当前文本状态,这样当用户点击“撤销”按钮时,编辑器能够恢复到上一个状态。
1、Memento: 备忘录类