package memento import ( "fmt" "time" ) //////////////////////////////// //使用游戏玩家的角色存档和读取的例子 //GamePlayer 是一个Originator 提供当前的游戏状态 type GamePlayer struct { hp, mp, role, level int //血量,魔法值,当前关卡 } //RoleStatusMemento 一条备忘数据,存放瞬时状态的数据结构,一个数据结构 type RoleStatusMemento struct { tag string //存档记录本身的名称,以便下次识别读取 hp, mp, level int //血量,魔法值,角色类型,当前关卡, timeMark string //存档的可视化时间 } //RoleStatusCaretaker 负责保存角色当前的状态数据,提供存取能力 //RoleStatusCaretaker 也是占内存/存储的地方,如果不停的读取,IO压力会变大的很大 type RoleStatusCaretaker struct { memens map[string]*RoleStatusMemento } //SaveStatus 保存当前角色的游戏状态 func (r *RoleStatusCaretaker) SaveStatus(item *RoleStatusMemento) { r.memens[item.tag] = item fmt.Printf("Game File %s Saved at %s\n", item.tag, item.timeMark) } //RetriveStatus 提供需要的状态 func (r *RoleStatusCaretaker) RetriveStatus(savedTag string) *RoleStatusMemento { return r.memens[savedTag] } //Create 创建游戏的当前档案存档 func (g *GamePlayer) Create(tagName string) *RoleStatusMemento { return &RoleStatusMemento{ tag: tagName, hp: g.hp, mp: g.mp, level: g.level, timeMark: time.Now().String(), } } //Load 载入存档,恢复数据 func (g *GamePlayer) Load(rm *RoleStatusMemento) { g.mp = rm.mp g.hp = rm.hp g.level = rm.level fmt.Printf("Game Profile had been restored to %s : %s\n", rm.tag, rm.timeMark) } //Status 玩家角色的当前状态 func (g *GamePlayer) Status() { fmt.Printf("Current Level :%d HP:%d, MP:%d\n", g.level, g.hp, g.mp) }