GoLang设计模式12 - 备忘录模式(行为型)
备忘录模式是一种行为型设计模式。这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态。通常它可以用来帮助设计撤销/恢复操作。
下面是备忘录设计模式的主要角色:
- Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录
- Memento(备忘录) : 存储着Originator的状态的对象
- Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录
Originator有两个方法: savememento() 和 restorememento()。
- savememento(): Originator通过这个方法将其状态保存进一个备忘录对象
- restorememento(): 这个方法将备忘录对象作为输入信息。Originator会通过传进来的备忘录信息执行重建。
下面是代码。
1 type memento struct { 2 state string 3 } 4 5 func (m *memento) getSavedState() string { 6 return m.state 7 } 8 9 type originator struct { 10 state string 11 } 12 13 func (e *originator) createMemento() *memento { 14 return &memento{state: e.state} 15 } 16 17 func (e *originator) restoreMemento(m *memento) { 18 e.state = m.getSavedState() 19 } 20 21 func (e *originator) setState(state string) { 22 e.state = state 23 } 24 25 func (e *originator) getState() string { 26 return e.state 27 } 28 29 type caretaker struct { 30 mementoArray []*memento 31 } 32 33 func (c *caretaker) addMemento(m *memento) { 34 c.mementoArray = append(c.mementoArray, m) 35 } 36 37 func (c *caretaker) getMemento(index int) *memento { 38 return c.mementoArray[index] 39 } 40 41 //注意在caretaker中包含了一个mementoArray对象来保存全部的备忘录信息。 42 43 func main() { 44 caretaker := &caretaker{ 45 mementoArray: make([]*memento, 0), 46 } 47 originator := &originator{ 48 state: "A", 49 } 50 fmt.Printf("Originator Current State: %s\n", originator.getState()) 51 caretaker.addMemento(originator.createMemento()) 52 53 originator.setState("B") 54 fmt.Printf("Originator Current State: %s\n", originator.getState()) 55 56 caretaker.addMemento(originator.createMemento()) 57 originator.setState("C") 58 59 fmt.Printf("Originator Current State: %s\n", originator.getState()) 60 caretaker.addMemento(originator.createMemento()) 61 62 originator.restoreMemento(caretaker.getMemento(1)) 63 fmt.Printf("Restored to State: %s\n", originator.getState()) 64 65 originator.restoreMemento(caretaker.getMemento(0)) 66 fmt.Printf("Restored to State: %s\n", originator.getState()) 67 }
执行结果为:
1 Originator Current State: A 2 Originator Current State: B 3 Originator Current State: C 4 Restored to State: B 5 Restored to State: A
浙公网安备 33010602011771号