简介
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不暴露对象内部状态的情况下,捕获并保存对象的内部状态,以便将对象恢复到之前的状态。
备忘录模式涉及到以下几个主要角色:
发起人(Originator)
负责创建备忘录,并记录当前时刻的内部状态;还负责使用备忘录来恢复内部状态。
备忘录(Memento)
存储发起人对象的内部状态,并提供给发起人对象恢复其状态的接口。
管理者(Caretaker)
负责保存备忘录,但不能对备忘录的内容进行操作或检查。
比如张三今天想去买车,但是又怕忘记了,就把买车这个形成,放到备忘录中,并且记录一个状态。
Demo
// Memento 备忘录
type Memento struct {
State string // 状态
Item string // 记录事情
}
// Originator 发起人
type Originator struct {
State string
Item string
}
func (o *Originator) CreateMemento() *Memento {
return &Memento{State: o.State, Item: o.Item}
}
func (o *Originator) SetMemento(memento *Memento) {
o.State = memento.State
o.Item = memento.Item
}
func (o *Originator) ShowState() {
fmt.Printf("Current State:%s , Item:%s", o.State, o.Item)
}
// Caretaker 管理者
type Caretaker struct {
Memento *Memento
}
测试
func TestMemento(t *testing.T) {
zhangsan := &Originator{State: "紧急", Item: "今天要去看马自达"}
caretaker := &Caretaker{}
caretaker.Memento = zhangsan.CreateMemento() // 把zhangsan的备忘录加到管理者中去
fmt.Println(zhangsan)
zhangsan.State = "不太紧急"
zhangsan.Item = "今天去看宝马"
// 不行,我还是恢复到原来的备忘吧
zhangsan.SetMemento(caretaker.Memento)
fmt.Println(zhangsan)
}
作用和场景
- 保存和恢复对象状态
备忘录模式允许在不暴露对象内部结构的情况下,保存和恢复对象的状态。这对于需要回滚或撤销操作的场景非常有用。
封装对象状态
备忘录模式封装了对象状态的存储和恢复逻辑,使得对象本身无需关心这些细节。
当系统需要提供撤销(Undo)机制,允许用户回到之前的状态时,备忘录模式是一种常见的设计选择。
当需要保存和恢复对象状态,以应对系统中的意外情况或用户操作时,备忘录模式是一种有效的实现方式。
当需要保存对象状态,但不希望将其内部状态暴露给其他对象时,备忘录模式可以帮助隐藏对象的实现细节。