策略模式(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

results matching ""

    No results matching ""