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

news2024/11/19 9:24:18

一、简介

我们知道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 {

    @Override
    public BigDecimal score() {
        return minusPoints(new BigDecimal(String.valueOf(90.00)), BigDecimal.valueOf(10.00));
    }

    @Override
    public String code() {
        return "001";
    }
}

002学生实现:

@Component
public class XmStudentHandler implements StudentScoreHandler {

    @Override
    public BigDecimal score() {
        return extraPoints(new BigDecimal(String.valueOf(90.00)), BigDecimal.valueOf(10.00));
    }

    @Override
    public String code() {
        return "002";
    }
}

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

@Service
public class StudentScoreService {

    @Resource
    private List<StudentScoreHandler> studentScoreHandlerList;

    private Map<String, StudentScoreHandler> stringStudentScoreHandlerMap;

    @PostConstruct
    private 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 {
    @Resource
    private 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.coloradmin.cn/o/1283064.html

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

相关文章

自动化框架错误排查:本地全通过,pipline上大部分报错

现象: 最近经过一次切环境和验证码部分的代码重构,果不其然,我们的自动化框架就出错了 我在本地修改调试,并在堡垒机上全部跑过 但在pipline上则大部分报错 进一步排查 这么多case报错,而且报错log都一模一样,推断是底层出错 我在堡垒机上使用命令行来跑case,发现与…

【深度学习】Stable Diffusion中的Hires. fix是什么?Hires. fix原理

文章目录 **Hires. fix****Extra noise**Upscalers Hires. fix https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#hires-fix 提供了一个方便的选项&#xff0c;可以部分地以较低分辨率呈现图像&#xff0c;然后将其放大&#xff0c;最后在高分辨率下添…

day69

今日回顾 Django与Ajax 一、什么是Ajax AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML,现在…

羊大师教你如何有效应对冬季流感,保护自己与家人

羊大师教你如何有效应对冬季流感&#xff0c;保护自己与家人 随着冬季的临近&#xff0c;流感病毒将再次蔓延。如何预防冬季流感来袭&#xff0c;成为了许多人关注的话题。幸运的是&#xff0c;我们可以采取一系列的预防措施来保护自己和家人&#xff0c;避免被流感侵袭。下面…

技术or管理?浅谈软件测试人员的未来职业发展,值得借鉴

我们在工作了一段时间之后&#xff0c;势必会感觉到自己已经积累了一些工作经验了&#xff0c;会开始考虑下一阶段的职业生涯会如何发展。测试人员在职业生涯中的不确定因素还是不少的&#xff0c;由于其入门门槛不高&#xff0c;不用学习太多技术性知识即可入行&#xff0c;所…

聚焦数据库Serverless创新,就在2023亚马逊云科技re:Invent

11月28日&#xff0c;亚马逊云科技在其最新的re:Invent 2023大会上宣布了三项重要的serverless创新&#xff0c;这些创新将极大地简化客户在任何规模上分析和管理数据的能力。以下是这些发布的主要要点总结和分析。 Amazon Aurora Limitless Database的新功能&#xff1a; 功能…

MS85163实时时钟/日历可Pin to Pin兼容PCF8563

MS85163/MS85163M是一款CMOS实时时钟(RTC) 和日历电路&#xff0c;针对低功耗进行了优化&#xff0c;内置了可编程的时钟输出、中断输出和低电压检测器。可Pin to Pin兼容PCF8563。所有寄存器地址和数据都通过两线双向I 2C总线进行串行传输&#xff0c;最大总线传输速度为 400k…

软件测试:测试用例八大要素模板

一、通用测试用例八要素 1、用例编号&#xff1b; 2、测试项目&#xff1b; 3、测试标题&#xff1b; 4、重要级别&#xff1b; 5、预置条件&#xff1b; 6、测试输入&#xff1b; 7、操作步骤&#xff1b; 8、预期输出 二、具体分析通用测试用例八要素 1、用例编号 一般是数字…

让业务带着问题去分析,用大数据分析工具

随着企业数字化转型进程的加快&#xff0c;企业大数据分析的需求也水涨船高&#xff0c;不少企业都在尝试上线BI大数据分析工具&#xff0c;让各业务人员带着业务问题去分析数据&#xff0c;获取解决问题的数据信息。而各高校也在搭建大数据分析教学平台&#xff0c;与时俱进提…

微信小程序${wx.env.USER_DATA_PATH}在哪

var FileSystemManager wx.getFileSystemManager()FileSystemManager.writeFile({filePath: ${wx.env.USER_DATA_PATH}/hello.txt,data: data.Body,encoding: utf8,success(res) {console.log(res)},fail(res) {console.error(res)}})

人工智能的新篇章:深入了解大型语言模型(LLM)的应用与前景

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

【多线程】-- 11 死锁、Lock锁

多线程 7 死锁 多个线程各自占有一些共享资源&#xff0c;并且互相等待其他线程占有的资源才能运行&#xff0c;而导致两个或多个线程都在等待对方释放资源&#xff0c;都停止执行的情形。某一个同步块同时拥有”两个以上对象的锁“时&#xff0c;就可能会发生死锁的问题。 …

nn.AdaptiveAvgPool2d(output_size)输入和输出怎么回事?

前言 nn.AdaptiveAvgPool2d(output_size) 函数作用&#xff1a;自适应进行平均池化。不用管输入、stride、padding&#xff0c;函数参数只有输出大小&#xff0c;其他的这个函数帮你搞定。 问题就是&#xff0c;我想知道他是咋搞定的&#xff1f; 1 函数的使用 先把例子摆上…

Socket和Http的通讯原理,遇到攻击会受到哪些影响以及如何解决攻击问题。

德迅云安全-领先云安全服务与解决方案提供商 Socket和HTTP通信原理&#xff1a; Socket通信原理&#xff1a; Socket是一种应用程序编程接口&#xff08;API&#xff09;&#xff0c;用于在单个进程或多个进程之间进行通信。它提供了一种灵活的、异步的通信方式&#xff0c;使…

【蓝桥杯】翻硬币

翻硬币 思路&#xff1a; 其实有点贪心的意思&#xff0c;依次比较&#xff0c;不同就1&#xff0c;然后修改自己的字符串和下一个的字符串&#xff0c;再匹配。 #include<iostream> #include<string> using namespace std;string now,res;int main(void) {cin&g…

安美数字酒店宽带运营系统 SQL注入漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统隶属于安美世纪(北京)科技有限公司开发的一套酒店宽带管理系统。 0x02 漏洞概述 安美数字酒店宽带运营系统 online_status.php、language.php等接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过此漏洞获取数据库权限,进一步利用可…

算法通关村第十三关-黄金挑战数论问题

计数质数 描述 : 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 题目 : LeetCode 204.计数质数 : 204. 计数质数 分析 : 解决这个题有一个有效的方法&#xff0c;叫埃氏筛 , 后来又产生了线性筛&#xff0c;奇数筛等改进的方法。 基本思想是如果 x是…

【ElementUI】一行代码解决图片预览

【ElementUI】一行代码解决图片预览 只需要在图片标签上加入:preview-src-list 只需要在图片标签上加入:preview-src-list 完整代码如下&#xff1a; <el-table-column label"封面" align"center" prop"cover" :sort-orders"[descend…

赴日程序员高年薪过上“躺平”生活?

日本的IT行业想要达到的高薪&#xff0c;也是需要很多资历和经验的&#xff0c;不过即使你是新卒&#xff0c;也能拿到相比国内来说让你满意的薪资。 刚入职的起薪是20-23万日元/月&#xff0c;情报信息业出身&#xff0c;技术掌握不错&#xff0c;起薪是25万-30万日元。之后经…