备忘录
保存对象快照以便恢复。
行为型
说明
编辑器撤销等场景可以保存值副本;可变引用需深拷贝。
分析
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)
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任