策略模式在Go中通过接口和结构体组合实现,支持运行时动态切换支付策略;定义PaymentStrategy接口,各支付方式如Alipay、WechatPay等结构体实现该接口,PaymentContext持有所选策略并提供SetStrategy和ExecutePayment方法,还可通过工厂函数NewStrategy根据名称动态创建策略。

策略模式的核心是把一组算法或行为封装成独立的类,让它们可以互相替换,而调用方无需关心具体实现。Golang 没有传统面向对象的继承机制,但通过接口(interface)和结构体组合,能非常自然地实现策略模式,且支持运行时动态切换。
定义统一策略接口
所有策略必须实现同一接口,这是动态切换的基础。例如处理不同支付方式:
type PaymentStrategy interface {
Pay(amount float64) error
}
这个接口只声明行为,不绑定具体逻辑。后续每种支付方式(如支付宝、微信、银行卡)都实现该接口即可。
实现多个具体策略
每个策略用一个结构体 + 方法实现。例如:
立即学习“go语言免费学习笔记(深入)”;
type Alipay struct{}
func (a Alipay) Pay(amount float64) error {
fmt.Printf("使用支付宝支付 %.2f 元\n", amount)
return nil
}
type WechatPay struct{}
func (w WechatPay) Pay(amount float64) error {
fmt.Printf("使用微信支付 %.2f 元\n", amount)
return nil
}
type BankTransfer struct{}
func (b BankTransfer) Pay(amount float64) error {
fmt.Printf("使用银行转账支付 %.2f 元\n", amount)
return nil
}
注意:这些结构体可以为空,也可以携带配置字段(如 API 密钥、超时时间),便于策略个性化。
在上下文中持有并切换策略
创建一个上下文结构体(如 PaymentContext),内部保存当前策略,并提供设置和执行方法:
type PaymentContext struct {
strategy PaymentStrategy
}
func (p *PaymentContext) SetStrategy(s PaymentStrategy) {
p.strategy = s
}
func (p *PaymentContext) ExecutePayment(amount float64) error {
if p.strategy == nil {
return errors.New("未设置支付策略")
}
return p.strategy.Pay(amount)
}
使用时可随时更换策略:
- 初始化上下文:ctx := &PaymentContext{}
- 切换为支付宝:ctx.SetStrategy(Alipay{})
- 执行支付:ctx.ExecutePayment(99.9)
- 中途切换微信:ctx.SetStrategy(WechatPay{}),再调用 ExecutePayment 就走新逻辑
进阶:支持策略工厂与配置驱动
如果策略较多或需根据字符串名创建,可加一层工厂函数:
func NewStrategy(name string) (PaymentStrategy, error) {
switch name {
case "alipay":
return Alipay{}, nil
case "wechat":
return WechatPay{}, nil
case "bank":
return BankTransfer{}, nil
default:
return nil, fmt.Errorf("未知策略: %s", name)
}
}
这样就能从配置(如 JSON/YAML)、命令行参数或 HTTP 请求中读取策略名,动态加载:
strategy, _ := NewStrategy("wechat")
ctx.SetStrategy(strategy)
ctx.ExecutePayment(199.0)
真正做到了“行为即配置”,扩展新策略只需新增实现 + 工厂分支,不修改原有逻辑。










