登录
首页 >  Golang >  Go教程

Golang策略模式实现与算法切换技巧

时间:2026-01-06 17:21:36 299浏览 收藏

今天golang学习网给大家带来了《Golang策略模式实现与算法切换方法》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

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

如何使用Golang实现策略模式动态切换_使用Strategy Pattern切换算法

策略模式的核心是把算法的定义和使用分开,让不同算法能互换而不影响调用方。Golang 没有类继承,但通过接口 + 结构体组合 + 函数字段,完全可以优雅实现策略模式,且支持运行时动态切换。

定义统一策略接口

先声明一个接口,描述所有策略共有的行为。比如处理支付的场景:

type PaymentStrategy interface {
    Pay(amount float64) error
}

这个接口就是“策略契约”,后续所有具体策略(如支付宝、微信、银行卡)都必须实现 Pay 方法。

实现多个具体策略

每个策略用独立结构体实现接口,内部封装各自逻辑:

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)
  • 切换只需调用 SetStrategy,无需修改业务逻辑
  • 策略可来自配置、用户选择、甚至 HTTP 请求参数
  • 支持组合策略(如先校验再支付),只需新写一个实现该接口的结构体

进阶:用工厂或映射简化策略获取

当策略较多时,可用 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策略模式实现与算法切换技巧》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>