行为型设计模式—策略模式

策略模式:定义一类算法族,将每个算法分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户端。

策略模式与模板模式解耦维度不同,策略模式是让完成某个任务的具体方式可以相互切换,而模版模式则是针对一个流程的共性梳理出固定的执行步骤,二者经常配合使用。

下面使用策略模式实现一个支付功能的支付策略

首先是定义PayBehavior 策略的接口

type PayBehavior interface {
 OrderPay(px *PayCtx)
}

定义两个策略的实现

// 微信支付
"本文使用的完整可运行源码
去公众号「网管叨bi叨」发送【设计模式】即可领取"
type WxPay struct {}
func(*WxPay) OrderPay(px *PayCtx) {
 fmt.Printf("Wx支付加工支付请求 %v\n", px.payParams)
 fmt.Println("正在使用Wx支付进行支付")
}

// 三方支付
type ThirdPay struct {}
func(*ThirdPay) OrderPay(px *PayCtx) {
 fmt.Printf("三方支付加工支付请求 %v\n", px.payParams)
 fmt.Println("正在使用三方支付进行支付")
}

有了策略的实现后,还要上下文来协调,以及持有完成这个任务所必需的那些入参payParams

type PayCtx struct {
 // 提供支付能力的接口实现
 payBehavior PayBehavior
 // 支付参数
 payParams map[string]interface{}
}

func (px *PayCtx) setPayBehavior(p PayBehavior) {
 px.payBehavior = p
}

func (px *PayCtx) Pay() {
 px.payBehavior.OrderPay(px)
}

func NewPayCtx(p PayBehavior) *PayCtx {
 // 支付参数,Mock数据
 params := map[string]interface{} {
  "appId": "234fdfdngj4",
  "mchId": 123456,
 }
 return &PayCtx{
  payBehavior: p,
  payParams: params,
 }
}

程序调用

func main() {
 wxPay := &WxPay{}
 px := NewPayCtx(wxPay)
 px.Pay()
 // 假设现在发现微信支付没钱,改用三方支付进行支付
 thPay := &ThirdPay{}
 px.setPayBehavior(thPay)
 px.Pay()
}

参考公众号网管叨bi叨

你可能感兴趣的:(go语言设计模式,设计模式,策略模式)