Go中策略模式通过定义统一接口(如PaymentStrategy)封装不同算法,各策略类型独立实现,上下文(PaymentContext)持有接口并支持运行时切换,结合依赖注入与工厂函数实现动态、可插拔、易测试的算法选择。

在 Go 中用策略模式实现动态算法选择,核心是把不同算法封装成独立类型,通过统一接口调用,运行时按需切换——不改逻辑代码,只换策略实例。
所有算法必须满足同一契约。比如处理支付的场景,不同渠道(微信、支付宝、银行卡)有各自签名和提交逻辑,但对外都叫 Pay():
type PaymentStrategy interface {
Pay(amount float64, orderID string) error
Validate() bool
}接口越小越专注,只暴露必要方法。避免塞入配置、日志等无关行为,保持策略“可插拔”。
每个结构体实现接口,内部只管自己那块事。例如微信支付策略负责组装 XML、调用统一下单 API;支付宝策略则生成 JSON 请求并验签:
立即学习“go语言免费学习笔记(深入)”;
type WechatPay struct{ appID, mchID, apiKey string }
func (w WechatPay) Pay(amount float64, orderID string) error {
// 构造微信下单请求,签名,HTTP 调用...
return nil
}
func (w WechatPay) Validate() bool { return w.appID != "" && w.mchID != "" }
type AlipayPay struct{ appID, privateKey, publicKey string }
func (a AlipayPay) Pay(amount float64, orderID string) error {
// 组装 Alipay SDK 参数,RSA 签名,发起请求...
return nil
}
func (a AlipayPay) Validate() bool { return a.appID != "" && a.privateKey != "" }策略之间完全解耦,新增一种支付方式只需加新类型,不影响已有代码。
上下文(Context)不关心具体怎么算,只持有策略接口,并提供设置和执行入口:
type PaymentContext struct {
strategy PaymentStrategy
}
func (p *PaymentContext) SetStrategy(s PaymentStrategy) {
p.strategy = s
}
func (p *PaymentContext) Execute(amount float64, orderID string) error {
if p.strategy == nil {
return fmt.Errorf("no strategy set")
}
if !p.strategy.Validate() {
return fmt.Errorf("invalid strategy config")
}
return p.strategy.Pay(amount, orderID)
}ctx := &PaymentContext{strategy: WechatPay{...}}
ctx.SetStrategy(AlipayPay{...})
GetStrategy("alipay")
不要在上下文中 new 具体策略,而是由外部传入。这样单元测试可轻松注入 mock 策略:
// 测试用的假策略
type MockPay struct{ Called bool }
func (m *MockPay) Pay(_ float64, _ string) error { m.Called = true; return nil }
func (m *MockPay) Validate() bool { return true }
// 测试中直接替换
ctx := &PaymentContext{}
ctx.SetStrategy(&MockPay{})
ctx.Execute(100.0, "test123")
if !mock.Called { t.Fatal("expected Pay to be called") }生产环境可通过配置中心或 URL 参数决定策略类型,再由工厂构造对应实例注入上下文,真正实现“逻辑不变、行为可配”。
以上就是如何在Golang中应用策略模式实现动态算法选择_灵活切换逻辑的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号