当前位置: 首页 > news >正文

go: Memento Pattern

项目结构:

image

 

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Memento Pattern备忘录模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/26 15:22
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : memento.go
*/
package entity// Memento 备忘录顶层接口
// 企业级规范:面向接口编程,方便扩展不同类型备忘录
type Memento interface {GetID() string // 唯一标识
}// ==============================================
// 以下为私有实现:外部包无法访问,保证封装性
// ==============================================// bizMemento 业务备忘录(私有结构体,外部无法读写状态)
type bizMemento struct {id        string // 快照IDstateData []byte // 序列化后的原发器状态(二进制,绝对安全)
}func (m *bizMemento) GetID() string {return m.id
}// NewBizMemento 创建备忘录(仅内部包可调用)
func NewBizMemento(id string, state []byte) Memento {return &bizMemento{id: id, stateData: state}
}// GetState 获取状态(仅内部包可调用)
func (m *bizMemento) GetState() []byte {return m.stateData
}/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Memento Pattern备忘录模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/26 15:23
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : originator.go
*/
package entityimport "encoding/json"// Originator 原发器接口
// 所有需要备份/回退的对象都必须实现该接口
type Originator interface {CreateMemento(id string) (Memento, error) // 创建快照RestoreFromMemento(m Memento) error       // 从快照恢复
}// ==============================================
// 业务原发器示例:企业配置(可替换为订单/设备/商品)
// ==============================================// EnterpriseConfig 企业配置(真实业务可替换为任意实体)
type EnterpriseConfig struct {CompanyID string  `json:"company_id"` // 企业IDName      string  `json:"name"`       // 企业名称Version   int     `json:"version"`    // 配置版本Status    string  `json:"status"`     // 状态:enable/disableBalance   float64 `json:"balance"`    // 账户余额
}// CreateMemento 创建备忘录:序列化状态为二进制(安全封装)
func (e *EnterpriseConfig) CreateMemento(id string) (Memento, error) {// 序列化为JSON二进制(可替换为Protobuf/gob)stateBytes, err := json.Marshal(e)if err != nil {return nil, err}return NewBizMemento(id, stateBytes), nil
}// RestoreFromMemento 从备忘录恢复状态
func (e *EnterpriseConfig) RestoreFromMemento(m Memento) error {bizM := m.(*bizMemento)// 反序列化return json.Unmarshal(bizM.GetState(), e)
}// 业务方法:修改状态
func (e *EnterpriseConfig) UpdateBalance(balance float64) {e.Balance = balancee.Version++
}func (e *EnterpriseConfig) UpdateStatus(status string) {e.Status = statuse.Version++
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Memento Pattern备忘录模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/26 15:23
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : memento_store.go
*/
package repositoryimport ("errors""godesginpattern/memento/entity"
)// MementoStore 备忘录存储接口
// 支持扩展:内存存储、Redis存储、MySQL存储
type MementoStore interface {Save(m entity.Memento) error           // 保存备忘录Get(id string) (entity.Memento, error) // 获取备忘录List() []entity.Memento                // 获取所有快照
}// ==============================================
// 默认实现:内存存储(生产可替换)
// ==============================================type memoryStore struct {mementos map[string]entity.Memento
}func NewMemoryStore() MementoStore {return &memoryStore{mementos: make(map[string]entity.Memento),}
}func (m *memoryStore) Save(me entity.Memento) error {m.mementos[me.GetID()] = mereturn nil
}func (m *memoryStore) Get(id string) (entity.Memento, error) {me, ok := m.mementos[id]if !ok {return nil, errors.New("备忘录不存在")}return me, nil
}func (m *memoryStore) List() []entity.Memento {list := make([]entity.Memento, 0, len(m.mementos))for _, v := range m.mementos {list = append(list, v)}return list
}

  

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Memento Pattern备忘录模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/26 15:23
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : memento_service'.go
*/
package serviceimport ("godesginpattern/memento/entity""godesginpattern/memento/repository"
)// MementoService 备忘录服务(Caretaker 负责人)
// 职责:只管理备忘录的保存、获取、回滚,不修改任何业务数据
type MementoService struct {store repository.MementoStore
}func NewMementoService(store repository.MementoStore) *MementoService {return &MementoService{store: store}
}// Backup 备份原发器状态
func (s *MementoService) Backup(originator entity.Originator, snapshotID string) error {m, err := originator.CreateMemento(snapshotID)if err != nil {return err}return s.store.Save(m)
}// Rollback 回滚到指定快照
func (s *MementoService) Rollback(originator entity.Originator, snapshotID string) error {m, err := s.store.Get(snapshotID)if err != nil {return err}return originator.RestoreFromMemento(m)
}// ListSnapshots 获取所有备份列表
func (s *MementoService) ListSnapshots() []entity.Memento {return s.store.List()
}

  

调用:

