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 没有抽象类和运行时多态语法糖,但正因如此,策略模式写出来更轻量、更显式——接口即协议,组合即扩展,切换即赋值。不复杂但容易忽略的是:策略对象最好无状态,或状态由外部传入,才能安全复用。










