GoLang设计模式11 - 备忘录模式

备忘录模式是一种行为型设计模式。这种模式允许我们保存对象在某些关键节点时的必要信息,以便于在适当的时候可以将之恢复到之前的状态。通常它可以用来帮助设计撤销/恢复操作。

下面是备忘录设计模式的主要角色:

  • Originator(发起者):Originator是当前的基础对象,它会将自己的状态保存进备忘录
  • Memento(备忘录) : 存储着Originator的状态的对象
  • Caretaker(管理人):Caretaker是保存着多条备忘录的对象,并维护着备忘录的索引,在需要的时候会返回相应的备忘录

Originator有两个方法: savememento() 和 restorememento()

  • savememento(): Originator通过这个方法将其状态保存进一个备忘录对象
  • restorememento(): 这个方法将备忘录对象作为输入信息。Originator会通过传进来的备忘录信息执行重建。

下面是代码。

memento.go

1
2
3
4
5
6
7
type memento struct {
    state string
}
 
func (m *memento) getSavedState() string {
    return m.state
}

originator.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

1
2
3
4
5
6
7
8
9
10
11
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]
}

注意在caretaker中包含了一个mementoArray对象来保存全部的备忘录信息。

main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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("B")
    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())
}

执行结果为:

1
2
3
4
5
Originator Current State: A
Originator Current State: B
Originator Current State: C
Restored to State: B
Restored to State: A

代码已上传至GitHub: zhyea / go-patterns / memento-pattern 。

END!

 


仅是学习笔记,难免出错,望不吝指点
 
标签: Go , 设计模式
分类: GoLanggo设计模式
 
转 https://www.cnblogs.com/amunote/p/15416587.html
posted @   dreamw  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示