一、简介
备忘录模式也叫快照模式,具体来说,就是在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。这个模式的定义表达了两部分内容:一部分是,存储副本以便后期恢复;另一部分是,要在不违背封装原则的前提下,进行对象的备份和恢复。
二、优缺点
1. 优点
- 封装性
- 简易恢复和撤销
- 简化发起人
2. 缺点
- 增加内存使用
- 性能开销
- 复杂性
三、适用场景
- 需要维护对象状态的历史记录
- 不想暴露复杂内部结构
四、UML类图
五、案例
文本编辑器,允许保存当前内容,以及从保存的快照中恢复。
package mainimport "fmt"type Memento struct {content string
}func NewMemento(content string) *Memento {return &Memento{content: content}
}func (m *Memento) GetContent() string {return m.content
}type TextEditor struct {Content string
}func NewTextEditor() *TextEditor {return &TextEditor{Content: ""}
}func (te *TextEditor) Write(text string) {te.Content += textfmt.Printf("Current content: %v\n", te.Content)
}func (te *TextEditor) Save() *Memento {return NewMemento(te.Content)
}func (te *TextEditor) Restore(memento *Memento) {te.Content = memento.GetContent()
}func main() {editor := NewTextEditor()editor.Write("This is the first sentence.")saved := editor.Save()editor.Write("This is the second sentence.")fmt.Printf("Before restore: %v\n", editor.Save().GetContent())editor.Restore(saved)fmt.Printf("After restore: %v\n", editor.Save().GetContent())
}