备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
备忘录模式通过创建一个包含对象状态的快照来实现这一点,以便在需要时可以恢复到这个状态。
状态恢复:允许对象恢复到之前的状态。
撤销操作:支持撤销操作,例如在文本编辑器中撤销上一步操作。
状态管理:在不破坏封装性的前提下,管理对象的状态。
需要保存和恢复对象状态的场景。
需要提供撤销功能的场景。
在对象状态变化频繁且需要记录历史状态的场景。
下面是一个简单的 Go 语言示例,演示如何使用备忘录模式来保存和恢复对象的状态。
package main
import (
"fmt"
)
// Originator 原发器,负责创建一个备忘录并存储它的当前状态
type Originator struct {
State string
}
// Memento 备忘录,存储原发器的状态
type Memento struct {
State string
}
// CreateMemento 创建一个备忘录,存储当前状态
func (o *Originator) CreateMemento() *Memento {
return &Memento{State: o.State}
}
// RestoreMemento 从备忘录中恢复状态
func (o *Originator) RestoreMemento(m *Memento) {
o.State = m.State
}
// Caretaker 管理者,负责保存和恢复备忘录
type Caretaker struct {
Mementos []*Memento
}
// AddMemento 添加一个备忘录
func (c *Caretaker) AddMemento(m *Memento) {
c.Mementos = append(c.Mementos, m)
}
// GetMemento 获取指定索引的备忘录
func (c *Caretaker) GetMemento(index int) *Memento {
if index < 0 || index >= len(c.Mementos) {
return nil
}
return c.Mementos[index]
}
func main() {
// 创建原发器
originator := &Originator{State: "State1"}
fmt.Println("Initial State:", originator.State)
// 创建管理者
caretaker := &Caretaker{}
// 创建备忘录并保存
memento1 := originator.CreateMemento()
caretaker.AddMemento(memento1)
fmt.Println("State saved as Memento1")
// 改变原发器状态
originator.State = "State2"
fmt.Println("Changed State:", originator.State)
// 创建备忘录并保存
memento2 := originator.CreateMemento()
caretaker.AddMemento(memento2)
fmt.Println("State saved as Memento2")
// 改变原发器状态
originator.State = "State3"
fmt.Println("Changed State:", originator.State)
// 从备忘录恢复状态
originator.RestoreMemento(caretaker.GetMemento(1))
fmt.Println("Restored to State2:", originator.State)
// 从备忘录恢复状态
originator.RestoreMemento(caretaker.GetMemento(0))
fmt.Println("Restored to State1:", originator.State)
}