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)
本文作者:jikefan
本文链接:https://www.cnblogs.com/jikefan/articles/18255763
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。