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!
仅是学习笔记,难免出错,望不吝指点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)