/*
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Memento Pattern备忘录模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : goLang 2024.3.6 go 26.2
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/4/26 18:54
# User      :  geovindu
# Product   : GoLand
# Project   : godesginpattern
# File      : mementobll.go
memento/
├── go.mod                  # 项目模块
├── internal/               # 内部包(外部不可访问)
│   ├── entity/             # 实体层:原发器、备忘录(核心数据)
│   │   ├── memento.go      # 备忘录接口 + 实现
│   │   └── originator.go   # 原发器接口 + 业务实体
│   ├── repository/         # 存储层:备忘录持久化/存储
│   │   └── memento_store.go
│   └── service/            # 服务层:负责人(Caretaker)核心逻辑
│       └── memento_service.go
└── cmd/                    # 应用层:入口、测试用例└── main.go
*/
package bllimport ("fmt""godesginpattern/memento/entity""godesginpattern/memento/repository""godesginpattern/memento/service"
)func MementoMain() {// ===================== 1. 初始化依赖(DI依赖注入) =====================store := repository.NewMemoryStore()        // 存储层memoSvc := service.NewMementoService(store) // 服务层// ===================== 2. 创建原发器(企业配置) =====================config := &entity.EnterpriseConfig{CompanyID: "COMPANY_001",Name:      "科技有限公司",Version:   1,Status:    "enable",Balance:   100000.00,}fmt.Println("===== 初始状态 =====")printConfig(config)// ===================== 3. 备份 V1 版本 =====================_ = memoSvc.Backup(config, "SNAPSHOT_V1")fmt.Println("\n✅ 已备份 SNAPSHOT_V1")// ===================== 4. 修改状态 =====================config.UpdateBalance(80000.00)config.UpdateStatus("disable")fmt.Println("\n===== 修改后状态 V2 =====")printConfig(config)// ===================== 5. 备份 V2 版本 =====================_ = memoSvc.Backup(config, "SNAPSHOT_V2")fmt.Println("\n✅ 已备份 SNAPSHOT_V2")// ===================== 6. 再次修改 =====================config.UpdateBalance(50000.00)fmt.Println("\n===== 二次修改状态 =====")printConfig(config)// ===================== 7. 回滚到 V1 =====================fmt.Println("\n🔄 回滚到 SNAPSHOT_V1")_ = memoSvc.Rollback(config, "SNAPSHOT_V1")printConfig(config)// ===================== 8. 回滚到 V2 =====================fmt.Println("\n🔄 回滚到 SNAPSHOT_V2")_ = memoSvc.Rollback(config, "SNAPSHOT_V2")printConfig(config)
}// printConfig 打印配置状态
func printConfig(c *entity.EnterpriseConfig) {fmt.Printf("企业ID:%s\n名称:%s\n版本:%d\n状态:%s\n余额:%.2f\n",c.CompanyID, c.Name, c.Version, c.Status, c.Balance)
}

 

输出:

image

 

http://www.jsqmd.com/news/704707/

相关文章:

  • 【LeetCode刷题日记】1047:双栈法与双指针法巧妙消除相邻重复字符
  • 量子计算中的状态准备技术:原理、方法与工程实践
  • 降AI工具会不会影响论文查重率:原理分析和实测数据深度解读 - 还在做实验的师兄
  • Windows系统优化终极指南:Chris Titus Tech WinUtil一键搞定所有系统管理
  • 企业级XPath定位工具架构设计与性能优化实践
  • Stable Diffusion本地部署与AI图像生成实战指南
  • Windows系统优化终极指南:Chris Titus Tech WinUtil工具完整实战教程
  • AI率检测阈值是怎么设定的:各高校和期刊标准差异解读 - 还在做实验的师兄
  • Snap.Hutao原神工具箱终极指南:10个提升游戏效率的实用技巧
  • 【限时解禁】VS Code Copilot Next 架构设计图自动化套件:1键生成符合CNCF云原生标准的双向可追溯流程图(含GitOps回滚锚点标记)
  • 终极指南:如何在电脑上流畅控制安卓手机的完整教程
  • 告别U盘文件管理烦恼:智能自动备份工具如何让数据同步变得轻松
  • LLaMA-Factory数据集格式详解与高质量数据构建方法-原理源码解析
  • 如何用3分钟将B站缓存视频转为通用MP4格式?
  • G-Helper:华硕笔记本性能管理的开源革命,3步释放硬件潜能
  • 打卡信奥刷题(3169)用C++实现信奥题 P7912 [CSP-J 2021] 小熊的果篮
  • GRETNA脑网络分析终极指南:5步掌握MATLAB图论计算全流程
  • 为什么不同降AI工具效果差异这么大:技术原理和算法差异深度分析 - 还在做实验的师兄
  • 深度解析Tiled地图编辑器符号链接路径问题的系统解决方案
  • 为什么同一篇论文知网和维普AIGC检测结果不同:平台差异深度解读 - 还在做实验的师兄
  • qmc-decoder终极指南:如何快速解锁QQ音乐加密音频文件?
  • 2026年3月洁净车间不锈钢操作台直销厂家推荐,洁净车间不锈钢操作台/工具柜,洁净车间不锈钢操作台厂商怎么选择 - 品牌推荐师
  • Rust的#[repr(C)]跨平台
  • Vercel agent-skills:为AI编码助手注入专业开发技能
  • 打卡信奥刷题(3170)用C++实现信奥题 P7915 [CSP-S 2021] 回文
  • 5分钟快速上手:用Arcade-plus制作你的第一个Arcaea谱面![特殊字符]
  • 嘎嘎降AI和PaperRR哪个更适合英文论文:2026年Turnitin检测对比 - 还在做实验的师兄
  • Venera漫画源自动更新终极指南:5分钟掌握智能同步技术
  • 深入浅出 Kubernetes 网络【20260426-002篇】
  • ANSYS WORKBENCH轴承动力学仿真:内外圈及故障特征频率振动加速度模拟研究