命令模式将操作封装为对象,解耦请求发起者与接收者。在Go中,通过接口定义Command,结构体实现具体命令,绑定Receiver执行动作,Invoker调用Execute,支持Undo与历史记录,适用于任务队列、GUI按钮、宏命令等场景。
命令模式是一种行为设计模式,它将请求封装为对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。在 Golang 中,虽然没有类和继承这样的传统面向对象特性,但通过接口和结构体的组合,依然可以优雅地实现命令模式。
命令模式的关键在于把“操作”当成一个对象。这个对象知道要执行什么动作、由谁执行,并能触发执行。它解耦了发起请求的对象和接收请求的对象,提升了系统的灵活性和可扩展性。
典型结构包括:
假设我们要实现一个遥控器控制灯的开关功能。
package main import "fmt" // Receiver:实际执行操作的对象 type Light struct {} func (l *Light) On() { fmt.Println("灯打开了") } func (l *Light) Off() { fmt.Println("灯关闭了") } // Command 接口 type Command interface { Execute() } // 具体命令:开灯 type LightOnCommand struct { light *Light } func (c *LightOnCommand) Execute() { c.light.On() } // 具体命令:关灯 type LightOffCommand struct { light *Light } func (c *LightOffCommand) Execute() { c.light.Off() } // Invoker:触发命令 type RemoteControl struct { command Command } func (r *RemoteControl) PressButton() { if r.command != nil { r.command.Execute() } } func main() { light := &Light{} onCmd := &LightOnCommand{light: light} offCmd := &LightOffCommand{light: light} remote := &RemoteControl{} remote.command = onCmd remote.PressButton() // 输出:灯打开了 remote.command = offCmd remote.PressButton() // 输出:灯关闭了 }
命令模式的优势之一是容易支持撤销(Undo)。每个命令除了 Execute,还可以实现 Undo 方法。
type Command interface { Execute() Undo() } func (c *LightOnCommand) Undo() { c.light.Off() } func (c *LightOffCommand) Undo() { c.light.On() } // 可记录历史用于撤销 type RemoteControlWithUndo struct { command Command history []Command } func (r *RemoteControlWithUndo) PressButton() { if r.command != nil { r.command.Execute() r.history = append(r.history, r.command) } } func (r *RemoteControlWithUndo) Undo() { if len(r.history) > 0 { last := r.history[len(r.history)-1] last.Undo() r.history = r.history[:len(r.history)-1] } }
这样就可以实现按一次撤销上一个操作,适合做事务性控制或 UI 操作回退。
命令模式适用于需要将操作抽象化的场景:
例如,在后台管理系统中,可以把“创建用户”、“发送邮件”、“记录日志”等封装为命令链,统一调度。
基本上就这些。Go 虽然不是面向对象语言,但通过接口
和组合,完全可以实现干净的命令模式结构,让代码更灵活、易测试、可扩展。
# go
# golang
# app
# mac
# ai
# 面向对象
# 封装
# 结构体
# 继承
# 接口
# 对象
# 异步
# rpc
# ui
# 绑定
# 适用于
# 是一种
# 打开了
# 还可以
# 一是
# 可以用
# 关闭了
# 开灯
相关文章:
中山网站推广排名,中山信息港登录入口?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
制作网站的公司有哪些,做一个公司网站要多少钱?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
广德云建站网站建设方案与建站流程优化指南
宝塔面板如何快速创建新站点?
如何在局域网内绑定自建网站域名?
北京企业网站设计制作公司,北京铁路集团官方网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
javascript基本数据类型及类型检测常用方法小结
如何在自有机房高效搭建专业网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
黑客如何通过漏洞一步步攻陷网站服务器?
北京制作网站的公司,北京铁路集团官方网站?
开封网站制作公司,网络用语开封是什么意思?
Android滚轮选择时间控件使用详解
seo网站制作优化,网站SEO优化步骤有哪些?
如何在IIS服务器上快速部署高效网站?
如何快速搭建虚拟主机网站?新手必看指南
如何快速启动建站代理加盟业务?
如何在IIS中新建站点并配置端口与物理路径?
深圳网站制作案例,网页的相关名词有哪些?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何实现建站之星域名转发设置?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何生成腾讯云建站专用兑换码?
建站主机无法访问?如何排查域名与服务器问题
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
红河网站制作公司,红河事业单位身份证如何上传?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
制作宣传网站的软件,小红书可以宣传网站吗?
江苏网站制作公司有哪些,江苏书法考级官方网站?
高端云建站费用究竟需要多少预算?
建站之星后台密码遗忘如何找回?
香港网站服务器数量如何影响SEO优化效果?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
北京网站制作公司哪家好一点,北京租房网站有哪些?
php json中文编码为null的解决办法
行程制作网站有哪些,第三方机票电子行程单怎么开?
建站之星如何实现五合一智能建站与营销推广?
如何在IIS7上新建站点并设置安全权限?
PHP 500报错的快速解决方法
5种Android数据存储方式汇总
如何规划企业建站流程的关键步骤?
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何通过多用户协作模板快速搭建高效企业网站?
如何在阿里云虚拟服务器快速搭建网站?
淘宝制作网站有哪些,淘宝网官网主页?
*请认真填写需求信息,我们会在24小时内与您取得联系。