函数式接口实现策略模式

函数式接口实现策略模式

1.案例背景

我们在日常开发中,大多会写if、else if、else 这样的代码,但条件太多时,往往嵌套无数层if else,阅读性很差,比如如下案例,统计学生的数学课程的成绩:

  • 90-100分,打印【优秀A+】
  • 80-90分,打印【优秀A-】
  • 70-80分,打印【中等B+】
  • 60-70,打印【中等B-】
  • 60及以下,打印【同学还需努力!】
    我们会写如下代码:
 // 0<=grade<=100if (grade > 90 && grade <= 100) {System.out.println("【优秀A+】");} else if (grade > 80 && grade <= 90) {System.out.println("【优秀A-】");} else if (grade > 70 && grade <= 80) {System.out.println("【中等B+】");} else if (grade > 60 && grade <= 70) {System.out.println("【中等B-】");} else {System.out.println("【同学还需努力!】 ");}

毋庸置疑,上述代码完全正确,可以满足业务要求,但考虑到未来业务的扩展性与代码的可阅读性,大量的if、else语句使代码不够优雅,随着后续业务的增加,分类可能越来越细,岂不是要嵌套成百上千层。接下来考虑使用函数式接口+策略模式的思想完成代码改造。

2.代码改造

2.1 创建函数式策略接口

创建自定义函数式策略接口:

/*** 函数式策略接口*/
@FunctionalInterface
public interface GradeFuncInterface {/*** 打印成绩方法* @param grade 实际成绩*/void printStudentGrade(Integer grade);
}

2.2 创建策略方法类

创建策略方法类,相关注释已在代码中标注:

