策略模式
定义
定义算法族,分别封装起来,让他们相互可以替换,此模式让算法的变化独立于使用算法的客户(head first 设计模式书中定义)。在golang 中相当于一个interface 抽象方法类,各个结构体来实现interface 抽象的方法。
角色
- 调用策略主体
- 策略模板
- 策略具体实现
例子
小明同学还信用卡,还的方式有很多例如支付宝、微信等方式
1.定义抽象策略模板
type Payment interface {
Pay(amount int64)error
}
2.定义具体还款策略
type WechatPay struct{
}
func (w *WechatPay)Pay(amount int64)error{
fmt.Println("wechat pay amount",amount)
return nil
}
type ZhifubaoPay struct{
}
func (z *ZhifubaoPay)Pay(amount int64)error{
fmt.Println("zhifubao pay amount",amount)
return nil
}
3.定义调用策略主体
type PaymentCard struct{
PayAmount int64
PaymentType Payment
}
func (p *PaymentCard)PaymentMoney()error{
if PaymentType != nil{
return PaymentType.Pay(p.PayAmount)
}
return fmt.Errorf("not init paymentType")
}
4.使用
func main(){
//微信还款
xiaoMingPay := &PaymentCard{PayAmount:100,PaymentType:WechatPay{}}
xiaoMingPay.PaymentMoney()
//支付宝还款
xiaoMingPay = &PaymentCard{PayAmount:100,PaymentType:ZhifubaoPay{}}
xiaoMingPay.PaymentMoney()
}
5.总结
相当于是 小明还款的主体方法PaymentMoney 不用改变,而还款策略可以根据策略模板不断的扩展。核心思想就是主体是不变动的,还款方式是变动的,抽象变动的。