策略模式
定義
定義算法族,分別封裝起來,讓他們相互可以替換,此模式讓算法的變化獨立於使用算法的客戶(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 不用改變,而還款策略可以根據策略模板不斷的擴展。核心思想就是主體是不變動的,還款方式是變動的,抽象變動的。