Java中实用的策略模式【Strategy】

一、简介

我们知道Java中有许多的设计模式,总共32个左右。常见的比如简单工厂、建造者、原型、代理、桥接等,这些设计模式相当于是一个规范,主要是总结出来便于大家理解开发的一种算法思路。

今天主要是给大家介绍一下我们常见的策略模式,这个模式主要是一种行为设计模式,它能让你在运行时动态地改变对象的行为。在Java中,我们可以通过接口和实现类来实现动态替换策略的行为。

二、基础架构

策略模式有三个重要的部分:环境类、策略接口和具体策略。环境类接收一个策略对象,并将执行流程委托给这个策略对象。策略接口定义了一个公共操作,具体策略是对策略接口的实现。

策略模式的主要优点在于它可以让你在运行时改变对象的行为。而且你可以独立于其他代码定义新的策略。

public interface Strategy {void strategyMethod(); 
}public class ConcreteStrategyA implements Strategy {public void strategyMethod() {System.out.println("执行策略A");}
}public class ConcreteStrategyB implements Strategy {public void strategyMethod() {System.out.println("执行策略B");}
}public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void contextMethod() {strategy.strategyMethod();}
}   

三、策略模式的应用实例

现在我有一个简单的需求demo,主要是通过同学的code,计算出对应code同学的得分。
代码如下所示:

1、接口(包含了对用的code,和得分的计算逻辑,其他实现接口的可以直接使用调用加分、减分)

public interface StudentScoreHandler {/*** 获取学生分数*/BigDecimal score();/*** 学生code*/String code();/*** 加分 通用处理*/default BigDecimal extraPoints(BigDecimal original, BigDecimal addend) {return original.add(addend);}/*** 减分 通用处理*/default BigDecimal minusPoints(BigDecimal original, BigDecimal subtrahend) {return original.subtract(subtrahend);}
}

2、具体策略(001编号的学生得分+10,002的学生得分-10)
001学生实现:

@Component
public class KkStudentHandler implements StudentScoreHandler {@Overridepublic BigDecimal score() {return minusPoints(new BigDecimal(String.valueOf(90.00)), BigDecimal.valueOf(10.00));}@Overridepublic String code() {return "001";}
}

002学生实现:

@Component
public class XmStudentHandler implements StudentScoreHandler {@Overridepublic BigDecimal score() {return extraPoints(new BigDecimal(String.valueOf(90.00)), BigDecimal.valueOf(10.00));}@Overridepublic String code() {return "002";}
}

3、Service类
这里有多钟做法,我这里采用的是将所有的策略实现在初始化的时候就放入map里面,后续来了直接可以取。

@Service
public class StudentScoreService {@Resourceprivate List<StudentScoreHandler> studentScoreHandlerList;private Map<String, StudentScoreHandler> stringStudentScoreHandlerMap;@PostConstructprivate void init() {stringStudentScoreHandlerMap = studentScoreHandlerList.stream().collect(Collectors.toMap(StudentScoreHandler::code, it -> it));}public BigDecimal score(String code) {StudentScoreHandler studentScoreHandler = stringStudentScoreHandlerMap.get(code);if (ObjectUtil.isEmpty(studentScoreHandler)) {return null;}return studentScoreHandler.score();}
}

4、控制器

@RequestMapping("/student")
@RestController
@Slf4j
public class StudentScoreController {@Resourceprivate StudentScoreService studentScoreService;@GetMapping("/score")public ResultBean<BigDecimal> score(@RequestParam("code") String code) {return ResultBean.create(studentScoreService.score(code));}
}

5、Postman测试
只需要将对应的学生code传入即可 获取对应的学生分数
001
在这里插入图片描述
002
在这里插入图片描述

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

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

相关文章

JSP的作用域

一、pageContext域—(PageContext) 生命周期&#xff1a;当对JSP的请求时开始&#xff0c;当响应结束时销毁。作用范围&#xff1a;整个JSP页面&#xff0c;是四大作用域中最小的一个。 二、request域 --(HttpServletRequest) 生命周期&#xff1a;在service 方法调用前由服务器…

【ARM Coresight 系列 2 文章 -- Trace32 对 APBIC 地址的配置 介绍】

文章目录 APBIC RomtableAPBIC Romtable 图 1 APBIC 网络图 如上图所示,如果想通过Trace32/DS-5 去访问 AP, 这个时候需要怎么做呢?可以看到 APBIC 中ROMTABLE 中 APB-AP 的偏移是0x00200000,所以 APB-AP的基地址为 0x2b000000 + 0x00200000,又从 APB-AP 的romtable 中可以…

23款奔驰E350eL升级小柏林音响 13个扬声器 590w

小柏林之声音响是13个喇叭1个功放&#xff0c;功率是590W&#xff0c;对应普通音响来说&#xff0c;已经是上等了。像著名的哈曼卡顿音响&#xff0c;还是丹拿音响&#xff0c;或者是BOSE音响&#xff0c;论地位&#xff0c;论音质柏林之声也是名列前茅。 升级小柏林音响&#…

百元挂耳式蓝牙耳机有哪些?百元挂耳式蓝牙集锦分享

生活节奏匆忙&#xff0c;蓝牙耳机成了解救沉浸音乐迷的利器&#xff0c;而在百元预算内&#xff0c;挂耳式设计更是让你摆脱繁琐&#xff0c;本文将为你盘点几款百元挂耳式蓝牙耳机&#xff0c;让你在音乐和通话中轻松自如&#xff0c;让我们一起发现这些性价比爆棚的挂耳式蓝…

ElasticSearch篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、什么是ElasticSearch?二、ElasticSearch中的集群、节点、索引、文档、类型是什么?三、ElasticSearch中的分片是什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,…

