推荐阅览: 聊聊在生产环境中使用Docker的最佳实践 – 掘金 ()
Go 备忘录模式解说和代码示例
备忘录是一种行为规划模式, 答应生成目标状况的快照并在以后将其复原。
备忘录不会影响它所处理的目标的内部结构, 也不会影响快照中保存的数据。
概念示例
备忘录模式让我们可以保存目标状况的快照。 你可使用这些快照来将目标恢复到之前的状况。 这在需要在目标上完成吊销-重做操作时十分有用。
originator.go: 原发器
package main
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
}
memento.go: 备忘录
package main
type Memento struct {
state string
}
func (m *Memento) getSavedState() string {
return m.state
}
caretaker.go: 负责人
package main
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]
}
main.go: 客户端代码
package main
import "fmt"
func main() {
caretaker := &Caretaker{
mementoArray: make([]*Memento, 0),
}
originator := &Originator{
state: "A",
}
fmt.Printf("Originator Current State: %s\n", originator.getState())
// 添加一个备忘录
caretaker.addMemento(originator.createMemento())
originator.setState("C")
fmt.Printf("Originator Current State: %s\n", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.restoreMemento(caretaker.getMemento(1))
fmt.Printf("Restored to State: %s\n", originator.getState())
originator.restoreMemento(caretaker.getMemento(0))
fmt.Printf("Restored to State: %s\n", originator.getState())
}
output.txt: 执行结果
Originator Current State: A
Originator Current State: C
Restored to State: C
Restored to State: A