Java使用Map+函数式接口实现策略模式

news2024/11/29 4:48:42

一、项目背景

在项目中,我们处理了各种类型的通知消息。在没有采用策略模式之前,代码中充斥了大量的 if-else 语句,这不仅让整个项目显得杂乱无章,还增加了后续维护的难度。为了解决这一问题,我们采用了 Map 和函数式接口来实现策略模式,从而显著提升了代码的可读性和可维护性。
例如下面这样,大家是不是经常见到


if (type == 1) {
	// 业务1
}
else if (type == 2){
    // 业务2
}
else {
    // 业务3
}

开源地址,大家可以点点⭐

二、代码实现

  1. 首先我们创建一个实现各个操作的service,模拟业务操作。
import org.springframework.stereotype.Service;

@Service
public class NoticeTypeService {

    public String email(String name){
        return "电子邮件通知:" + name;
    }
 
    public String QQ(String name){
        return "QQ通知:" + name;
    }

    public String ding(String name){
        return "钉钉通知:" + name;
    }

    public String wechat(String name){
        return "微信通知:" + name;
    }
 
}
  1. 接着我们创建一个策略实现类,代码已写注释。还有不懂得可以评论区提问~
import com.demo.template.service.NoticeTypeService;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

@Component
public class NoticeStrategy {

    @Resource
    private NoticeTypeService noticeTypeService;

    private Map<String, Function<String, String>> noticeTypeMap = new HashMap<>();

    /**
     * 初始化noticeTypeMap @PostConstruct会在bean的依赖注入完成之后被调用
     */
    @PostConstruct
    public void init() {
        noticeTypeMap.put("qq", name -> noticeTypeService.QQ(name));
        noticeTypeMap.put("email", name -> noticeTypeService.email(name));
        noticeTypeMap.put("ding", name -> noticeTypeService.ding(name));
        noticeTypeMap.put("wx", name -> noticeTypeService.wechat(name));
    }

    /**
     * 根据不同的通知类型获取执行结果
     *
     * @param noticeType 通知类型
     * @return noticeTypeService对应函数执行完的结果
     */
    public String getAction(String noticeType, String name) {
        // 从map中取出对应的函数
        Function<String, String> result = noticeTypeMap.get(noticeType);
        if (result != null) {
            return result.apply(name);
        }
        return "不存在此类型";
    }
}

  1. 最后我们创建一个controller,然后测试一下结果
import com.demo.template.config.NoticeStrategy;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/notice")
public class NoticeController {

    @Resource
    private NoticeStrategy strategy;


    @GetMapping("/getType")
    public String getWork(String type,String name) {
        return strategy.getAction(type,name);
    }
}

三、补充

有时候我们的函数需要传入多个参数的,可以自定义函数接口类,下面是示例

/**
 * 自定义参数函数接口,想拓展几个就拓展几个,默认的Function只能传1个参数
 * @param <paramA>
 * @param <paramB>
 * @param <Result>
 */
@FunctionalInterface
interface NoticeFunction<paramA, paramB, Result>{
    Result apply(paramA a, paramB b);
}

四、最终效果

我们在地址栏输入下面的URL,最后浏览器显示如下
http://localhost:8888/api/notice/getType?type=qq&name=张三
在这里插入图片描述

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

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

相关文章

Vue事件处理:v-on 指令

1、v-on 指令 在 Vue.js 中&#xff0c;事件处理是一个很重要的环节&#xff0c;可以使用 v-on 指令对 DOM 事件进行监听。该指令通常在模板中直接使用&#xff0c;在触发事件时执行相应的 JavaScript 代码。在 HTML 元素中使用 v-on 指令时&#xff0c;v-on 后面可以是所有的…

动态内存管理申请调整和释放

动态内存管理存放在内存中的堆区中 动态内存分配的函数&#xff1a;malloc、calloc、realloc、free 动态内存分配 malloc函数&#xff08;内存申请空间&#xff09;无初始化free函数&#xff08;动态内存释放&#xff09;calloc函数&#xff08;内存空间申请&#xff09;初始化…

【MADRL】基于MADRL的单调价值函数分解(QMIX)算法

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在强化学习专栏&#xff1…

30道python自动化测试面试题与答案汇总!

Python是不可或缺的语言,它的优美与简洁令人无法自拔,下面这篇文章主要给大家介绍了关于30道python自动化测试面试题与答案汇总的相关资料,需要的朋友可以参考下 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明…

硬核剧透!安全领域专家及领军人物共话生态标准 | 2024 龙蜥大会=

2024 龙蜥操作系统大会由中国计算机学会开源发展委员会、中关村科学城委员会、海淀区委网信办、中国开源软件推进联盟指导&#xff0c;龙蜥社区主办&#xff0c;阿里云、中兴通讯、Intel、浪潮信息、Arm、中科方德等 24 家理事单位共同承办&#xff0c;主题为“进化重构赴未来”…

别再混淆了!一文带你理清前置机、跳板机与堡垒机的区别

