如何用Golang实现策略模式_Golang 策略模式实现实践


策略模式通过接口或函数封装不同算法,使算法可互换且符合开闭原则;以折扣计算为例,定义DiscountStrategy接口及多种会员折扣实现,Order上下文通过SetStrategy动态切换策略,调用GetFinalPrice获得不同折扣价;Golang中亦可用函数类型简化实现,定义DiscountFunc类型及对应函数,OrderFunc结构体接收函数式策略,实现更简洁的动态替换;该模式适用于支付方式、排序算法等需运行时切换行为的场景,避免多重条件判断,提升扩展性与维护性。

如何用golang实现策略模式_golang 策略模式实现实践

策略模式是一种行为设计模式,它让你定义一系列算法或行为,并将它们封装在独立的类或结构体中,使得它们可以互相替换。在 Golang 中虽然没有类的概念,但通过接口和函数式编程特性,我们可以很自然地实现策略模式。

策略模式的核心思想

将不同的“策略”(即算法)抽象为统一接口,客户端通过该接口调用具体策略,而无需关心内部实现。当需要更换算法时,只需更换策略实例,不修改原有代码,符合开闭原则。

比如:支付方式、排序算法、日志输出格式等场景都适合使用策略模式。

使用接口实现策略模式

假设我们有一个任务是计算订单折扣,不同会员等级有不同的折扣策略。

定义策略接口:

type DiscountStrategy interface {
    CalculateDiscount(amount float64) float64
}

实现具体策略:

type NormalUserStrategy struct{}
<p>func (s <em>NormalUserStrategy) CalculateDiscount(amount float64) float64 {
return amount </em> 0.05 // 5% 折扣
}</p><p>type VipUserStrategy struct{}</p><p>func (s <em>VipUserStrategy) CalculateDiscount(amount float64) float64 {
return amount </em> 0.15 // 15% 折扣
}</p><p>type PremiumUserStrategy struct{}</p><p>func (s <em>PremiumUserStrategy) CalculateDiscount(amount float64) float64 {
return amount </em> 0.30 // 30% 折扣
}

上下文使用策略:

type Order struct {
    Amount   float64
    Strategy DiscountStrategy
}
<p>func (o *Order) SetStrategy(strategy DiscountStrategy) {
o.Strategy = strategy
}</p><p>func (o *Order) GetFinalPrice() float64 {
discount := o.Strategy.CalculateDiscount(o.Amount)
return o.Amount - discount
}

使用示例:

Northstar盈富量化交易软件 Northstar盈富量化交易软件

Northstar盈富量化交易软件是一个基于B/S架构的一站式量化交易平台,能进行历史回放、策略研发、模拟交易、实盘交易。 已对接国内期货CTP交易系统,并陆续补充国内股票XTP渠道、老虎证券、币安等多种渠道。这是一个面向程序员的开源高频量化交易软件,用于期货、股票、外汇、炒币等多种交易场景,实现自动交易。暂时只对接了国内期货交易所,理论上可以对接任意交易所。 功能特性:1、一站式平台,可适配对接

Northstar盈富量化交易软件 35 查看详情 Northstar盈富量化交易软件

order := &Order{Amount: 100}
<p>order.SetStrategy(&NormalUserStrategy{})
fmt.Printf("普通用户最终价格: %.2f\n", order.GetFinalPrice()) // 95.00</p><p>order.SetStrategy(&VipUserStrategy{})
fmt.Printf("VIP用户最终价格: %.2f\n", order.GetFinalPrice()) // 85.00</p><p>order.SetStrategy(&PremiumUserStrategy{})
fmt.Printf("高级用户最终价格: %.2f\n", order.GetFinalPrice()) // 70.00

使用函数式风格简化策略模式

Golang 支持函数作为一等公民,我们可以用函数替代接口,使代码更简洁。

定义函数类型作为策略:

type DiscountFunc func(amount float64) float64

实现不同策略函数:

func NormalDiscount(amount float64) float64 {
    return amount * 0.05
}
<p>func VipDiscount(amount float64) float64 {
return amount * 0.15
}</p><p>func PremiumDiscount(amount float64) float64 {
return amount * 0.30
}

