Go中策略模式通过接口定义算法契约,结构体实现具体逻辑,组合方式动态切换。1. 定义PaymentStrategy接口统一Pay方法;2. Alipay、Wechat、CreditCard等结构体分别实现支付逻辑;3. OrderProcessor持有策略接口,运行时通过SetStrategy切换;4. 使用map注册策略并工厂创建,避免if-else,支持配置驱动;5. 策略应无状态以确保复用安全,符合Go组合优于继承的哲学。

在 Go 语言中实现策略模式,核心是用接口定义算法行为,用结构体实现具体策略,再通过依赖注入或工厂方式动态切换——不靠继承,靠组合与接口,简洁又符合 Go 的哲学。
定义统一策略接口
策略模式的第一步是抽象出算法的公共契约。Go 中用接口最自然:
type PaymentStrategy interface { Pay(amount float64) error}
这个接口只有一个方法,但足够表达“支付行为”的本质。所有具体策略(如支付宝、微信、银行卡)都只需实现它,无需共享父类。
实现多个具体策略
每个策略封装独立逻辑,彼此解耦。例如:
立即学习“go语言免费学习笔记(深入)”;
AlipayStrategy:调用支付宝 SDK 或模拟签名支付 WechatStrategy:处理微信预下单和回调验签 CreditCardStrategy:校验卡号、有效期并调用网关
它们各自实现 Pay 方法,内部逻辑完全隔离,新增一种支付方式只需加一个新结构体+实现接口,不影响其他代码。
在上下文中持有并切换策略
业务结构体(比如 OrderProcessor)不关心具体怎么付,只依赖接口:
type OrderProcessor struct { strategy PaymentStrategy // 运行时可替换}func (p *OrderProcessor) SetStrategy(s PaymentStrategy) { p.strategy = s}func (p *OrderProcessor) Process(amount float64) error { if p.strategy == nil { return errors.New("no payment strategy set") } return p.strategy.Pay(amount)}
使用时可随时切换:
按用户选择: processor.SetStrategy(&WechatStrategy{}) 按环境配置:从 YAML 读取策略名,用 map 映射到实例 按金额阈值:小额走零钱,大额走银行卡
用简单工厂或配置驱动策略创建
避免大量 if-else 分支,推荐用注册表 + 工厂函数:
var strategies = map[string]PaymentStrategy{ "alipay": &AlipayStrategy{}, "wechat": &WechatStrategy{}, "card": &CreditCardStrategy{},}func GetStrategy(name string) (PaymentStrategy, error) { s, ok := strategies[name] if !ok { return nil, fmt.Errorf("unknown strategy: %s", name) } return s, nil}
这样策略增减只需改 map,调用方无感知。进阶可结合 init() 自动注册,或用反射加载插件式策略。
基本上就这些。Go 没有抽象类和运行时多态语法糖,但正因如此,策略模式写出来更轻量、更显式——接口即协议,组合即扩展,切换即赋值。不复杂但容易忽略的是:策略对象最好无状态,或状态由外部传入,才能安全复用。
以上就是如何在Golang中实现策略模式动态切换算法_Golang策略模式实践方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1428838.html
微信扫一扫
支付宝扫一扫