策略模式(Strategy Design Pattern)
在策略模式中,一个类的行为可以根据算法在运行时更改。一个完整的策略模式需要创建出各个策略对象和使用策略的上下文。
这里用电商网站购物车结算为例,可以针对普通用户、会员又不同的折扣,还可以有满减的活动策略。
代码示例
package strategy
type DiscountStrategy interface {
//计算折扣,total为总价
Discount(total float64) float64
}
type MemberDiscountStrategy struct{}
func (s MemberDiscountStrategy) Discount(total float64) float64 {
//普通用户9.5折
return total * 0.05
}
type VIPDiscountStrategy struct{}
func (s VIPDiscountStrategy) Discount(total float64) float64 {
//VIP打9折
return total * 0.1
}
type OverDiscountStragy struct{}
func (s OverDiscountStragy) Discount(total float64) float64 {
//满200减40
if total >= 200 {
return 40
}
return 0
}
//折扣上下文
type DiscountContext struct {
strategy DiscountStrategy
}
func (c *DiscountContext) SetStrategy(strategy DiscountStrategy) {
c.strategy = strategy
}
func (c DiscountContext) CaculatePrice(total float64) float64 {
return total - c.strategy.Discount(total)
}
调用:
ctx := &DiscountContext{}
ctx.SetStrategy(MemberDiscountStrategy{})
fmt.Printf("使用普通用户策略后最终价格:%.2f\n", ctx.CaculatePrice(300))
ctx.SetStrategy(VIPDiscountStrategy{})
fmt.Printf("使用会员策略后最终价格:%.2f\n", ctx.CaculatePrice(300))
ctx.SetStrategy(OverDiscountStragy{})
fmt.Printf("使用满减策略后最终价格:%.2f\n", ctx.CaculatePrice(300))
// Output:
// 使用普通用户策略后最终价格:285.00
// 使用会员策略后最终价格:270.00
// 使用满减策略后最终价格:260.00