策略模式在springboot中的使用

策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。

策略模式通常由以下三个角色组成:

  • 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。它定义了一个公共的算法接口,以约束所有具体的策略类,这些策略类将有不同的实现。

  • 具体策略(Concrete Strategy)角色:这是实现了抽象策略角色的类,每一个具体策略类都封装了实现特定算法的细节。

  • 环境(Context)角色:持有一个对抽象策略角色的引用,客户端通过环境角色调用其操作的策略。环境角色负责在运行时将具体策略角色动态地设置到其引用上,以保证对客户端的透明性。

优点

  • 算法与使用分离:策略模式使得算法和使用算法的客户端代码分离,两者可以独立变化而互不影响。

  • 易于扩展:新的策略只需要实现对应的接口或继承抽象类,然后在使用策略的客户端中动态地设置即可,符合开闭原则。

  • 避免多重条件选择:策略模式通过把不同的算法封装到不同的策略类中,可以避免在客户端代码中出现复杂的条件语句。

  • 算法可复用:不同的策略类之间可以相互替换,提高了代码的复用性。

缺点

  • 客户端必须知道所有的策略类:客户端需要知道所有可用的策略类,并自行决定使用哪一个策略类。这增加了客户端的复杂性。
  • 策略类数量可能过多:如果系统中存在大量的策略,那么就需要创建大量的策略类,增加了系统的复杂性。

应用场景

策略模式的应用场景包括但不限于:

多个类只区别在表现行为不同:这种情况下可以使用策略模式,在运行时动态选择具体要执行的行为。需要在不同情况下使用不同的策略:策略可能在未来用其他方式来实现,这种情况下策略模式提供了灵活性。对客户隐藏具体策略的实现细节:策略模式允许将算法的使用与算法的实现分离,客户端只需要知道策略接口,而不需要关心具体的实现细节。

示例

策略模式通常用于处理复杂的业务场景,例如计算个人所得税时,不同的国家可能有不同的算法。通过策略模式,我们可以将每种算法封装成一个策略类,然后在运行时根据用户所在的国家选择相应的策略类进行计算。

1.抽象策略类

public interface Strategy {  int doOperation(int num1, int num2);  
}

2.策略实现

@Component("add")
public class OperationAdd implements Strategy {  @Override  public int doOperation(int num1, int num2) {  return num1 + num2;  }  }  @Component("subtraction")
public class OperationSubtract implements Strategy {  @Override  public int doOperation(int num1, int num2) {  return num1 - num2;  }  }  

3.策略选择器

@Component
public class Select {  @Resourceprivate Map<String,Strategy> selectorMap;public  Strategy select(String  type){return  selectorMap.get(type);}
}

5.测试类

    Strategy strategy = Select.select("add");int t= strategy.doOperation(1,2);

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

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

相关文章

各国内AI大厂推进大模型的阶段

2022 年 11 月&#xff0c;美国 AI 公司 Open AI 发布旗下 AI 聊天机器人程序 ChatGPT&#xff0c;该程序基于大型语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09; GPT-3.5&#xff0c;使用指令微调 &#xff08;Instruction Tuning&#xff09;和基于人…

一招教你房间内灰尘多怎么处理?除粉尘好用的空气净化器分享

在你吸尘、扫地、擦家具的时候&#xff0c;你或许会奇怪&#xff0c;为什么灰尘每天擦&#xff0c;每天有&#xff1f;即使门窗关得好好的&#xff0c;过几天还是会落上一层薄薄的灰。它们究竟是什么&#xff1f;对我们的健康又有什么影响呢&#xff1f;我们每天生活在房屋中&a…

导入excel文档,并且做业务处理,然后返回包含导入结果的excel文档

一、依赖 <easyexcel.version>3.3.4</easyexcel.version> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version> </dependency> 二、编写接…

如何修改 json 对象中的值

在JavaScript中&#xff0c;修改JSON对象&#xff08;实际上是一个JavaScript对象&#xff0c;因为JSON是一种数据格式&#xff0c;而JavaScript对象是一种数据结构&#xff09;中的值非常简单。以下是一些步骤和示例&#xff0c;说明如何修改JavaScript对象&#xff08;通常从…

Gotchi 战士们准备好吧!稀有度挖矿第八季锦标赛即将开始!

我们很高兴地宣布稀有度挖矿第 8 赛季的比赛即将开始&#xff0c;比赛将设立 15 万 GHST 的巨额奖金池&#xff0c;同时还将进行新的更新&#xff0c;让您有更多的方式来制定战略并与您的小鬼好友们一较高下。 本赛季引入了双败淘汰赛&#xff0c;每支队伍可以有两名替补队员&a…

vite项目配置高德api定位功能

项目场景&#xff1a; 用vite项目集成了一个H5页面的小程序&#xff0c;需要调用高德的定位API&#xff0c;在浏览器中测试的时候&#xff0c;出现了一系列定位失败的情况。 问题1 Get ipLocation failed、Geolocation permission denied 本地http访问下&#xff0c;定位失败…

