-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemento.go
101 lines (84 loc) · 2.9 KB
/
memento.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Package memento 备忘录模式: 不暴露对象实现细节的情况下恢复到对象之前的状态
package memento
import "fmt"
// Memento 备忘录接口
type Memento interface {
Tag() string // 备忘录标签
Restore() // 根据备忘录存储数据状态恢复原对象
}
// Originator 备忘录模式原发器接口
type Originator interface {
Save(tag string) Memento // 当前状态保存备忘录
}
// RolesPlayGame 支持存档的RPG游戏
type RolesPlayGame struct {
name string // 游戏名称
rolesState []string // 游戏角色状态
scenarioState string // 游戏场景状态
}
// NewRolesPlayGame 根据游戏名称和角色名,创建RPG游戏
func NewRolesPlayGame(name string, roleName string) *RolesPlayGame {
return &RolesPlayGame{
name: name,
rolesState: []string{roleName, "血量100"}, // 默认满血
scenarioState: "开始通过第一关", // 默认第一关开始
}
}
// Save 保存RPG游戏角色状态及场景状态到指定标签归档
func (r *RolesPlayGame) Save(tag string) Memento {
return newRPGArchive(tag, r.rolesState, r.scenarioState, r)
}
func (r *RolesPlayGame) SetRolesState(rolesState []string) {
r.rolesState = rolesState
}
func (r *RolesPlayGame) SetScenarioState(scenarioState string) {
r.scenarioState = scenarioState
}
// String 输出RPG游戏简要信息
func (r *RolesPlayGame) String() string {
return fmt.Sprintf("在%s游戏中,玩家使用%s,%s,%s;", r.name, r.rolesState[0], r.rolesState[1], r.scenarioState)
}
// rpgArchive rpg游戏存档,
type rpgArchive struct {
tag string // 存档标签
rolesState []string // 存档的角色状态
scenarioState string // 存档游戏场景状态
rpg *RolesPlayGame // rpg游戏引用
}
// newRPGArchive 根据标签,角色状态,场景状态,rpg游戏引用,创建游戏归档备忘录
func newRPGArchive(tag string, rolesState []string, scenarioState string, rpg *RolesPlayGame) *rpgArchive {
return &rpgArchive{
tag: tag,
rolesState: rolesState,
scenarioState: scenarioState,
rpg: rpg,
}
}
func (r *rpgArchive) Tag() string {
return r.tag
}
// Restore 根据归档数据恢复游戏状态
func (r *rpgArchive) Restore() {
r.rpg.SetRolesState(r.rolesState)
r.rpg.SetScenarioState(r.scenarioState)
}
// RPGArchiveManager RPG游戏归档管理器
type RPGArchiveManager struct {
archives map[string]Memento // 存储归档标签对应归档
}
func NewRPGArchiveManager() *RPGArchiveManager {
return &RPGArchiveManager{
archives: make(map[string]Memento),
}
}
// Reload 根据标签重新加载归档数据
func (r *RPGArchiveManager) Reload(tag string) {
if archive, ok := r.archives[tag]; ok {
fmt.Printf("重新加载%s;\n", tag)
archive.Restore()
}
}
// Put 保存归档数据
func (r *RPGArchiveManager) Put(memento Memento) {
r.archives[memento.Tag()] = memento
}