什么是策略模式?
不同的算法按照统一的标准封装,客户端根据不同的场景,决策使用何种算法。
优势
- 典型的高内聚:算法和算法之间完全独立、互不干扰
- 典型的松耦合:客户端依赖的是接口的抽象方法
- 沉淀:每一个封装好的算法都是这个技术团队的财富,且未来可以被轻易的修改、复用
使用场景
当代码的下一步面临选择的时候都可以使用「策略模式」,我们把不同选择的算法按照统一的标准封装,得到一类算法集的过程,就是实现「策略模式」的过程。
实现代码
package main import ( "fmt" "runtime" ) //------------------------------------------------------------ //我的代码没有`else`系列 //策略模式 //@auhtor TIGERB<https://github.com/TIGERB> //------------------------------------------------------------ const ( // ConstWechatPay 微信支付 ConstWechatPay = "wechat_pay" // ConstAliPayWap 支付宝支付 网页版 ConstAliPayWap = "AliPayWapwap" // ConstBankPay 银行卡支付 ConstBankPay = "quickbank" ) // Context 上下文 type Context struct { // 用户选择的支付方式 PayType string `json:"pay_type"` } // PaymentInterface 支付方式接口 type PaymentInterface interface { Pay(ctx *Context) error // 支付 Refund(ctx *Context) error // 退款 } // WechatPay 微信支付 type WechatPay struct { } // Pay 当前支付方式的支付逻辑 func (p *WechatPay) Pay(ctx *Context) (err error) { // 当前策略的业务逻辑写这 fmt.Println(runFuncName(), "使用微信支付...") return } // Refund 当前支付方式的支付逻辑 func (p *WechatPay) Refund(ctx *Context) (err error) { // 当前策略的业务逻辑写这 fmt.Println(runFuncName(), "使用微信退款...") return } // AliPayWap 支付宝网页版 type AliPayWap struct { } // Pay 当前支付方式的支付逻辑 func (p *AliPayWap) Pay(ctx *Context) (err error) { // 当前策略的业务逻辑写这 fmt.Println(runFuncName(), "使用支付宝网页版支付...") return } // Refund 当前支付方式的支付逻辑 func (p *AliPayWap) Refund(ctx *Context) (err error) { // 当前策略的业务逻辑写这 fmt.Println(runFuncName(), "使用支付宝网页版退款...") return } // BankPay 银行卡支付 type BankPay struct { } // Pay 当前支付方式的支付逻辑 func (p *BankPay) Pay(ctx *Context) (err error) { // 当前策略的业务逻辑写这 fmt.Println(runFuncName(), "使用银行卡支付...") return } // Refund 当前支付方式的支付逻辑 func (p *BankPay) Refund(ctx *Context) (err error) { // 当前策略的业务逻辑写这 fmt.Println(runFuncName(), "使用银行卡退款...") return } // 获取正在运行的函数名 func runFuncName() string { pc := make([]uintptr, 1) runtime.Callers(2, pc) f := runtime.FuncForPC(pc[0]) return f.Name() } func main() { // 相对于被调用的支付策略 这里就是支付策略的客户端 // 业务上下文 ctx := &Context{ PayType: "wechat_pay", } // 获取支付方式 var instance PaymentInterface switch ctx.PayType { case ConstWechatPay: instance = &WechatPay{} case ConstAliPayWap: instance = &AliPayWap{} case ConstBankPay: instance = &BankPay{} default: panic("无效的支付方式") } // 支付 instance.Pay(ctx) }
运行结果:
main.(*WechatPay).Pay 使用微信支付...
参考文章:https://studygolang.com/articles/29048
6 条评论
写的不错,博主交换友链吗?http://www.gold404.cn/虽然日流量只有几十,但一直在进步,还有那个啥,我也是一个想转go的php程序员。。。。
可以做哈,做好后通知我下
友链已做,你有时间记得也做下我的哈。
K先生个人博客http://www.gold404.cn
已做好
想问下博主现在的工作是PHP还是Go啊
PHP和Go都在写