备忘录模式是一种行为型设计模式。这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态。通常它可以用来帮助设计撤销/恢复操作。
下面是备忘录设计模式的主要角色:
- Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录
- Memento(备忘录) : 存储着Originator的状态的对象
- Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录
Originator有两个方法: savememento() 和 restorememento()。
- savememento(): Originator通过这个方法将其状态保存进一个备忘录对象
- restorememento(): 这个方法将备忘录对象作为输入信息。Originator会通过传进来的备忘录信息执行重建。
下面是代码。
memento.go
type memento struct {
state string
}
func (m *memento) getSavedState() string {
return m.state
}
originator.go
type originator struct {
state string
}
func (e *originator) createMemento() *memento {
return &memento{state: e.state}
}
func (e *originator) restoreMemento(m *memento) {
e.state = m.getSavedState()
}
func (e *originator) setState(state string) {
e.state = state
}
func (e *originator) getState() string {
return e.state
}
caretaker.go
type caretaker struct {
mementoArray []*memento
}
func (c *caretaker) addMemento(m *memento) {
c.mementoArray = append(c.mementoArray, m)
}
func (c *caretaker) getMemento(index int) *memento {
return c.mementoArray[index]
}
注意在caretaker中包含了一个mementoArray对象来保存全部的备忘录信息。
main.go
import "fmt"
func main() {
caretaker := &caretaker{
mementoArray: make([]*memento, 0),
}
originator := &originator{
state: "A",
}
fmt.Printf("Originator Current State: %s
", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.setState("B")
fmt.Printf("Originator Current State: %s
", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.setState("C")
fmt.Printf("Originator Current State: %s
", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.restoreMemento(caretaker.getMemento(1))
fmt.Printf("Restored to State: %s
", originator.getState())
originator.restoreMemento(caretaker.getMemento(0))
fmt.Printf("Restored to State: %s
", originator.getState())
}
执行结果为:
Originator Current State: A Originator Current State: B Originator Current State: C Restored to State: B Restored to State: A
代码已上传至GitHub: zhyea / go-patterns / memento-pattern 。
END!