备忘录模式允许我们在不破坏对象封装的前提下,捕获并保存对象的内部状态,以便在需要时可以将对象恢复到先前的状态。
在备忘录模式中,主要有三个角色:
Originator(发起人):负责创建一个备忘录用来记录自身的内部状态,并可以使用备忘录恢复到先前的状态。
Memento(备忘录):用来存储Originator的内部状态,防止被其他对象访问。
Caretaker(负责人):负责保存备忘录对象,并提供将备忘录恢复到先前状态的方法。
以下是Go的简单示例:
package main
import "fmt"
// 备忘录
type Memento struct {
state string
}
func NewMemento(state string) *Memento {
return &Memento{state: state}
}
func (m *Memento) GetState() string {
return m.state
}
// 发起人
type Originator struct {
state string
}
func NewOriginator() *Originator {
return &Originator{}
}
func (o *Originator) SetState(state string) {
o.state = state
}
func (o *Originator) CreateMemento() *Memento {
return NewMemento(o.state)
}
func (o *Originator) RestoreMemento(m *Memento) {
o.state = m.GetState()
}
// 负责人
type Caretaker struct {
memento *Memento
}
func (c *Caretaker) SaveMemento(m *Memento) {
c.memento = m
}
func (c *Caretaker) GetMemento() *Memento {
return c.memento
}
func main() {
originator := NewOriginator()
caretaker := &Caretaker{}
originator.SetState("State 1")
fmt.Println("Current state:", originator.state)
memento := originator.CreateMemento()
caretaker.SaveMemento(memento)
originator.SetState("State 2")
fmt.Println("Current state:", originator.state)
memento = caretaker.GetMemento()
originator.RestoreMemento(memento)
fmt.Println("Current state:", originator.state)
}
在上面的示例中,发起人有一个内部的状态state,通过SetState设置状态,通过CreateMemento创建一个备忘录,将当前的状态保存到备忘录中,通过RestoreMemento将发起人的状态恢复到备忘录所保存的状态。
备忘录有一个state字段用来保存发起人状态。
发起人不能直接访问备忘录的state字段,只能通过GetState获取状态。
负责人保存一个备忘录对象,提供SaveMemento和GetMemento方法来保存和获取备忘录。
在示例中,先设置Originator的状态为"State 1",然后创建一个备忘录,并将备忘录保存到Caretaker中。接着,把Originator的状态设定为"State 2",并通过Caretaker获取之前保存的备忘录,然后将Originator的状态恢复到备忘录保存的状态。最后,我们打印当前的状态,可以看到Originator的状态已经恢复到了之前的状态。