宏工科技:电池装备高效交付“唯快不破”

面向TWh时代的锂电设备供应需求&#xff0c;锂电设备向标准化、模块化方向升级的趋势显现。 “近年来&#xff0c;宏工科技聚焦电池匀浆技术创新与规模化降本&#xff0c;通过电池匀浆工艺段的模块化探索与应用&#xff0c;从项目周期、成本、效率等多维度赋能电池前段制造高质…

理解意图,加速迈向L4高度自智网络

PART.1 自智背景 “云网自智”&#xff0c;目标未来&#xff01; 随着自智网络概念的兴起及各类相应概念、规范、指导原则的不断发布&#xff0c;运营商也越发关注系统的自智能力&#xff0c;TMF 的Autonomous Networks 自智网络框架规范设定了自智网络的级别及评价标准&#x…

Pandas教程09:DataFrame数据可视化绘制折线图、柱状图、散点图、直方图等

pandas.plot() 是 pandas 库中的一个非常方便的函数&#xff0c;用于绘制各种图形&#xff0c;例如线图、柱状图、散点图等。以下是一些示例用法&#xff1a; 1.绘制一个简单的线图&#xff1a; # Author : 小红牛 # 微信公众号&#xff1a;wdPython import pandas as pd impo…

git 修改 commit 未推送的信息

Git 修改commit的信息 未推送的消息&#xff1a; 在执行了 git add .&#xff0c;git commit -m "旧信息" 之后&#xff0c;发现想要提交的信息有误&#xff0c;希望可以修改提交的信息。 可以使用 git commit --amend -m "新信息" 来将新信息替换成旧…

Xshell常用命令大全

Xshell常用命令大全 (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表&#xff0c;包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以.doc结尾的所有文件 (2)命令cp——复制文件 cp afile afile.b…

MySQL学习day05

DCL&#xff08;Data Control Language&#xff09;数据控制语言学习 作用&#xff1a;用来创建数据库用户、控制数据库的访问权限 1&#xff09;查询用户&#xff1a; use mysql; select * from user; 2&#xff09;创建用户&#xff1a; create user 用户名主机名 identifi…

mysql导入、更新、插入、迁移数据时出现Got a packet bigger than ‘max_allowed_packet’ bytes的解决方法

问题&#xff1a; 出现在大批量添加或修改数据时出现的&#xff0c;在迁移数据库、备份还原或数据导入时也会出现&#xff1a; 1153&#xff1a;Got a packet bigger than‘max_allowed_packet’bytes 原因&#xff1a; max_allowed_packet就是指mysql服务器端和客户端在一…

2023年淘宝天猫年终惊喜红包玩法

2023年淘宝天猫年终惊喜红包玩法&#xff0c;2023年淘宝年终好价节红包活动 随着2023年的尾声渐近&#xff0c;淘宝再次为广大用户带来了年终的惊喜——一场特别的红包活动。从12月8日零时开始&#xff0c;直至12月12日的午夜&#xff0c;淘宝app将开启一个为期五天的年终好价节…

stateflow并行执行——并行状态与互斥状态

1.什么叫并行(Parallel:AND)和互斥(Exclusive:OR)状态&#xff1f; &#xff1a;在parent chart中有多个child chart可以同时运行&#xff1b;在parent chart的多个child chart可以只能运行一个。 2.如何设置并行或互斥状态&#xff1f; &#xff1a;右键parent chart&#…

微信小程序访问不了阿里云oss图片链接解决办法

以下都有可能导致访问不了oss图片 1.小程序没有加访问白名单 这个需要前端搞,加上白名单,如果是域名加域名白名单,ip的话加ip白名单 2.阿里云设置域名白名单 打开bucket列表,选择对应的bucket 配置这个白名单,配置好以后,开发者工具可以预览了,手机端预览不了,查看自己的路…

LLVM学习笔记(64)

4.4.3.3.3. 设置寄存器类对类型的行为 1679行调用computeRegisterProperties()来计算寄存器类的衍生属性。TargetLoweringBase的容器RegisterTypeForVT、RegClassForVT以及NumRegistersForVT用于记录原生支持每个ValueType目标机器寄存器类的信息&#xff0c;即类型对应的寄存…

无公网IP,从公网SSH远程访问家中的树莓派

下午好&#xff0c;我的网工朋友。 今天说点好玩的啊。树莓派 (Raspberry Pi) 可以做事情很多&#xff0c;用作家庭网络中的服务器&#xff0c;是非常流行的一种。 因为它微小的占地面积和低功耗使其成为运行轻量级服务器的完美设备。 在这种情况下&#xff0c;你可以在树莓派…

【栈迁移】强网杯2022 -- devnull

前言 题目不算难&#xff0c;多调一调就ok啦。但感觉我这个pay不是最优的&#xff0c;比较极限。 漏洞分析与利用 保护&#xff1a;没开 Canary 和 PIE 关键函数如下&#xff1a; 1&#xff09;buf 的大小是32字节&#xff0c;而 fgets 了33字节&#xff0c;但是 fgets 本身…

灰度共生矩阵和直方图的联系与区别

灰度共生矩阵&#xff08;GLCM&#xff09;和直方图都是用于描述图像的统计特征&#xff0c;但它们的计算方法和提供的信息有所不同。 计算方法&#xff1a; 直方图&#xff1a;直方图是通过统计图像中每个灰度级别的像素数量来构建的。简单来说&#xff0c;直方图将图像的灰度…

机器学习---pySpark案例

1、统计PV&#xff0c;UV 1.if __name__ __main__: 2. conf SparkConf() 3. conf.setMaster("local") 4. conf.setAppName("test") 5. sc SparkContext(confconf) 6. 7. #pv 8. sc.textFile("./pvuv").map(lambda line:(l…