设计模式Go版-策略模式

----------------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)
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值