Golang如何使用命令模式封装操作_Golang 命令模式操作封装实践


命令模式通过将请求封装为对象,实现发起者与执行者的解耦。在Go中,定义Command接口,由具体命令如InsertCommand和DeleteCommand实现Execute和Undo方法,Receiver负责实际操作,Invoker管理命令执行与撤销。示例中文本编辑器通过命令模式支持插入、删除及撤销,提升了可维护性和扩展性,适用于需撤销、重做或日志记录的场景。

golang如何使用命令模式封装操作_golang 命令模式操作封装实践

在 Golang 中使用命令模式封装操作,能有效解耦请求的发起者与执行者,提升代码的可扩展性和可维护性。尤其适用于需要支持撤销、重做、延迟执行或日志记录的场景。下面通过一个实际例子说明如何在 Go 中实践命令模式。

什么是命令模式

命令模式将“请求”封装成独立的对象,使得可以用不同的请求对客户端进行参数化。核心角色包括:

  • Command(命令):定义执行操作的接口
  • ConcreteCommand(具体命令):实现 Command 接口,持有接收者并调用其方法
  • Receiver(接收者):真正执行操作的对象
  • Invoker(调用者):触发命令执行,不关心具体实现
  • Client(客户端):创建命令对象并绑定接收者

Go 实现:文本编辑器操作封装

假设我们正在实现一个简单的文本编辑器,支持插入文本和删除文本,并希望未来支持撤销功能。我们可以用命令模式来封装这些操作。

type Receiver struct { Content string }

// 插入文本 func (r *Receiver) Insert(text string) { r.Content += text println("插入:", text) }

// 删除最后 n 个字符 func (r *Receiver) Delete(n int) { if n > len(r.Content) { n = len(r.Content) } deleted := r.Content[len(r.Content)-n:] r.Content = r.Content[:len(r.Content)-n] println("删除:", deleted) }

定义命令接口:

