文档章节

大话设计模式(Golang) 二、策略模式

平凡之路
 平凡之路
发布于 2016/07/11 21:25
字数 284
阅读 90
收藏 0

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

package main

import (
	"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)
}

 

© 著作权归作者所有

平凡之路
粉丝 42
博文 54
码字总数 14528
作品 0
海淀
架构师
私信 提问
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象工厂模...

泥沙砖瓦浆木匠
2014/07/24
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
4
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部