如何优雅的在SpringBoot中编写选择分支,而不是大量if else?

news2024/12/22 14:03:35

  • 一、需求背景
  • 二、创建项目
  • 三、基础工作
  • 四、定义 Handler 类
  • 五、实现员工接口
  • 六、功能测试
    • 6.1 开发控制器
    • 6.2 功能测试
  • 七、总结


一、需求背景

部门通常指的是在一个组织或企业中组成的若干人员,他们共同从事某一特定工作,完成共同的任务和目标。在组织或企业中,部门通常是按照职能、工作性质或业务范畴等因素进行划分的,如财务部门、人力资源部门、市场部门等。

部门编号是公司或组织内部对不同职能部门的标识符号,通常采用数字、字母或其组合的形式来进行表示。部门编号的作用在于方便管理者对各个部门进行辨识和分类,同时也有利于人力资源管理和工作流程的优化。

在实现公司内部 OA 系统时,难免会遇到 部门编号 这个概念。

部门编号通常由公司或组织的管理人员根据实际情况进行规划和安排,各个部门的编号应当具有独立性、唯一性和易于记忆等特点,以方便在日常管理活动中使用

1——总经办
2——人力资源部
3——设计研发部
4——财务部
5——营销部
6——生产部

相信大多数同学,还是会采用最简单的 if else 方案,就是这样!

public class UserServiceImpl implements UserService {
    @Override
    public String getDepartmentTitle(String code) {
        if(Objects.equals("1",code)) {
            return "总经办";
        } else if(Objects.equals("2",code)) {
            return "人力资源部";
        } else if(Objects.equals("3",code)) {
            return "设计研发部";
        } else if(Objects.equals("4",code)) {
            return "财务部";
        } else if(Objects.equals("5",code)) {
            return "营销部";
        } else if(Objects.equals("6",code)) {
            return "生产部";
        }
        return "没有归属部门";
    }
}

这样实现起来简单,代码可读性好,但在部门数量过大的时候反而会加大工作量,不利于代码维护

但在开发过程中,如果不建立数据表,则需要用选择结构进行判断赋值,所以就产生了大量的 if-else 代码。

本文的目标,就是消除这些 if-else 代码,用更高级的方法来实现!


二、创建项目

首先,请同学们打开 IDEA,点击新建项目,界面如下所示。

在这里插入图片描述
选择 Maven,输入项目名称后,点击下一步,如下图所示。

在这里插入图片描述

直接点击创建即可,如下图所示。

在这里插入图片描述

三、基础工作

同学们在创建完成项目之后,在 cn.zwz.entity 新建一个 User 员工类,如下图所示。

在这里插入图片描述

在员工类中定义 部门编号姓名 两个字段,代码如下。

@Data
public class User {
    // 部门编码
    private String code;
    // 员工姓名
    private String name;
}

使用 @Data 注解,需要引入 lombok 依赖哦!

创建完成后,界面如下所示。

在这里插入图片描述


四、定义 Handler 类

Handler 类用于实现不同情况的处理措施,请同学们先创建抽象类,再创建三个 Handler 类。

抽象类:

public abstract class AbstractHandler {
    abstract public String getDepartmentTitle(String code);
}

总经办分支:

@Component
@HandlerType("1")
public class Handler1 extends AbstractHandler {

    @Override
    public String getDepartmentTitle(String code) {
        return "总经办";
    }
}

人力资源部分支:

@Component
@HandlerType("2")
public class Handler2 extends AbstractHandler {

    @Override
    public String getDepartmentTitle(String code) {
        return "人力资源部";
    }
}

设计研发部分支:

@Component
@HandlerType("3")
public class Handler3 extends AbstractHandler {

    @Override
    public String getDepartmentTitle(String code) {
        return "设计研发部";
    }
}

五、实现员工接口

请同学们在 cn.zwz.service 包下,新建 UserService 接口,如下图所示。

在这里插入图片描述

设计 获取部门名称 的接口,代码如下。

public interface UserService {

    /**
     * 获取部门名称
     * @param code 部门编码
     * @return 部门名称
     */
    String getDepartmentTitle(String code);
}

接着完成 UserService 接口的实现,创建 UserServiceImpl 类,如下图所示。

在这里插入图片描述

代码如下图所示。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private HandlerContext handlerContext;

    @Override
    public String getDepartmentTitle(String code) {
        AbstractHandler abstractHandler = handlerContext.getInstance(code);
        return abstractHandler.getDepartmentTitle(code);
    }
}

六、功能测试

6.1 开发控制器

创建 cn.zwz.controller.UserController 类,用于对接基于浏览器的测试,代码如下。

package cn.zwz.controller;

import cn.zwz.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/dep")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public String get(@RequestParam String code) {
        return userService.getDepartmentTitle(code);
    }
}

代码首先注入了 UserService 类,然后直接传入接口的参数 code。

6.2 功能测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


七、总结

利用 SpringBoot 的 Handler 策略模式可以简化大量的 if else 代码,方便开发者维护升级代码版本。

同学们在开发自己的商业订单时,可以采取这个方案来处理大量的选择逻辑。

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

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

相关文章

Logisim 头歌 偶校验解码电路设计 图解及代码(计算机组成原理)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 急的同学请直接点击目录跳到下方解答处!! 目录 图解:​编辑 代码题解(免费)&#x…

泰酷辣!基于全志R818的开源超迷你安卓手持终端CyberPad,芒果派惊喜之作

​继推出大小仅与普通SD卡不相上下爱的超迷你模组MCore-H616核心板之后,鸽了近半年时间的芒果派,又带来了一款惊喜之作——MCore-R818核心板。 该款MCore的设计也是基于R818的特性,做出了一些小小的改变。 芯片本体封装设计较小,…

