package strategy
type cashCal interface {
cashCal(float64) float64
}
type deal struct{}
type normalDeal struct {
deal
}
func (nd *normalDeal) cashCal(Price float64) float64 {
return Price
}
type rebateDeal struct {
deal
rebate float64
}
func (rd *rebateDeal) setRebate(rebate float64) {
rd.rebate = rebate
}
func (rd *rebateDeal) cashCal(Price float64) float64 {
return Price * rd.rebate
}
type returnDeal struct {
deal
up float64
ret float64
}
func (rd *returnDeal) setUp(up float64) {
rd.up = up
}
func (rd *returnDeal) setRet(ret float64) {
rd.ret = ret
}
func (rd *returnDeal) cashCal(Price float64) float64 {
if Price >= rd.up {
return Price - rd.ret
}
return Price
}
type context struct {
deal cashCal
}
func (cxt *context) init(typ string) {
switch typ {
case "normal":
cxt.deal = new(normalDeal)
case "rebate":
d := new(rebateDeal)
d.setRebate(0.8)
cxt.deal = d
case "ret":
d := new(returnDeal)
d.setUp(300)
d.setRet(100)
cxt.deal = new(returnDeal)
}
}
func (cxt *context) cal(price float64) float64 {
return cxt.deal.cashCal(price)
}
package strategy import "testing" func TestStrategy(t *testing.T) { var cxt context cxt.init("normal") if got := cxt.cal(120); got != 120 { t.Errorf("cxt.cal(120)=%v,want %v", 120, 120) } }
阿里云双十一云服务器拼团活动,已经打到最低价99元一年!有需要的可以考虑一波了!
https://m.aliyun.com/act/team1111/#/share?params=N.9g4CZ2TwSh.qilw7y0a
分析:通过测试代码可以发现,策略模式之对外暴露了一个struct,更好的体现了封装,降低了耦合。