博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大话设计模式(Golang) 二、策略模式
阅读量:6497 次
发布时间:2019-06-24

本文共 1566 字,大约阅读时间需要 5 分钟。

hot3.png

模式特点:定义算法家族并且分别封装,它们之间可以相互替换而不影响客户端,客户只知道一个类就可以了。

程序实例:商场促销。

package mainimport (	"fmt")type CashSuper interface {	AcceptCash(price float64) float64}//正常type CashNormal struct {}func (this *CashNormal) AcceptCash(price float64) float64 {	if price < 0 {		panic("不允许负数作为参数")	}	return price}type CashRebate struct {	condition float64	rebate    float64}// 满减func (this *CashRebate) AcceptCash(price float64) float64 {	if price < 0 || this.condition < 0 || this.rebate < 0 {		panic("不允许负数作为参数")	}	if price >= this.condition {		return price - float64(int(price/this.condition))*this.rebate	} else {		return price	}}type CashDiscount struct {	discount float64}// 折扣func (this *CashDiscount) AcceptCash(price float64) float64 {	if price < 0 || this.discount < 0 {		panic("不允许负数作为参数")	}	if this.discount >= 1 {		panic("折扣无效")	}	return price * this.discount}type CashContext struct {	cs CashSuper}func (this *CashContext) GetResult(price float64) float64 {	return this.cs.AcceptCash(price)}func NewCashContext(style string) *CashContext {	context := &CashContext{}	switch style {	case "正常收费":		context.cs = &CashNormal{}	case "满300返100":		context.cs = &CashRebate{300, 100}	case "8折":		context.cs = &CashDiscount{0.8}	default:		panic("计价方式错误!")	}	return context}func main() {	var total float64	cash1 := NewCashContext("正常收费")	total += cash1.GetResult(1 * 10000)	cash2 := NewCashContext("满300返100")	total += cash2.GetResult(1 * 10000)	cash3 := NewCashContext("8折")	total += cash3.GetResult(1 * 10000)	fmt.Println("total:", total)}

 

转载于:https://my.oschina.net/zhoukuo/blog/710056

你可能感兴趣的文章
沙朗javascript总结一下(一)---基础知识
查看>>
js深入研究之函数内的函数
查看>>
LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard
查看>>
python之commands模块
查看>>
android应用开发--------------看RadioGroup源代码,写相似单选选项卡的集成控件(如底部导航,tab等等)...
查看>>
LeetCode - Binary Tree Level Order Traversal
查看>>
FTP协议完全详解
查看>>
【C语言天天练(十五)】字符串输入函数fgets、gets和scanf
查看>>
【环境配置】配置sdk
查看>>
accept()
查看>>
USB 2.0 Hub IP Core
查看>>
USB 2.0 OTG IP Core
查看>>
解读浮动闭合最佳方案:clearfix
查看>>
Charles使用
查看>>
Python GUI编程(Tkinter) windows界面开发
查看>>
dynamic关键字的使用
查看>>
iOS 音乐播放器之锁屏效果+歌词解析
查看>>
android O 蓝牙设备默认名称更改
查看>>
阳台的青椒苗
查看>>
swapper进程【转】
查看>>