信息发布→ 登录 注册 退出

如何使用Golang实现策略模式_动态切换算法或行为

发布时间:2026-01-05

点击量:
策略模式在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)

真正做到了“行为即配置”,扩展新策略只需新增实现 + 工厂分支,不修改原有逻辑。

标签:# 接口  # 就走  # 还可  # 较多  # 只需  # 多个  # 就能  # 这是  # 进阶  # 支付方式  # http  # 算法  # 对象  # Interface  # js  # 继承  # 命令行参数  # 结构体  # 字符串  # 封装  # 面向对象  # switch  # 微信支付  # 微信  # 支付宝  # golang  # go  # json  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!