设计模式之策略模式

1、场景:

某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略很复杂,可以简单作如下分类:
• 普通客户小批量报价
• 普通客户大批量报价
• 老客户小批量报价
• 老客户大批量报价
具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们采用策略模式即可。

2、案例

可以先用条件语句处理:

public class TestStrategy {public double getPrice(String type,double price){if (type.equals("普通客户小批量")) {System.out.println("不打折,原价");return price;} else if (type.equals("普通客户大批量")) {System.out.println("打九折");return price * 0.9;} else if (type.equals("老客户小批量")) {System.out.println("打八五折");return price * 0.85;} else if (type.equals("老客户大批量")) {System.out.println("打八折");return price * 0.8;}return price;}
}

这种方式实现起来比较容易,符合一般开发人员的思路,但是假如类型特别多、算法比较复杂的时候,整个条件语句的代码就会变得很长,难以维护, 而且如果有新增类型就需要频繁的修改此处的代码,不符合开闭原则。

3、策略模式

策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。

4、本质:

分离算法,选择实现。

5、开发中常见的场景:

  • Spring框架中,Resource接口,资源访问策略
  • javax.servlet.http.HttpServlet#service()

6、代码实现

/*** 策略接口* @author tqq* @date 2021-04-02-10:33*/
public interface Strategy {public double getPrice(double standardPrice);
}/*** 新客户小批量的策略* @author tqq* @date 2021-04-02-10:34*/
public class NewCustomFewStrategy implements Strategy{@Overridepublic double getPrice(double standardPrice) {System.out.println("新客户小批量,不打折");return standardPrice;}
}
/*** 新客户大批量的策略* @author tqq* @date 2021-04-02-10:34*/
public class NewCustomManyStrategy implements Strategy{@Overridepublic double getPrice(double standardPrice) {System.out.println("新客户大批量,打9折");return standardPrice*0.9;}
}/*** 负责和具体的算法交互* 如此,具体的算法和直接的客户端调用分离了,使得算法可以独立与客户端独立的变化* 如果使用Spring的依赖注入功能,可以通过配置文件动态的注入不同的策略对象,动态的切换不同的算法* @author tqq* @date 2021-04-02-10:39*/
public class Context {private Strategy strategy;//当前采用的算法对象//通过构造器注入public Context(Strategy strategy) {this.strategy = strategy;}//通过set注入public void setStrategy(Strategy strategy) {this.strategy = strategy;}public void printPrice(double s){System.out.println("你的报价为:"+strategy.getPrice(s));}
}/*** 测试类* @author tqq* @date 2021-04-02-10:44*/
public class Client{public static void main(String[] args) {Strategy s1 = new OldCustomFewStrategy();Context context = new Context(s1);context.printPrice(100);}
}

7、代码类图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/121455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全民拼购模式:美妆行业的新机遇和挑战

美妆是一个充满创意和变化的行业,每个人都想拥有自己独特的美丽风格。但是,美妆产品的价格和品质却不尽相同,很多消费者在购买时会遇到困惑和不满。有没有一种方法,可以让消费者以更低的价格买到更好的美妆产品,同时还…

微信小程序添加用户授权《隐私保护协议》

