go实现备忘录模式
备忘录模式让我们可以保存对象状态的快照。 你可使用这些快照来将对象恢复到之前的状态。 这在需要在对象上实现撤销-重做操作时非常实用。
目录结构
├── caretaker.go
├── memento.go
├── memento_test.go
└── originator.go
memento.go / 备忘录
package memento
type Memento struct {
state string
}
func (m *Memento) getSavedState() string {
return m.state
}
originator.go / 原发器
package memento
// 原发器
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 / 负责人
package memento
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]
}
memento_test.go / 测试
package memento
import (
"fmt"
"testing"
)
func TestMemento(t *testing.T) {
caretaker := &Caretaker{
mementoArray: make([]*Memento, 0),
}
originator := &Originator{
state: "State 1",
}
fmt.Printf("Originator: %v\n", originator.state)
caretaker.AddMemento(originator.CreateMemento())
originator.state = "State 2"
fmt.Printf("Originator: %v\n", originator.state)
caretaker.AddMemento(originator.CreateMemento())
originator.state = "State 3"
fmt.Printf("Originator: %v\n", originator.state)
caretaker.AddMemento(originator.CreateMemento())
originator.RestoreMemento(caretaker.GetMemento(1))
fmt.Printf("Restore to: %v\n", originator.state)
originator.RestoreMemento(caretaker.GetMemento(0))
fmt.Printf("Restore to: %v\n", originator.state)
}
输出结果
=== RUN TestMemento
Originator: State 1
Originator: State 2
Originator: State 3
Restore to: State 2
Restore to: State 1
--- PASS: TestMemento (0.00s)