策略模式在Golang中通过接口定义行为契约、结构体实现具体策略、上下文持策略并支持运行时切换,结合映射或工厂可动态加载策略,灵活且解耦。

策略模式的核心是把算法的定义和使用分开,让不同算法能互换而不影响调用方。Golang 没有类继承,但通过接口 + 结构体组合 + 函数字段,完全可以优雅实现策略模式,且支持运行时动态切换。
先声明一个接口,描述所有策略共有的行为。比如处理支付的场景:
type PaymentStrategy interface {
Pay(amount float64) error
}这个接口就是“策略契约”,后续所有具体策略(如支付宝、微信、银行卡)都必须实现 Pay 方法。
每个策略用独立结构体实现接口,内部封装各自逻辑:
立即学习“go语言免费学习笔记(深入)”;
type Alipay struct{}
func (a Alipay) Pay(amount float64) error {
fmt.Printf("Using Alipay to pay %.2f\n", amount)
return nil
}
type WechatPay struct{}
func (w WechatPay) Pay(amount float64) error {
fmt.Printf("Using WechatPay to pay %.2f\n", amount)
return nil
}
type CreditCard struct {
CardNumber string
}
func (c CreditCard) Pay(amount float64) error {
fmt.Printf("Using credit card %s to pay %.2f\n", c.CardNumber, amount)
return nil
}注意:CreditCard 带字段,说明策略可以携带状态——这是比纯函数更灵活的地方。
创建一个上下文结构体,持有一个 PaymentStrategy 接口字段,并提供设置/切换方法:
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("no payment strategy set")
}
return p.strategy.Pay(amount)
}使用示例:
ctx := &PaymentContext{}
// 动态切换策略
ctx.SetStrategy(Alipay{})
ctx.ExecutePayment(99.9)
ctx.SetStrategy(CreditCard{CardNumber: "1234-5678"})
ctx.ExecutePayment(299.0)当策略较多时,可用 map 或工厂函数集中管理:
var StrategyMap = map[string]PaymentStrategy{
"alipay": Alipay{},
"wechat": WechatPay{},
"card": CreditCard{CardNumber: "default"},
}
// 根据字符串名获取策略(注意:返回值需是接口类型)
func GetStrategy(name string) (PaymentStrategy, bool) {
s, ok := StrategyMap[name]
return s, ok
}这样就能从外部输入(如 API query 参数)安全地加载策略:
if strategy, ok := GetStrategy("wechat"); ok {
ctx.SetStrategy(strategy)
ctx.ExecutePayment(100.0)
}基本上就这些。Golang 的策略模式不依赖继承,靠接口解耦 + 值/指针传递 + 运行时赋值,干净又实用。
以上就是如何使用Golang实现策略模式动态切换_使用Strategy Pattern切换算法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号