官方文档:wx.onNeedPrivacyAuthorization(function listener) | 微信开放文档 隐私协议配置 微信小程序平台上需要进行隐私配置,审核成功后大概半小时左右才会生效。 小程序公众平台 --- 设置 --- 服务内容声明 --- 用户隐私保护指引(提交…

辛普森近似求值

辛普森近似求解 公式证明任意一个对称区间的一元二次函数定积分拆分求和:strawberry: 总结 : 如果我们把六分之一乘进去我们只不过在指定的区间采集数据六个求平均,乘以采集数据区间的微元宽度(历史上不少的手稿用h,翻译为微元高度&#xff0…

在Visual Studio 2017上配置Glut

上篇 已经介绍了如何配置OpenGL,但缺点是每次新建一个项目时,都应重新安装 “nupengl.core.redist” 与 “nupengl.core” 这两个文件,这在有网的情况下还是可以实现的,但不是一个长久之计。现在介绍另一种方法,用Glut…

高光谱图像超分辨率-总

高光谱图像超分辨率 高光谱图像超分辨率 高光谱图像超分辨率一、基础内容1.1 高光谱图像特点1.2 研究现状1.3 高光谱图像数据集1.4 评价指标1.5 Wald**协议**二、文献阅读清单2.1 综述+先锋工作1.提出解混的思想。2.随机混合模型在高光谱分辨率增强中的应用。3.遥感中的多光谱和…

23. 带旋转的数独游戏

题目 Description 数独是一个基于逻辑的组合数字放置拼图,在世界各地都很受欢迎。 在这个问题上,让我们关注 网格的拼图,其中包含 个区域。 目标是用十六进制数字填充整个网格,即 ,以便每列,每行和每个区…

java 基础面试题 静态绑定与动态绑定

一 静态绑定与动态绑定 1.1 前言概述 昨天去用友面试,被问到了如下几个问题 1.单例模式使用场景 2.责任链模式 3.分布式事务TCC 4.动态绑定和静态绑定 5.类加载器 今天就来研究一下静态绑定和动态绑定 1.2 静态绑定代码 1.父类:定义一个stati…

打包个七夕exe玩玩

前段时间七夕 当别的哥们都在酒店不要不要的时候 身为程序员的我 还在单位群收到收到 正好后来看到大佬些的这个 https://www.52pojie.cn/thread-1823963-1-1.html 这个贱 我必须要犯,可是我也不能直接给他装个python吧 多麻烦 就这几个弹窗 好low 加上bgm 再打包成…

MySQL访问和配置

目录 1.使用MySQL自带的客户端工具访问 2.使用DOS访问(命令行窗口WinR → cmd) 3.连接工具(SQLyog或其它) MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 1.使用MySQL自…

FastViT实战:使用FastViT实现图像分类任务(一)

文章目录 摘要安装包安装timm安装 grad-cam安装mmcv 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集补充一个知识点:torch.jit两种保存方式 摘要 论文翻译:https://wanghao.blog.csdn.net/article/details/132407722?spm1001.2014.3001.550…

前端实习第七周周记

前言 第六周没写,是因为第六周的前两天在处理第五周的样本库部分。问题解决一个是嵌套问题(因为我用到了递归),还有一个问题在于本机没有问题,打包上线接口404。这个问题我会在这周的总结中说。 第六周第三天才谈好新…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Re44:数据集 GSM8K 和 论文 Training Verifiers to Solve Math Word Problems

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:Training Verifiers to Solve Math Word Problems GSM8K数据集原始论文 OpenAI 2021年的工作,关注解决MWP问题(具体场景是小学(grade school&#xf…

如何在Mac电脑上安装WeasyPrint:简单易懂的步骤

1. 安装homebrew 首先需要确保安装了homebrew,通过homebrew安装weasyprint可以将需要的库都安装好,比pip安装更简单快捷。 安装方法如下: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&qu…

SpringBoot v2.7.x+ 整合Swagger3入坑记?

目录 一、依赖 二、集成Swagger Java Config 三、配置完毕 四、解决方案 彩蛋 想尝鲜&#xff0c;坑也多&#xff0c;一起入个坑~ 一、依赖 SpringBoot版本&#xff1a;2.7.14 Swagger版本&#xff1a;3.0.0 <dependency><groupId>com.github.xiaoymin<…

方案展示 | RK3588开发板Linux双摄同显方案

iTOP-RK3588开发板使用手册更新&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 RK3588开发板载4路MIPI CAMERA摄像头接口、MIPI CSI DPHY的4.5Gbps、2.5Gops的MIPI CSI CPHY&#xff0c;四路同时输入&#xf…

react快速开始(三)-create-react-app脚手架项目启动;使用VScode调试react

文章目录 react快速开始(三)-create-react-app脚手架项目启动&#xff1b;使用VScode调试react一、create-react-app脚手架项目启动1. react-scripts2. 关于better-npm-runbetter-npm-run安装 二、使用VScode调试react1. 浏览器插件React Developer Tools2. 【重点】用 VSCode …

MEMS传感器的原理与构造——单片式硅陀螺仪

一、前言 机械转子式陀螺仪在很长的一段时间内都是唯一的选项&#xff0c;也正是因为它的结构和原理&#xff0c;使其不再适用于现代小型、单体、集成式传感器的设计。常规的机械转子式陀螺仪包括平衡环、支撑轴承、电机和转子等部件&#xff0c;这些部件需要精密加工和…

mysql group by 字段 与 select 字段

表数据如下&#xff1a; 执行SQL语句1&#xff1a; SELECT * FROM z_course GROUP BY NAME,SEX 结果&#xff1a; 执行SQL语句2&#xff1a; SELECT * FROM z_course GROUP BY NAME sql 1 根据 name&#xff0c;sex 两个字段分组&#xff0c;查询 所有字段&#xff0c;返回结…

骨传导耳机用久了伤耳朵吗?骨传导耳机有什么优势

骨传导耳机用久了不伤耳朵&#xff0c;相对于传统的入耳式耳机来说&#xff0c;对耳朵的压力和损伤较小。由于骨传导技术不直接通过耳道传递声音&#xff0c;而是通过振动将声音传送到内耳&#xff0c;因此相比其他类型的耳机&#xff0c;它在减少听力损伤的风险方面具有优势。…