策略模式

目录

  • 策略模式
      • 分析
    • 应用场景
    • 代码实现
    • 实例
      • 代码
      • 单元测试
    • 总结

策略模式核心在于利用多态性,这是目前主流的面向对象语言都支持的功能。

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

UML

分析

单看策略模式,主要利用多态性。但策略模式往往不单独使用,它会和工厂模式配合使用。此时策略模式便可解耦策略的定义、创建、使用。

策略模式加工厂模式,能够达到去除if-else和switch的效果,主要靠工厂模式加持,借助于“查表法”找到指定策略进行使用。

应用场景

策略模式的应用场景还是蛮广泛的,处理同一类问题如果有多种算法,就可以使用策略模式。如根据不同活动计算优惠价格、根据商品不同类型计算税率等。

最近有一个实际业务场景可以使用策略模式,计算跨境商品税费。

跨境商品的税费和两方面有关,一是商品是否含税,二是商品类型,不同类型对应税率不一样,如常规商品和酒类商品税率不一样、税的计算方式也不一样。

所以只要知道商品是否含税、商品类型就能找到对应的计算方案。如果我们使用if-else来写,会不优雅,因为商品类型比较多,而且计算逻辑也相对复杂,所以我们可以利用查表法进行优化。

税费计算接口被交易侧调用,交易调用的时候会传商品是否含税,商品类型由项目组自行维护。那我们来看一下具体实现。

代码实现

package mainimport "fmt"const (Common = "COMMON"Win    = "WIN"
)/*** @Description: 根据hscode获取商品类型* @param hscode* @return string*/
func getProductType(hscode string) string {if hscode == "11" {return Common} else {return Win}
}/*** @Description: 税费计算函数,金额都为分* @param price* @param qty* @return taxPrice*/
type TaxComputeFunc func(price int64, qty int64) (taxPrice int64)/*** @Description: 税费计算策略存储处0为不含税 1为含税
*/
var TaxComputeFuncMap = map[int]map[string]TaxComputeFunc{0: map[string]TaxComputeFunc{Common: common,Win:    win,},1: map[string]TaxComputeFunc{Common: common,Win:    win,},
}/*** @Description: 计算普通商品税费* @param price* @param qty* @return taxPrice*/
func common(price int64, qty int64) (taxPrice int64) {radio := 0.1fmt.Println("计算普通商品税费")return int64(float64(price*qty) * radio)
}/*** @Description: 计算酒类税费* @param price* @param qty* @return taxPrice*/
func win(price int64, qty int64) (taxPrice int64) {radio := 0.2fmt.Println("计算普酒类税费")return int64(float64(price*qty) * radio)
}/*** @Description: 计算税费* @param withTax* @param productType* @param price* @param qty*/
func ComputeTaxPrice(withTax int, productType string, price int64, qty int64) {if taxFunc, ok := TaxComputeFuncMap[withTax][productType]; ok {taxPrice := taxFunc(price, qty)fmt.Println("税费为", taxPrice)} else {fmt.Println("输入有误,无法计算")}
}func main() {//获取商品是否含税、商品价格、商品数量、商品类型withTax := 0var price, qty int64 = 10000, 3productType := getProductType("11")//计算税费ComputeTaxPrice(withTax, productType, price, qty)
}

输出:

➜ myproject go run main.go

计算普通商品税费

税费为 3000

这么写有哪些好处呢?首先代码很精简,没有一堆判断;其次无论是增加策略还是修改策略,都不会影响主框架,即main\ComputeTaxPrice,只需在TaxComputeFuncMap添加新的策略即可,很好的做到了对扩展开放,虽然对TaxComputeFuncMap有一定更改,但变动不大,能够接受。

实例

来个

golang设计模式——策略模式相关推荐

  1. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  2. 关于设计模式——策略模式-Strategy Pattern

    文章目录 1 策略模式 1.1 模拟鸭子 1.2 设计原则 1.3 整合行为 1.4 模拟鸭子代码的代码 1.5 动态设定行为 1.6 重新查看整体 1.7 继承和组合 1.8 总结 1.9 优劣期间 ...

  3. [设计模式] ------ 策略模式

    策略模式 它定义了算法家族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化,不会影响到使用算法的客户 其实很简单,可能很多人都用到了,只不过还不知道这就是策略模式而已. 比如定义一个接口A, ...

  4. java 策略模式 促销_java设计模式——策略模式

    一. 定义与类型 定义:针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换.策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能.当代码中 ...

  5. Springboot 使用设计模式- 策略模式

    前言 直白点,什么场景我们需要使用到设计模式- 策略模式. 在平常的springboot项目里面做CRUD,我们的习惯性基本是 一个mapper,一个service,一个serviceImpl. 但是 ...

  6. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  7. 15. 星际争霸之php设计模式--策略模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  8. Java设计模式-策略模式作业

    Java设计模式-策略模式作业,所有类和接口均在一个package内 文章目录 前言 一.作业内容 二.具体实现 1.类图 2.Strategy接口 3.PreCopyStrategy类 4.Post ...

  9. 设计模式-策略模式2.0

    设计模式-策略模式2.0 前面文章我们说过了传统的策略模式的实现,本文我们简单说下设计模式中的升级版的策略模式,策略模式2.0. 代码实现 talk is cheap show me the code ...

最新文章

  1. QIIME 2用户文档. 16纵向和成对样本比较q2-longitudinal(2019.7)
  2. 纪念小柴昌俊 | 中微子天体物理学的诞生
  3. java 并发队列_JAVA并发编程:阻塞队列BlockingQueue之SynchronousQueue
  4. 《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.15 本章小结...
  5. log4j:WARN Please initialize the log4j system properly
  6. 在护卫神上部署javaWeb项目,已经测试通过
  7. dp打开思路2:POJ2533 HDU1114 HDU1260 HDU1160(水题不水)
  8. 【Node.js学习笔记五】npm(Node包管理器)命令行选项
  9. 时序分析基本概念介绍<input/output delay>
  10. java学习(四)static静态变量 和this
  11. Caffe傻瓜系列(7):solver优化方法
  12. Google Chrome 离线安装包官方下载
  13. java过滤器Filter
  14. 非线性系统稳定性理论分析、设计方法
  15. exceljs如何画单元格斜线?
  16. 公有云、私有云和混合云介绍
  17. 获取和设置默认打印机
  18. 苹果脚本入门指南 第一章-苹果编程语言介绍和编程软件打开方法及界面介绍
  19. Windows网络共享或共享打印机无法访问连接的简单终极解决方法
  20. 纯CSS实现抖音3D酷炫旋转相册

热门文章

  1. Java多线程编程(四)——死锁问题
  2. python求excel平均数_#python抓取excel表格数据#使用python3读取处理excel表的数据内容如何对内容求平均值...
  3. 最新notion enhancer安装教程(macOS Intel适用)
  4. Hadoop大数据平台开发与案例分析
  5. FastDFS,Redis,Solr,ActiveMQ核心技术整合二(1)
  6. html5 file对象,javascript – 什么是HTML5 File.slice方法呢?
  7. Mysql导出数据库设计文档
  8. 通过百度API实现图片车牌号识别
  9. JS函数的参数(arguments)的使用
  10. 电子设计教程15:三极管电平转换电路设计