备忘录模式(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

results matching ""

    No results matching ""