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

 

posted @ 2023-04-21 11:30  格局打得开  阅读(35)  评论(0)    收藏  举报