import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;/*** 策略方法*/
public class GradeStrategy {/*** 存储策略逻辑* 这里使用到了另外一个JDK提供的函数式接口,Predicate,里面几个方法很简单,大家感兴趣可以点进去阅读下底层源码*/private final Map<Predicate<Integer>, GradeFuncInterface> gradeMap = new HashMap<>();/*** 无参构造*/public GradeStrategy() {gradeMap.put(grade -> this.determineGrade(grade, 100, 90), ((grade) -> System.out.println("【优秀A+】")));gradeMap.put(grade -> this.determineGrade(grade, 90, 80), ((grade) -> System.out.println("【优秀A-】")));gradeMap.put(grade -> this.determineGrade(grade, 80, 70), ((grade) -> System.out.println("【中等B+】")));gradeMap.put(grade -> this.determineGrade(grade, 70, 60), ((grade) -> System.out.println("【中等B-】")));gradeMap.put(grade -> this.determineGrade(grade, 60, -1), ((grade) -> System.out.println("【同学还需努力!】")));}/*** 判断成绩的区间* @param grade 实际成绩* @param maxGrade 最大成绩* @param minGrade 最小成绩* @return*/private boolean determineGrade(Integer grade, Integer maxGrade, Integer minGrade) {if (grade > minGrade && grade <= maxGrade) {return true;}return false;}/*** 获取成绩区间* @param grade*/public void getStudentGrade(Integer grade) {// 遍历策略mapfor (Map.Entry<Predicate<Integer>, GradeFuncInterface> entry : gradeMap.entrySet()) {if (entry.getKey().test(grade)) {entry.getValue().printStudentGrade(grade);return;}}System.out.println("学生成绩为:" + grade + "无对应期间成绩,请维护!");}
}

3. 测试

3.1 创建测试类

测试类代码如下:

public class StrategyTest {public static void main(String[] args) {GradeStrategy gradeStrategy = new GradeStrategy();gradeStrategy.getStudentGrade(98);gradeStrategy.getStudentGrade(88);gradeStrategy.getStudentGrade(78);gradeStrategy.getStudentGrade(68);gradeStrategy.getStudentGrade(58);gradeStrategy.getStudentGrade(128);gradeStrategy.getStudentGrade(-18);}}

3.2 运行结果

通过运行结果,可知输出结果正确。
在这里插入图片描述

4. 总结

通过策略模式的思想+函数式接口,我们将大量的if else判断分解出来,在调用端只需要调用策略类提供的方法,使代码更加优雅,当业务需要扩展时,我们只需要加上对应策略即可,使我们只用注重业务逻辑层的代码,让运维更加方便简洁。

备注:另外一种策略模式的使用见:工厂模式+策略模式

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

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

相关文章

yaml文件查看模型的架构

最近在看hrnet模型代码&#xff0c;想查看hrnet的模型架构&#xff0c;输出一下&#xff0c;但是模型参数需要cfg&#xff0c;我就想着怎么把yaml文件导进来然后打印模型呢&#xff0c;直接chat就可以了&#xff0c;下面解释一下每一部分&#xff0c;非常的好理解 yaml文件格式…

第L5周:机器学习:决策树(分类模型)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标&#xff1a; 1. 决策树算法是一种在机器学习和数据挖掘领域广泛应用的强大工具&#xff0c;它模拟人类决策过程&#xff0c;通过对数据集进行逐步的分析和…

【重学 MySQL】十、MySQL 目录结构与源码

【重学 MySQL】十、MySQL 目录结构与源码 主要目录结构安装目录数据目录总结 源码源码结构编译过程源码连接建立源码中的关键模块源码的获取与贡献注意事项 主要目录结构 MySQL的主要目录结构通常包括安装目录和数据目录两部分&#xff0c;这些目录包含了MySQL运行所需的各种文…

[数据集][目标检测]智慧牧场猪只检测数据集VOC+YOLO格式16245张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;16245 标注数量(xml文件个数)&#xff1a;16245 标注数量(txt文件个数)&#xff1a;16245 标…

基于SSM+MySQL的医院在线挂号系统

系统背景 在当前数字化转型浪潮的推动下&#xff0c;医疗服务行业正经历着前所未有的变革。随着人口老龄化的加剧、患者就医需求的日益增长以及医疗资源分布不均等问题的凸显&#xff0c;传统的就医模式已难以满足患者对于便捷、高效医疗服务的需求。因此&#xff0c;构建一套基…

微软发布Phi-3.5 SLM,附免费申请试用

Phi-3 模型系列是Microsoft 小型语言模型 (SLM) 系列中的最新产品。 它们旨在具有高性能和高性价比&#xff0c;在语言、推理、编码和数学等各种基准测试中的表现均优于同类和更大规模的模型。Phi-3 模型的推出扩大了 Azure 客户的高质量模型选择范围&#xff0c;为他们编写和…

Windows自动化程序开发指南

自动化程序的概念 “自动化程序”指的是通过电脑编程来代替人类手工操作的一类程序或软件。这类程序具有智能性高、应用范围广的优点&#xff0c;但是自动化程序的开发难度大、所用技术杂。 本文对自动化程序开发的各个方面进行讲解。 常见的处理对象 自动化程序要处理的对…

Vivado+PetaLinux 系统搭建教程

PetaLinux 是基于 Yocto project DDR SDRAM 双倍数据率同步动态随机存取存储器&#xff08;英语&#xff1a;Double Data Rate Synchronous Dynamic Random Access Memory&#xff0c;简称DDR SDRAM&#xff09;为具有双倍资料传输率的SDRAM&#xff0c;其资料传输速度为系统主…

【python因果推断库5】使用 CausalPy 进行贝叶斯geolift 分析2

目录 NHEFS 数据 评估平衡 估计平均处理效应 结论 再次&#xff0c;InversePropensityWeighting 类封装了检查倾向性得分分布以及在不同加权方案下评估平均处理效应的功能。 result1.plot_ATE(method"raw", prop_draws10, ate_draws500); 这里我们在三个图板中绘…

DDS基本原理--FPGA学习笔记

DDS信号发生器原理&#xff1a; timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/09/04 15:20:30 // Design Name: hilary // Module Name: DDS_Module //module DDS_Module(Clk,Reset_n,Fword,Pword,Data);input Clk;input Reset_n;input [31:0]…

ROS2 2D相机基于AprilTag实现3D空间定位最简流程

文章目录 前言驱动安装下载安装方式一&#xff1a;方式二&#xff1a; 相机检测配置config文件编译、运行程序注意 内参标定标定板运行程序 apriltag空间定位标签打印下载安装可视化结果 前言 AprilTag是一种高性能的视觉标记系统&#xff0c;广泛应用于机器人导航、增强现实和…

ComfyUI中IC-Light节点的Detail Transfer节点参数测试

&#x1f386;背景 ic-light是一个能重绘画面光影的节点&#xff0c;但是在重绘的过程中&#xff0c;难免会将图像本身的细节进行重绘&#xff0c;尤其是在电商的场景中&#xff0c;文字和商品的细节很多时候会被重绘的乱七八糟。 针对这种情况&#xff0c;Comfyui-IC-Light节…

Java Web全栈开发技术指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;Java Web开发涉及前端JavaScript、后端Java Servlet、JSP等技术。本指南涵盖了JavaScript、JSP、Servlet、MVC模式、Web容器、HTML/CSS/JS、AJAX、RESTful API、JSON、前后端分离、数据库连接和操作以及安全性等…

Mysql8.0安装以及递归表达式使用

mysql安装 以centos7为例安装&#xff01; 安装wget yum install wget -y 给CentOS添加rpm源&#xff0c;并且选择较新的源 官网地址 wget dev.mysql.com/get/mysql84-community-release-el7-1.noarch.rpm 下载安装的rpm源文件 yum install mysql84-community-release-el7-1.no…

国有企业如何高效开展虚假贸易排查?

▶虚假贸易排查最新动向 2023年10月&#xff0c;有关文件提出“十不准”&#xff0c;严禁央企开展各类虚假贸易业务。 2024年5月&#xff0c;明确表示将依法加大对排斥限制潜在投标人、规避招标、串通投标、以行贿手段谋取中标等违法犯罪行为的惩处力度。 2024年7月&#xf…

深智城基于超融合数据库MatrixOne的一站式交通大数据平台改造

在智慧交通应用中&#xff0c;数据处理需求极为复杂&#xff0c;涉及人、车辆、道路和环境等多个方面&#xff0c;产生了大量异构数据。交通管理人员需要对这些数据进行实时分析和决策&#xff0c;以应对各种交通事件。然而&#xff0c;在实际生产中会发现数据处理缺陷、管理复…

负载均衡 Ribbon 与 Fegin 远程调用原理

文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理&#xff1a;Nacos 注册中心》 末尾提到了负载均…

信息安全发展阶段与形式

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;信息安全的发展阶段 信息安全的发展阶段可以参照下面的思维导图&#xff1a; 0x02&#xff1a;我国的信息安全形式 2013 年&#xff0c;“棱镜门” 事件在全球持续发酵&#xf…

idea配置连接数据库的操作方法(适配不同版本)

文章目录 一、IDEA找不到database图标的解决方法二、链接数据库 一、IDEA找不到database图标的解决方法 首先很多小伙伴说我左右侧边栏都找了找不到数据库图标 解决办法&#xff1a; 第一种&#xff1a;选择 View --> Tool Windows --> Database 如果你的idea版本在这里…

ASP源码 发布站改制最终版 原来3000ok网通大站的源程序

ASP源码 新服发布站改制最终版 原来3000ok网通大站的源程序 这个是非常完整 兼容性很强的。 后台地址&#xff1a;http://你的域名/admin 账号&#xff1a;admin 密码&#xff1a;admin 会员发布地址&#xff1a;http://你的域名/gamevip 源码下载&#xff1a;https://downlo…