----------------strategy.go-----------------
package strategy const STRATEGY_300_RETURN_299 = "满300返299" const STRATEGY_REBATE_80 = "八折" type CashAcceptor interface { AcceptCash(float64) float64 } // 正常收费 type CashNormal struct { moneyCondition float64 moneyReturn float64 } func (self CashNormal) AcceptCash(money float64) (float64) { return money } // 满额返现 type CashReturn struct { moneyCondition float64 moneyReturn float64 } func (self CashReturn) AcceptCash(money float64) (float64) { if money >= self.moneyCondition { return money - self.moneyReturn } return money } // 折扣 type CashRebate struct { moneyRebate float64 } func (self CashRebate) AcceptCash(money float64) (float64) { return money * self.moneyRebate } // 对外访问的接口 type CashContext struct { cashAcceptor CashAcceptor } func (self CashContext) GetResult(money float64) float64 { return self.cashAcceptor.AcceptCash(money) } // 单纯的策略模式 func NewCashContext0(cashAcceptor CashAcceptor)*CashContext{ return &CashContext{cashAcceptor} } // 策略模式与简单工厂结合 func NewCashContext1(name string) (ctx *CashContext) { ctx = new(CashContext) switch name { case STRATEGY_300_RETURN_299: ctx.cashAcceptor = CashReturn{300, 299} case STRATEGY_REBATE_80: ctx.cashAcceptor = CashRebate{0.8} default: ctx.cashAcceptor = CashNormal{} } return }
----------------strategy_test.go-----------------
package strategy import "testing" //策略模式与简单工厂结合,策略的选择放到了context里,客户端只需要知道context的接口即可,不需要了解具体算法接口 func TestNewCashContext1(t *testing.T) { name := STRATEGY_300_RETURN_299 money:=500.0 ctx := NewCashContext1(name) result := ctx.GetResult(money) except:=money-299 if result!=except{ t.Fatalf("money %f after %s except %f,fact is %f",money,name,except,result) } name = STRATEGY_REBATE_80 rebate := 0.8 ctx = NewCashContext1(name) result = ctx.GetResult(money) except=money*rebate if result!=except{ t.Fatalf("money %f after %s except %f,fact is %f",money,name,except,result) } } // 普通策略模式,客户端需要自己确定选用哪种策略 func TestNewCashContext0(t *testing.T) { money:=500.0 condition:=300.0 ret:=299.0 ctx := NewCashContext0(CashReturn{condition,ret}) result := ctx.GetResult(money) except:=money-ret if result!=except{ t.Fatalf("money %f after %s except %f,fact is %f",money,STRATEGY_REBATE_80,except,result) } }