备忘录模式(Memento Design Pattern)
备忘录模式用于保存一个对象的某个状态,以便在适当的时候恢复对象。
其实几乎所有的软件都用到了备忘录模式,像常用的文本编辑器,我们将文本保存到文件,可以通过Ctrl+Z撤销操作恢复到上次操作的状态,关闭文档后再次打开也是恢复到上次编辑时的状态。类似的还有游戏的存档功能、浏览器的前进后退。
代码示例
package memento
import "fmt"
//备忘录快照,记录某时刻的状态,这里可以记录更多的状态
type Memento struct {
state string
}
func (m *Memento) SetState(state string) {
m.state = state
}
func (m *Memento) GetState() string {
return m.state
}
type TextEditor struct {
mementos map[string]Memento
str string
}
func NewTextEditor() *TextEditor {
return &TextEditor{
mementos: make(map[string]Memento),
}
}
func (editor *TextEditor) Append(s string) {
editor.str += s
}
func (editor *TextEditor) Content() string {
return editor.str
}
func (editor *TextEditor) Delete() {
if len(editor.str) > 0 {
editor.str = editor.str[0 : len(editor.str)-1]
}
}
//获取某状态当时的值
func (editor *TextEditor) GetState(state string) string {
if memento, ok := editor.mementos[state]; ok {
fmt.Printf("获取到状态为%s时的值:%s\n", state, memento.GetState())
return memento.state
}
return ""
}
//保存当前状态时的值
func (editor *TextEditor) SaveState(state string) {
memento := Memento{}
memento.SetState(editor.str)
editor.mementos[state] = memento
fmt.Printf("保存状态为%s时的值:%s\n", state, memento.GetState())
}
//绘图到某状态时的值
func (editor *TextEditor) BackState(state string) {
if memento, ok := editor.mementos[state]; ok {
fmt.Printf("回退到状态为%s时的值:%s\n", state, memento.GetState())
editor.str = memento.state
}
}
调用:
editor := NewTextEditor()
editor.SaveState("state#0") //保存状态
editor.Append("1")
editor.SaveState("state#1") //保存状态
editor.Append("2")
editor.SaveState("state#2") //保存状态
editor.Append("3")
editor.SaveState("state#3") //保存状态
_ = editor.GetState("state#2") //获取当时状态
_ = editor.GetState("state#1") //获取当时状态
editor.BackState("state#1") //回退到当时状态
fmt.Println("当前值为:", editor.Content())
// Output:
// 保存状态为state#0时的值:
// 保存状态为state#1时的值:1
// 保存状态为state#2时的值:12
// 保存状态为state#3时的值:123
// 获取到状态为state#2时的值:12
// 获取到状态为state#1时的值:1
// 回退到状态为state#1时的值:1
// 当前值为: 1