type Command interface { Execute() Undo() // 支持撤销 }

实现具体的插入命令:

type InsertCommand struct { receiver *Receiver text string }

func NewInsertCommand(receiver Receiver, text string) InsertCommand { return &InsertCommand{receiver: receiver, text: text} }

func (c *InsertCommand) Execute() { c.receiver.Insert(c.text) }

func (c *InsertCommand) Undo() { // 撤销插入:删除末尾相同长度内容 c.receiver.Delete(len(c.text)) }

实现删除命令:

Primeshot Primeshot

专业级AI人像摄影工作室

Primeshot 36 查看详情 Primeshot type DeleteCommand struct { receiver *Receiver count int deleted string // 缓存被删内容用于撤销 }

func NewDeleteCommand(receiver Receiver, count int) DeleteCommand { return &DeleteCommand{receiver: receiver, count: count} }

func (c *DeleteCommand) Execute() { // 先缓存当前内容以便撤销 start := len(c.receiver.Content) - c.count if start

func (c *DeleteCommand) Undo() { // 撤销删除:重新插入之前删掉的内容 c.receiver.Insert(c.deleted) }

定义调用者,比如一个操作历史管理器:

type EditorInvoker struct { history []Command }

func (i *EditorInvoker) Execute(command Command) { command.Execute() i.history = append(i.history, command) // 记录用于撤销 }

func (i *EditorInvoker) Undo() { if len(i.history) == 0 { println("无操作可撤销") return } last := i.history[len(i.history)-1] last.Undo() i.history = i.history[:len(i.history)-1] }

使用示例

func main() { receiver := &Receiver{Content: ""} invoker := &EditorInvoker{}
// 执行插入
insertCmd := NewInsertCommand(receiver, "Hello ")
invoker.Execute(insertCmd)

insertCmd2 := NewInsertCommand(receiver, "World!")
invoker.Execute(insertCmd2)

fmt.Println("当前内容:", receiver.Content)

// 执行删除
deleteCmd := NewDeleteCommand(receiver, 6)
invoker.Execute(deleteCmd)

fmt.Println("删除后:", receiver.Content)

// 撤销删除
invoker.Undo()
fmt.Println("撤销删除后:", receiver.Content)

// 撤销插入
invoker.Undo()
fmt.Println("再次撤销后:", receiver.Content)

}

输出结果:

插入: Hello 插入: World! 当前内容: Hello World! 删除: World! 删除后: Hello 撤销删除后: Hello World! 再次撤销后: Hello

优势与适用场景

通过命令模式,我们将“插入”“删除”等操作抽象为对象,带来以下好处:

  • 调用者无需知道操作细节,只依赖 Command 接口
  • 易于扩展新命令,如“替换”“复制”等
  • 天然支持撤销/重做,只需在命令中保存状态
  • 可实现宏命令(组合多个命令)
  • 便于实现操作队列、远程执行、日志回放等高级功能

基本上就这些。Golang 虽无类继承,但通过接口和组合,依然能优雅实现命令模式。关键在于将行为封装为对象,并解耦执行逻辑。这种模式在构建编辑器、工作流引擎、自动化脚本等系统时非常实用。

以上就是Golang如何使用命令模式封装操作_Golang 命令模式操作封装实践的详细内容,更多请关注其它相关文章!


# golang  # 确山县网站推广优化排名  # 信阳网站推荐优化  # ultimate seo zencart  # 网站建设与推广特点分析  # 工作流  # 多个  # 客户端  # 调用者  # 重做  # 适用于  # 可以用  # 如何使用  # 器中  # 编辑器  # win  # ai  # app  # go  # 鹤壁seo  # 遂川网站网络推广和优化  # 宝鸡抖音seo免费咨询  # 怎么海淘手表网站推广呢  # OK卡网站建设需要  # 新疆市建设局网站 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 解决异步Python机器人中同步操作的阻塞问题  Go App Engine 项目结构与包管理深度指南  Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南  荣耀magicv5怎么上手测评  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  《大学搜题酱》官网地址登录  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  163邮箱在线登录 163邮箱网页版在线入口  Linux如何开发轻量级数据服务模块_Linux服务化设计  房产|直播|视频号怎么认证开通?|直播|需要什么资质?  多闪APP官方下载安装入口_多闪最新版本获取入口  利用Flexbox实现图片元素的二维布局:2x2网格排列指南  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  江苏大剧院会员卡购买步骤  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程  在Spring Boot Thymeleaf中利用布尔属性实现容器的条件显示  《美篇》取消会员自动续费方法  Win10怎么设置快速启动 Win10开启快速启动设置方法  Yandex浏览器官方入口_Yandex搜索引擎中文版  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  使用 J*aScript 随机化 CSS Grid 布局中的元素顺序  抖音视频如何添加标题?添加标题有哪些好处?  美发店速赢秘籍  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  猫眼app抢票快还是小程序快  圆通快递官网入口查询单号 手机版官方查询入口  WooCommerce 购物车:始终显示所有交叉销售商品  键盘测试软件哪个好_键盘故障检测工具推荐  qq邮箱怎么注册_QQ邮箱注册步骤与注意事项  惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  Python中安全地将环境变量转换为整数的类型注解指南  Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题  百度识图图像分析 百度识图识别平台  4399正版网页版入口高清直达链接  b站如何剪辑视频_b站必剪app使用教程  秋风萧瑟洪波涌起中的萧瑟指的是什么  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  精通VS Code多光标编辑以实现闪电般快速的修改  《腾讯相册管家》注销账号方法  在PySimpleGUI中实现键盘按键绑定按钮事件  《百度畅听版》关闭兴趣推荐方法  PDF文件去水印平台入口 PDF水印删除网址  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  微信客户端如何找回密码_微信客户端忘记密码找回方法  如何外贸网站设计-能留住客户提升用户体验! 

 2025-11-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.