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语言免费学习笔记(深入)”;
它们各自实现 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{})
避免大量 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策略模式实践方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号