更新上下文以接受函数:

type OrderFunc struct {
    Amount   float64
    Strategy DiscountFunc
}
<p>func (o *OrderFunc) SetStrategy(f DiscountFunc) {
o.Strategy = f
}</p><p>func (o *OrderFunc) GetFinalPrice() float64 {
if o.Strategy != nil {
discount := o.Strategy(o.Amount)
return o.Amount - discount
}
return o.Amount
}

调用方式类似:

orderFunc := &OrderFunc{Amount: 100}
orderFunc.SetStrategy(NormalDiscount)
fmt.Printf("函数式-普通用户: %.2f\n", orderFunc.GetFinalPrice())

适用场景与优势

策略模式适用于以下情况:

  • 有多个相似类,仅行为不同
  • 需要在运行时动态切换算法
  • 避免使用多重条件判断(如 if-else 或 switch)选择行为

优势包括:

  • 算法可自由切换
  • 扩展性强,新增策略不影响现有代码
  • 职责清晰,每种策略独立封装

基本上就这些。Golang 虽无继承,但通过接口和函数式编程能优雅实现策略模式,关键是把变化的行为抽象出来,让调用方只依赖抽象,不依赖具体实现。

以上就是如何用Golang实现策略模式_Golang 策略模式实现实践的详细内容,更多请关注其它相关文章!


# 是一个  # seo教程seo教程  # 移动设备如何优化网站  # 正规关键词排名按天扣费  # 阿勒泰高级网站建设企业  # 怎样进行网站优化运营  # 兰山区网站关键词优化  # 延安关键词排名哪家好  # 网站怎么打造品牌推广方案  # 营销推广品牌案例分享会  # 合肥seo营销  # 开闭  # 等多种  # go  # 一站式  # 普通用户  # 支付方式  # 国内  # 布尔  # 适用于  # 如何用  # 会员  # 排序算法  # switch  # golang 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 德邦快递查询入口登录官网 德邦快递单号查询系统入口  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  使用jQuery精确检测除指定元素外任意位置的点击事件  Vue 3中独立响应式实例的创建与应用  原子笔记app误删找回教程  抖音官网入口快速访问 抖音网页版账号注册解析  J*aScript模块加载器_RequireJS原理分析  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  鲨鱼剧场app金币获取方法  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  外卖小程序对接第三方配送  Golang如何实现HTTP请求重试机制_Golang HTTP请求错误处理策略  cad视图选项卡不见了怎么办_cad视图标签恢复显示方法  猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  更换小红书群背景怎么换?小红书群规则怎么设置?  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  163邮箱网页版入口 163邮箱在线使用  学习通网页版课程打不开_课程无法访问时的解决方法  WooCommerce 购物车:始终显示所有交叉销售商品  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  在PySimpleGUI中实现键盘按键绑定按钮事件  苹果SE如何开启单手模式_苹果SE单手操作功能  《狐友》联系客服方法  京东物流快递破损了怎么办_京东快递破损理赔流程  易车网官网直达入口 易车网在线登录入口  Linux如何开发轻量级数据服务模块_Linux服务化设计  微信如何设置字体大小_微信字体设置的阅读舒适  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  《深林》冬季章节图文攻略  蜻蜓FM如何设置移动流量播放  《原神》月之一版本新增书籍一览  动漫岛在线动漫网 动漫岛动漫在线观看官方入口  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  消除网页顶部意外空白线:CSS布局常见问题与解决方案  电脑开不了机怎么办 电脑无法开机的解决方法  抖音小程序怎么开通?小程序开通条件是什么?  实现二叉树的层序插入:基于树大小的路径导航  汽水音乐网页版登录 汽水音乐网页端官方入口  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  Win10输入法不见了怎么办 Win10找回语言栏图标教程  OpenWeatherMap API:通过城市名称获取天气预报数据指南  《长生:天机降世》火塔小怪大全  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  顺丰快递收费标准查询_如何查看顺丰最新收费价格  抖音团长模式怎么做?团长模式是什么意思?  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  《偃武》甘宁技能详解 

 2025-11-22

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.