【力扣周赛】第347场周赛

【力扣周赛】第347场周赛 6457. 移除字符串中的尾随零题目描述解题思路 2711. 对角线上不同值的数量差题目描述解题思路 6455. 使所有字符相等的最小成本题目描述解题思路 6456. 矩阵中严格递增的单元格数题目描述解题思路 6457. 移除字符串中的尾随零 题目描述 描述&#xf…

如何让Task在非线程池线程中执行?

Task承载的操作需要被调度才能被执行,由于.NET默认采用基于线程池的调度器,所以Task默认在线程池线程中执行。但是有的操作并不适合使用线程池,比如我们在一个ASP.NET Core应用中承载了一些需要长时间执行的后台操作,由于线程池被…

Linux:shell脚本的介绍,创建与执行

linux的shell脚本就是windows的bat脚本,也就是通常所说的批处理。更简洁地说,就是很多命令的结合体,就像编程一样。 windows脚本的扩展名是.bat,而linux脚本的扩展名则是.sh centos在编写shell脚本的文件最上边,需要加…

如何使用Sentinel的Slot插槽实现限流熔断,看完这篇文章会有新的收获

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将详细介绍如何使用Sentinel的Slot插槽实现限流熔断,后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x…

对于2023年参加国家计算机软考系统分析师的感想

文章目录 前言系分简介系分知识点今年的题型综合知识(上午选择题)案例分析(下午简答分析题)论文(下午小作文) 写在最后 前言 23年3月27日参加了国家计算机软考系统分析师,考完后很多的题库网站就有小道估分了。当然&a…

一些零零碎碎的记录

Questions1. 用户访问多网址服务器同一个IP是怎么回事 Q:用户访问服务器的同一个IP不同网址,服务器是如何区分的A: 在 HTTP 协议中,客户端通过发送请求报文来向服务器请求资源。每个 HTTP 请求都包含一个 HTTP 头部,其中包括了一些关键信息&…

力扣sql中等篇练习(三十)

力扣sql中等篇练习(三十) 1 即时食物配送||| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT order_date,ROUND(100*count(IF(order_datecustomer_pref_delivery_date,customer_id,null))/count(*)…

studio one6免费版下载及配置要求 附精调效果包

提到编曲软件,就不得不说这款水果编曲软件。它对新手和老手都比较友好,是一款较为经典的编曲软件。 这款软件提供了强大而全面的音符、音效编辑器,可以在其中插入各种乐器声音,如果内置乐器无法满足编曲需求,还可以外…

ABAQUS计算随机振动设置及输出

ABAQUS计算随机振动设置及输出 1.分析步设置 随机振动主要包括两个分析步:频率和随机振动 1.1 频率设置 频率这里需要注意的是最高频率最好是扫频范围的2-2.5倍 比如随机频率区间是[0-2000hz],最高频率应该大于4000Hz,才能保证精度 1.2 随机响应设…

数据结构【栈】有哪些应用场景?

✨Blog:🥰不会敲代码的小张:)🥰 🉑推荐专栏:C语言🤪、Cpp😶‍🌫️、数据结构初阶💀 💽座右铭:“記住,每一天都是一個新的開始&#x1…

如何在前端应用中合并多个 Excel 工作簿

本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 | 问题背景 ​ SpreadJS是纯前端的电子表格控件,可以轻松加载 Excel 工作簿中的数据…

Hack The Box - 关卡Dancing

SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的。 SMB 是一种客户机/服务器、请求/响应协议。通过 SMB 协议,客户端应用程序可以在各种网络环境下读、写服务器上的…

干货|7种提高客户推荐率的方法,让你的客户成为你的推广大使!

大家都知道“客户推荐”是一种非常有效的业务推广方式。通过口碑传播,可以吸引更多的潜在客户,建立长期稳定的合作关系。 可以说,这种开发客户的方法:耗时少,成功率高,成本低,客户更好,堪称世界…

山西电力市场日前价格预测【2023-05-30】

日前价格预测 预测明日(2023-05-30)山西电力市场全天平均日前电价为350.71元/MWh。其中,最高日前价格为424.56元/MWh,预计出现在19: 30。最低日前电价为239.37元/MWh,预计出现在13: 00。 以上预测仅供学习参考&#xf…

律师使用ChatGPT 进行法律文献检索提交了错误信息;李开复表示,威力强大的大模型将彻底变革人工智能

🚀 一名律师使用ChatGPT 进行法律文献检索提交了错误信息 近日,一名律师在法庭案件中使用聊天机器人 ChatGPT 进行法律文献检索,结果提交了错误信息, 揭示了人工智能在法律领域的潜在风险,包括误传错误信息。 该事件…

数据分析师的基本职责(合集)

算法工程师的职责表述 算法工程师的职责表述1 职责 1、维护、扩展的大数据处理分析平台; 2、负责将先进的工业大数据分析技术转化为标准化的分析工具与模块; 3、规范并优化算法,提高可靠性; 4、帮助建立标准化的数据分析路线图,能够提取、转换并加强数据…

音视频技术开发周刊 | 295

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 微软炸通Windows与ChatGPT全家桶!人手一个Copilot,AI宇宙降临 三位OpenAI掌舵人亲自撰文:我们应该如何治理超级智能? OpenA…

《Opencv3编程入门》学习笔记—第一章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第一章 邂逅opencv 参考推荐软件版本:visual studio2010 opencv2.4.9 visual studio安装教程: https://blog.csdn.net/qq_45768871/article/details/1081788…