基于PHP的草莓种植信息管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的草莓种植管理系统 一 介绍 此草莓种植管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端采用jquery.js和kindeditor在线HTML编辑器。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqljquery.jsphpstudyvsco…

在评论区的小发现

大约是近期比较频率的缘故&#xff0c;今天收到了系统私信&#xff0c;说我入围了本市博主周榜top100名单。本着虚心学习的态度&#xff0c;我打开了榜单。发现前几名获赞、阅读、评论都比我高多了。于是打开人家的主页&#xff0c;想拜读一下人家的文章。从内容上看&#xff0…

压测怎么做?如何自动化?盘点各大公司全链路压测方案与实践

本文综合盘点各大公司团队的全链路压测技术方案和实践路径&#xff0c;供大家参考。 一、什么是全链路压测&#xff1f; 全链路压测指的是基于实际的生产业务场景、系统环境&#xff0c;模拟海量的用户请求和数据对整个业务链进行压力测试&#xff0c;并持续调优的过程。常用…

comfyui虚拟试衣、ai换装、电商换装源码

一、AI换装技术博客 1. 项目介绍 IDM-VTON 是一个虚拟试衣模型&#xff0c;可以在 ComfyUI 中进行部署。相比于其他虚拟试衣模型&#xff0c;如 OOTDiffusion&#xff0c;IDM-VTON 提升了图像保真度和细节保留&#xff0c;更强调真实感,而且就算是侧面的模特或者背面的模特都…

【Ubuntu】--- 创建用户 删除用户 及其他用户操作大全 持续更新中

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Ubuntu】--- 创建用户 删除用户 及其他…

c++中string用法详解

目录 二、案例需求 三、案例实现 1.首先获取strData中的角色数量 2.创造结构体数组&#xff0c;定义两个索引值 3.循环遍历对结构体User中的Id和Exp进行赋值 4.对结构体数组userArr进行排序 5.展示结果以及最终代码 ​四、最后 一、前言 在C中&#xff0c;std::string …

【Git】多人协作 -- 详解

一、多人协作&#xff08;1&#xff09; ⽬前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git 基本操作&#xff0c;分支理解&#xff0c;版本回退&#xff0c;冲突解决等等。 申请码云账号&#xff0c;将远端信息 clone…

(微服务实战)聚合支付系统商户线上聚合收银台接口设计

1 概述 聚合支付收款分为线上和线下业务场景&#xff0c;本文中的商户收银台接口设计主要是指线上业务场景&#xff0c;线下业务场景聚合收款方式后续会进行单独设计和分析。 主流的线上支付渠道有微信支付&#xff0c;支付宝支付&#xff0c;云闪付。这三种支付渠道都有各自…

Linux操作系统学习:day04

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0422、通过文字设定法修改用户对文件的操作权限23、通过数字设定法修改文件的权限24、修改文件所有者和所属组25、tree—查看目录内…

Notes客户机开启事务日志

大家好&#xff0c;才是真的好。 了解过事务日志的人都知道——等等&#xff0c;你还不知道事务日志&#xff1f; 那我们先介绍一下&#xff0c;简单来说&#xff0c;Domino事务日志是捕获数据库更改并将其写入的记录&#xff0c;然后等服务器不繁忙或按计划更新到磁盘上的No…

虚拟机怎么额外搭建两个Redis节点,配置多个 Redis 实例

前提条件 在开始之前&#xff0c;请确保你已经具备以下条件&#xff1a; 一台已安装 Redis 的虚拟机。虚拟机上已安装基本的 Linux 工具&#xff08;例如 FinalShell&#xff09;。 步骤二&#xff1a;配置额外的 Redis 实例 接下来&#xff0c;我们将配置两个新的 Redis 实…

MYSQL无法启动的修复过程

记录一次MySQ无法启动的修复过程。 1. 错误表现 今天在用python操作数据库时可能有些错误&#xff08;具体来说就是我尝试创建了一个已经存在的database&#xff09;&#xff0c;结果我发现MySQL中的那个database不存在了&#xff0c;我重启了一下电脑&#xff0c;结果mysql…

数模E题——信号干扰下的超宽带(UWB)精确定位问题

E 题——信号干扰下的超宽带&#xff08;UWB&#xff09;精确定位问题 思路&#xff1a;该题主要问题是对干扰进行识别和自适应消除&#xff0c;得到更加理想的定位的结果 代码下载 第一题问题思路与结果&#xff1a; 主要是对文件进行解析并对其中存在的数据丢失进行补偿&am…

网页右键不能审查元素解决办法

网页右键不能审查元素解决办法 1.问题复现2.解决方法 1.问题复现 有的网站右键不能审查元素 这时是javascript 中的onselectstart"return false" 被禁止右键了。 2.解决方法 隐私和安全--->网络设置 网络设置--->javascript 然后回到不能审查元素的网页 …