策略模式学习,使用go实现策略模式
策略模式
定义
策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到客户端的使用,也称为政策模式(Policy)。
策略模式主要的作用还是解耦策略的定义、创建和使用,控制代码的复杂度,让每个部分都不至于过于复杂、代码量过多。除此之外,对于复杂代码来说,策略模式还能让其满足开闭原则,添加新策略的时候,最小化、集中化代码改动,减少引入bug的风险。
优点
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点
1、策略类会增多。
2、所有策略类都需要对外暴露。
使用场景
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
代码实现
比如我们在做支付的项目中,对于支付的类型,我们可能会有多种类型,我们可能要做微信支付,支付宝支付,苹果内购等等一些列的产品。。。
所以我们可以把每种支付产品定义成一种策略,然后根据不同的业务场景选择不同的支付产品
package main
import (
"fmt"
)
func main() {
payment := NewPayment(&Weixin{
&PaymentConf{
appId: "wx1323234343434",
notifyURL: "weixin.notifyURL.com",
},
})
payment.Pay("小明", 12)
fmt.Println()
apay := NewPayment(&Ali{
&PaymentConf{
appId: "al1323234343434",
notifyURL: "ali.notifyURL.com",
},
})
apay.Pay("小红", 16)
}
type Context struct {
strategy PaymentStrategy
}
type PaymentConf struct {
appId string
notifyURL string
}
func NewPayment(strategy PaymentStrategy) *Context {
return &Context{
strategy: strategy,
}
}
func (p *Context) Pay(account string, money int) {
p.strategy.Pay(account, money)
}
type PaymentStrategy interface {
Pay(account string, money int)
}
type Weixin struct {
*PaymentConf
}
func (w *Weixin) Pay(account string, money int) {
fmt.Printf("Pay %d元 to %s by weixin", money, account)
}
type Ali struct {
*PaymentConf
}
func (a *Ali) Pay(account string, money int) {
fmt.Printf("Pay %d元 to %s by ali", money, account)
}
来看下结构图

策略模式和工厂模式的区别
工厂模式
1、目的是创建不同且相关的对象
2、侧重于"创建对象"
3、实现方式上可以通过父类或者接口
4、一般创建对象应该是现实世界中某种事物的映射,有它自己的属性与方法
策略模式
1、目的实现方便地替换不同的算法类
2、侧重于算法(行为)实现
3、实现主要通过接口
4、创建对象对行为的抽象而非对对象的抽象,很可能没有属于自己的属性
参考
【策略模式实现代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/策略模式
【大话设计模式】https://book.douban.com/subject/2334288/
【极客时间】设计模式之美
【工厂模式】https://www.cnblogs.com/ricklz/p/15399178.html
【策略模式】https://boilingfrog.github.io/2021/10/26/使用go实现策略模式/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2020-10-26 使用protobuf生成代码import包找不到