策略模式:定义一类算法族,将每个算法分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户端。
策略模式与模板模式解耦维度不同,策略模式是让完成某个任务的具体方式可以相互切换,而模版模式则是针对一个流程的共性梳理出固定的执行步骤,二者经常配合使用。
下面使用策略模式实现一个支付功能的支付策略
首先是定义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叨