备忘录模式通过发起人、备忘录和管理者三个角色实现对象状态的保存与恢复,适用于撤销操作、游戏存档等场景;Go语言利用结构体和包级私有字段模拟封装,保障状态安全,支持深拷贝、差量保存优化内存,可结合时间戳构建版本控制,常与命令模式联用。
在Go语言中使用备忘录模式(Memento Pattern)可以有效保存和恢复对象的内部状态,而无需破坏封装性。这种行为型设计模式适用于需要实现撤销操作、历史记录或快照功能的场景,比如文本编辑器、游戏存档、事务回滚等。
备忘录模式包含三个基本角色:
通过这种结构,既保护了对象的私有状态,又实现了状态的外部存储与恢复。
由于Go没有类和访问修饰符,我们通过结构体、接口和包级私有字段来模拟
封装。以下是一个简单的实现示例:
package main
import "fmt"
// 游戏角色作为发起人
type GameRole struct {
HP, MP int
}
// 创建状态快照
func (g *GameRole) Save() *Memento {
return &Memento{State: *g}
}
// 恢复到指定状态
func (g *GameRole) Restore(m *Memento) {
g.HP = m.State.HP
g.MP = m.State.MP
}
func (g *GameRole) String() string {
return fmt.Sprintf("HP: %d, MP: %d", g.HP, g.MP)
}
// memento.go
// 备忘录结构体,保存角色状态
type Memento struct {
State GameRole // 存储完整状态副本
}
// caretaker.go
// 管理者,管理多个存档
type Caretaker struct {
Snapshots []*Memento
}
func (c *Caretaker) Add(m *Memento) {
c.Snapshots = append(c.Snapshots, m)
}
func (c *Caretaker) Get(index int) *Memento {
if index < 0 || index >= len(c.Snapshots) {
return nil
}
return c.Snapshots[index]
}
假设我们要实现一个简单的游戏存档系统:
func main() {
role := &GameRole{HP: 100, MP: 50}
caretaker := &Caretaker{}
fmt.Println("初始状态:", role)
// 存档1
caretaker.Add(role.Save())
// 角色受伤
role.HP = 30
fmt.Println("战斗后:", role)
// 存档2
caretaker.Add(role.Save())
// 再次受伤
role.HP = 10
fmt.Println("濒死状态:", role)
// 读取第一次存档
role.Restore(caretaker.Get(0))
fmt.Println("恢复到初始存档:", role)
}
输出结果:
初始状态: HP: 100, MP: 50 战斗后: HP: 30, MP: 50 濒死状态: HP: 10, MP: 50 恢复到初始存档: HP: 100, MP: 50
基本上就这些。Golang虽然语法简洁,但通过结构体组合与包机制完全可以优雅实现设计模式。备忘录模式在需要状态追踪的场景下非常实用,且易于与其他模式(如命令模式)结合使用。
# go
# golang
# go语言
# app
# ai
# 封装性
# 封装
# 结构体
# 接口
相关文章:
,sp开头的版面叫什么?
如何在IIS中配置站点IP、端口及主机头?
焦点电影公司作品,电影焦点结局是什么?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何通过免费商城建站系统源码自定义网站主题与功能?
简历在线制作网站免费版,如何创建个人简历?
Java解压缩zip - 解压缩多个文件或文件夹实例
黑客如何利用漏洞与弱口令入侵网站服务器?
如何通过多用户协作模板快速搭建高效企业网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
建站主机是否等同于虚拟主机?
实现虚拟支付需哪些建站技术支撑?
股票网站制作软件,网上股票怎么开户?
如何构建满足综合性能需求的优质建站方案?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
如何在阿里云完成域名注册与建站?
如何快速查询域名建站关键信息?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
北京网站制作网页,网站升级改版需要多久?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
python的本地网站制作,如何创建本地站点?
建站主机选购指南与交易推荐:核心配置解析
如何用VPS主机快速搭建个人网站?
建站之星如何快速更换网站模板?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
详解jQuery停止动画——stop()方法的使用
独立制作一个网站多少钱,建立网站需要花多少钱?
如何通过远程VPS快速搭建个人网站?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
临沂网站制作企业,临沂第三中学官方网站?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
宝塔Windows建站如何避免显示默认IIS页面?
如何用已有域名快速搭建网站?
如何快速搭建安全的FTP站点?
建站之星收费标准详解:套餐费用及年费价格表一览
网站好制作吗知乎,网站开发好学吗?有什么技巧?
建站与域名管理如何高效结合?
建站之星3.0如何解决常见操作问题?
微信h5制作网站有哪些,免费微信H5页面制作工具?
Bpmn 2.0的XML文件怎么画流程图
宝塔面板创建网站无法访问?如何快速排查修复?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
Android自定义控件实现温度旋转按钮效果
*请认真填写需求信息,我们会在24小时内与您取得联系。