Skip to content
← 返回设计模式列表
设计意图与对象责任

备忘录 ​

保存对象快照以便恢复。

行为型

说明 ​

编辑器撤销等场景可以保存值副本;可变引用需深拷贝。

分析 ​

Save 返回独立的 Snapshot,Restore 根据快照恢复 Editor 的文本。调用方可以保存一系列快照以支持多级撤销,而不必了解编辑器内部字段如何变化。

快照记录的是保存时的 first,随后把当前文本改成 second 不会改动快照,Restore 才把旧值写回来。这里字符串值可直接保存;若换成含指针的文档树,浅拷贝可能使历史随当前编辑一起改变。多级撤销需要历史栈和容量策略,快照不应包含数据库连接等不可复制资源。

查看图表代码

适用前提与边界 ​

真实对象含有切片、映射或外部资源时,快照成本与复制语义需要明确。 交互流程很短且稳定时,直接调用通常更容易理解。

示例输入与调用 ​

go
editor := Editor{Text: "first"}
	saved := editor.Save()
	editor.Text = "second"
	editor.Restore(saved)
	fmt.Println(editor.Text)

运行输出 ​

text
first

完整 Go 示例 ​

go
package main

import "fmt"

type Editor struct{ Text string }
type Snapshot struct{ Text string }

func (e Editor) Save() Snapshot {
	return Snapshot{Text: e.Text}
}
func (e *Editor) Restore(s Snapshot) {
	e.Text = s.Text
}

func main() {
	editor := Editor{Text: "first"}
	saved := editor.Save()
	editor.Text = "second"
	editor.Restore(saved)
	fmt.Println(editor.Text)
}

继续阅读