备忘录模式
原创大约 3 分钟
备忘录模式是一种行为型设计模式,它可以在不破坏对象的封装性的前提下,保存和恢复对象的内部状态。备忘录模式可以实现对象的撤销、回滚、恢复等功能。
备忘录模式
备忘录模式的用法有以下几种:
- 当需要保存对象的历史状态,以便在需要时恢复到某个状态时,可以使用备忘录模式。
- 当需要提供对象的快照,以便在发生错误或异常时,可以恢复到之前的状态时,可以使用备忘录模式。
- 当需要实现对象的撤销、重做、事务等功能时,可以使用备忘录模式。
备忘录模式的优点有以下几种:
- 备忘录模式可以保护对象的封装性,不暴露对象的内部结构和实现细节。
- 备忘录模式可以实现对象状态的管理和控制,提高对象的可靠性和安全性。
- 备忘录模式可以实现对象状态的历史记录和回溯,增加对象的功能性和灵活性。
示例
package main
import "fmt"
// 定义发起者
type Originator struct {
state string // 内部状态
}
// 实现创建方法
func (o *Originator) CreateMemento() *Memento {
return &Memento{state: o.state} // 返回一个包含当前状态的备忘录
}
// 实现恢复备忘录方法
func (o *Originator) RestoreMemento(m *Memento) {
o.state = m.state // 从备忘录中恢复状态
}
// 实现显示状态方法
func (o *Originator) ShowState() {
fmt.Println("Originator state:", o.state)
}
// 定义备忘录类
type Memento struct {
state string // 保存的状态
}
// 定义管理者类
type Caretaker struct {
mementos []*Memento // 持有备忘录对象的切片
}
// 实现保存备忘录方法
func (c *Caretaker) SaveMemento(m *Memento) {
c.mementos = append(c.mementos, m) // 将备忘录添加到切片中
}
// 实现获取备忘录方法
func (c *Caretaker) GetMemento(index int) *Memento {
if index >= 0 && index < len(c.mementos) { // 检查索引是否有效
return c.mementos[index] // 返回指定索引的备忘录
}
return nil // 返回空值
}
// 测试代码
func main() {
// 创建发起人对象,并设置初始状态
o := &Originator{state: "ON"}
o.ShowState()
// 创建管理者对象,并保存发起人的状态
c := &Caretaker{}
c.SaveMemento(o.CreateMemento())
// 改变发起人的状态,并继续保存
o.state = "OFF"
o.ShowState()
c.SaveMemento(o.CreateMemento())
// 再次改变发起人的状态,并继续保存
o.state = "ON"
o.ShowState()
c.SaveMemento(o.CreateMemento())
// 从管理者对象中获取备忘录,并恢复发起人的状态
o.RestoreMemento(c.GetMemento(0)) // 恢复到第一个状态
o.ShowState()
o.RestoreMemento(c.GetMemento(1)) // 恢复到第二个状态
o.ShowState()
}
总结
备忘录模式是一种将对象状态保存到外部对象中,并在需要时从外部对象中恢复的设计模式,它可以实现对象状态的历史记录和回溯,实现对象的撤销、回滚、恢复等功能。备忘录模式适用于需要保存和恢复对象状态,或者需要提供对象的快照的场景。