本文详细介绍前置机、跳板机和堡垒机在网络安全和IT基础设施中各自扮演着重要角色&#xff0c;它们虽然有一定的相似性&#xff0c;但在功能和用途上存在显著差异。以下是对三者的详细解析&#xff1a; 前置机 概念 前置机是一种中间设备&#xff0c;通常位于客户端和服务器…

神经网络训练多个epoch,写论文的时候可以取最好的效果那一个epoch作为结果吗?

在论文中&#xff0c;通常建议报告在验证集上表现最佳的模型作为结果。你可以在训练过程中记录每个 epoch 的性能&#xff0c;并选择在验证集上性能最好的那个 epoch 的结果。这种方法能够展示你所训练的模型在其最佳状态下的表现。 这样做有几个优点&#xff1a; 客观展示模…

Linux系统编程(13)IPC(共享内存)和网络通信基础

一、共享内存 共享内存是通过映射的方式在内核中申请一段可以使用的物理内存空间来映射到用户空间中&#xff0c;用户对用户空间的操作就是直接操作物理内存区域。通过这种方式&#xff0c;进程可以直接读写这部分内存&#xff0c;从而实现高效的数据交换。相比于其他 IPC 机制…

vue2子组件生命周期被调用两次

目前解决办法是改成了这种写法&#xff0c;改为这种不会出现加载两次子组件生命周期的问题 <el-tabs v-model"activeName" style"margin: 0px"><el-tab-pane name"systemLogCollection"><span slot"label">{{ tabLi…

[数据集][目标检测]起子检测数据集VOC+YOLO格式1215张1类别

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

20240822 每日AI必读资讯

特斯拉雇佣员工通过穿戴动捕服来帮助训练其人形机器人Optimus&#xff01; - 该职位被称为“数据采集操作员”&#xff0c;时薪最高可达48美元&#xff0c;要求员工每天行走超过七小时&#xff0c;携带高达30磅的重量&#xff0c;并长时间佩戴VR头显。 - 员工还必须身高在5英…

ConfigurationProperties使用

ConfigurationProperties 是 Spring Framework 的一个注解 用于将配置文件&#xff0c;环境变量中的值映射到一个 Java 对象的属性上。 简单使用 user:admin:name: adminpassword: 123456age: 18Data Component ConfigurationProperties(prefix "user.admin") publ…

Vue 满屏纵向轮播图

目录 前言轮播图效果展示具体实现实现思路具体代码前言 今天汇总一个需求,还是之前写的,要求写一个满屏的轮播图,准确的说,是鼠标滑动到轮播图的时候,轮播图固定在屏幕上,随着其中的轮播子项遍历结束后,解除固定的效果。原本我最开始想直接修改Element-UI的组件的,但是…

湖州网站建设快速建站

在当今信息化时代&#xff0c;网站的建设已成为企业和个人展示形象、传播信息的重要途径。湖州作为一个历史悠久、文化底蕴深厚的城市&#xff0c;发展迅速&#xff0c;涌现出许多需要快速建立网站的企业和个人。本文将探讨湖州网站建设的快速建站方案。 首先&#xff0c;快速建…

WRF-LES与PALM微尺度气象大涡模拟

针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和人为因素如城市布局紧密相关。在这种规模上&#xff0c;传统的气象模…

Camunda BPMN 基础组件

Camunda基础 一、参与者 参与者&#xff08;Participants&#xff09;是参与流程的对象&#xff0c;表示流程中活动的执行者&#xff0c;可以是一个组织、角色、系统或者个人。 图示为基础事件&#xff0c;除此之外还有&#xff1a; 消息开始事件&#xff08;Message Start…

第二百零四节 Java正则表达式教程 - Java正则表达式量词

Java正则表达式教程 - Java正则表达式量词 我们可以指定正则表达式中的字符的次数可以匹配字符序列。 为了使用正则表达式表达一个数字或更多的模式&#xff0c;我们可以使用量词。 下表列出了量词及其含义。 量词含义*零次或更多次一次或多次?一次或根本不{m}正好m次{m,}至…

数字工厂管理系统的使用操作难不难

在当今智能制造的浪潮中&#xff0c;引入数字工厂管理系统无疑为企业带来了前所未有的效率提升与决策优化能力。然而&#xff0c;谈及数字工厂管理系统的操作难易程度&#xff0c;这并非一个可以一概而论的问题&#xff0c;它深深植根于系统的复杂性、用户技能水平、培训深度以…

python之matplotlib (8 极坐标)-圆与心

极坐标 极坐标图像的绘制类似于三维图像的绘制&#xff0c;只需要将projection参数由3d改为polar即可。 import numpy as np import matplotlib.pyplot as plt figplt.figure() axfig.add_subplot(projectionpolar)theta np.linspace(0, 2 * np.pi, 100) r np.sin(the…

企业高性能web服务器之Nginx

文章目录 Apache经典的web服务端Apache prefork 模型Apache work 模型&#xff08;适应市场&#xff09;Apache event 模型 网络I/O网络I/O模型I/O模型网络I/O模型 Nginx架构和安装Nginx源码编译环境准备安装nginx Nginx的平滑升级及版本回滚 Nginx架构和进程Nginx进程结构Ngin…