设计模式 Map+函数式接口减少if else

news2024/11/15 12:52:56

参考资料

  1. 代码优雅之道——如何干掉过多的if else

目录

  • 一. 前期准备
  • 1.1 标记邮箱种类的接口
    • 1.2 邮箱类型区分类
    • 1.3 入参Form实体类
  • 二. 邮件发送的业务聚合类
  • 三. 定义函数式接口,创建邮件发送的Map
  • 四. 效果


一. 前期准备

1.1 标记邮箱种类的接口

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MailCategoryAnnotation {

    String mailCode();
}

1.2 邮箱类型区分类

  • 考虑到之后可能会有其他类型的区分,因此使用了内部class
public final class CategoryKbn {

    // 邮件种类
    public final class MailCategory {
        public final static String Mail_163 = "1";
        public final static String Mail_QQ = "2";
        public final static String Mail_G = "3";
        public final static String Mail_OutLook = "4";
    }
	// 其他种类。。。
}

1.3 入参Form实体类

import lombok.Data;

@Data
public class Test27Form {
	
	// 用于标记邮箱的种类
    private String category;
}

二. 邮件发送的业务聚合类

  • 自定义的注解作用在Method上,用来标记邮件发送方法的类型
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class SendMailService {
	
    @MailCategoryAnnotation(mailCode = CategoryKbn.MailCategory.Mail_QQ)
    public void sendQQMail(Map<String, String> mailInfoMap) {
        System.out.println("QQ邮箱发送邮件。。。");
        System.out.println(mailInfoMap);
    }

    @MailCategoryAnnotation(mailCode = CategoryKbn.MailCategory.Mail_163)
    public void send163Mail(Map<String, String> mailInfoMap) {
        System.out.println("163邮箱发送邮件。。。");
        System.out.println(mailInfoMap);
    }

    @MailCategoryAnnotation(mailCode = CategoryKbn.MailCategory.Mail_G)
    public void sendGMail(Map<String, String> mailInfoMap) {
        System.out.println("GMail邮箱发送邮件。。。");
        System.out.println(mailInfoMap);
    }

    @MailCategoryAnnotation(mailCode = CategoryKbn.MailCategory.Mail_OutLook)
    public void sendOutLookMail(Map<String, String> mailInfoMap) {
        System.out.println("OutLook邮箱发送邮件。。。");
        System.out.println(mailInfoMap);
    }
}

三. 定义函数式接口,创建邮件发送的Map

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Service
public class Test27Service implements InitializingBean {

    @Autowired
    private SendMailService mailService;
	
	/*
		邮件种类code和发送邮件方法的映射Map
	*/
    private final Map<String, MailFunction<Map<String, String>>> strategySendMailMap = new HashMap<>();


    // 标记此接口为函数式编程接口
    @FunctionalInterface
    interface MailFunction<T> {
    	// 不知道参数会是什么类型,就使用了泛型
        void sendMail(T mailInfo) throws Exception;
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {

        for (Method mailSendMethod : Arrays.asList(mailService.getClass().getMethods())) {			
        	// 如果该方法上没有被标记MailCategoryAnnotation自定义注解就跳过
            if (!mailSendMethod.isAnnotationPresent(MailCategoryAnnotation.class)) {
                continue;
            }
			
			// 获取Method上被标记的MailCategoryAnnotation注解上的mailCode
            String mailCode = mailSendMethod.getAnnotation(MailCategoryAnnotation.class).mailCode();
            
            // 将mailcode和发送邮件的方法添加到Map中
            strategySendMailMap.put(mailCode, (T) -> mailSendMethod.invoke(mailService, T));
        }
    }


    public void execute(String category) throws Exception {
    	
    	// 发送邮件时所需要的参数
    	Map<String, String> mailInfoMap = new HashMap<>() {
            {
                put("id", "110120");
                put("name", "jiafeitian");
            }
        };
        
        // 根据category获取邮件的发送方法,并执行
        MailFunction<Map<String, String>> sendMailFunction = strategySendMailMap.get(category);
        sendMailFunction.sendMail(mailInfoMap);
    }
}

四. 效果

⏹前台

const jsonData = {
    category: '2'
};

$.ajax({
    url: "/test27/test1",
    type: 'POST',
    data: JSON.stringify(jsonData),
    contentType: 'application/json;charset=utf-8',
    success: function (data, status, xhr) {
        console.log(data);
    }
});

⏹后台

import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;

@PostMapping("/test1")
public ResponseEntity<Void> test1(@RequestBody Test27Form form) throws Exception {

    service.execute(form.getCategory());
    return ResponseEntity.noContent().build();
}

👇效果

在这里插入图片描述

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

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

相关文章

一文让你真正了解正则表达式

1 正则表达式是什么 正则表达式(Regular Expression)其实就是一门工具&#xff0c;目的是为了字符串模式匹配&#xff0c;从而实现搜索和替换功能。它起源于上个20世纪50年代科学家在数学领域做的一些研究工作&#xff0c;后来才被引入到计算机领域中。从它的命名我们可以知道…

3自由度并联绘图机器人实现写字功能(二)

1. 功能说明 本文示例将实现R305b样机3自由度并联绘图机器人写字的功能。本实验使用的样机是用探索者兼容零件制作的。 2. 电子硬件 在这个示例中&#xff0c;采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩…

Visual Studio C# WinForm开发入门(5):TabControl 控件使用

TabContrl选项卡控件可创建标签化窗口&#xff0c;在实际 编程中经常用到&#xff0c;该控件的作用是将相关的组件组合到一系列选项卡页面上。 比如下面的例子&#xff0c;在tabPage1页面和tabPage2页面各放了2个checkBox控件&#xff0c;通过点击不同page即可切换&#xff1a;…

交叉编译工具

工具链有一个松散的名称约定&#xff0c;如 arch[-vendor][-os]-abi-language . arch 适用于架构&#xff0c;编译器用于哪个目标平台&#xff1a; arm &#xff0c; mips &#xff0c; x86 &#xff0c; i686 ... vendor 是工具链供应商&#xff0c;以厂家名称命名的&#xf…

权威学者、企业CFO荟聚上海国家会计学院,共探「智能会计 价值财务」

4月21日&#xff0c;由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会在上海国家会计学院圆满举办。学院权威教授、业内专家与来自央国企、行业领先企业的财务先锋&#xff0c;线下云端共聚一堂&#xff0c;数万人共探大型企业财务数智化的全新价值主张。 会议伊始…

WLAN - 五大安全措施

文章目录 1 概述2 五大安全措施2.1 SSID 访问控制2.2 物理地址过滤 MAC2.3 有线等效保密 WEP2.4 WPA&#xff08;IEEE 802.11i 草案&#xff09;2.5 WPA2&#xff08;IEEE 802.11i&#xff09; 3 扩展3.1 网工软考真题 1 概述 无线局域网面临着两个主要问题&#xff0c;一是增…

【Unity入门】19.定时调用Invoke

【Unity入门】定时调用Invoke 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;计时器 &#xff08;1&#xff09;Invoke 单词调用 计时器我们并不陌生&#xff0c;在cocos上有着schedule类是…

深度学习 - 45.MMOE Gate 简单实现 By Keras

目录 一.引言 二.MMoE 模型分析 三.MMoE 逻辑实现 • Input • Expert Output • Gate Output • Weighted Sum • Sigmoid Output • 完整代码 四.总结 一.引言 上一篇文章介绍了 MMoE 借鉴 MoE 的思路&#xff0c;为每一类输出构建一个 Gate 并最终加权多个 Exper…

http---HTTP缓存

目录 1、缓存介绍 2、http缓存 3、强缓存 4、协商缓存 1、缓存介绍 缓存&#xff1a;存储将被用的数据&#xff0c;让数据访问更快。 缓存相关术语 命中&#xff1a;在缓存中找到了请求的数据不命中/穿透&#xff1a;缓存中没有需要的数据命中率&#xff1a;命中次数/总…

Yarn(Yet Another Reource Negotiator)另一个资源协调者

官网引用 总结性 产生的需求 YARN工作逻辑 通用的资源管理系统&#xff0c;为上一层应用提供统一的资源管理和调度。解决集群资源利用率&#xff0c;数据共享&#xff0c;资源管理统一问题&#xff0c;yarn取代Job Tracker角色 组件说明 Client 向RM提交任务&#xff0c;终…

1、软件测试概述

1、软件测试概述 一、软件生命周期二、软件开发模型1、瀑布模型2、增量模型3、原型模型4、敏捷开发 三、软件质量1、软件质量概念2、影响软件质量的因素 一、软件生命周期 软件生命周期分为多个阶段&#xff0c;每个阶段有明确的任务&#xff0c;通常&#xff0c;可将软件生命…

ARM寄存器组织

ARM有37个32位长的寄存器&#xff1a; 1个用做PC&#xff08;Program Counter&#xff09;&#xff1b; 1个用做CPSR(Current Program Status Register)&#xff1b; 5个用做SPSR&#xff08;Saved Program Status Registers&#xff09;&#xff1b; 30个通用寄存器。 AR…

Unity之OpenXR+XR Interaction Toolkit实现 射线和物体交互事件回调

前言 前面我们介绍了如何抓取物体&#xff0c;今天我们来说一下如何和3D的物体进行交互&#xff0c;得到接触的事件回调。 交互的两种方式&#xff1a; 1.直接抓取或者射线抓取物体&#xff0c;得到接触回调 2.射线或者手部触摸物体后&#xff0c;得到接触回调 准备工作 有了…

Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复

1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便 所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安…

嵌入式软考备考_3 嵌入式操作系统概述

嵌入式操作系统概述 工作在嵌入式环境中的操作系统 Embedded Operating System。 嵌入式和一般操作系统区别&#xff1a; 非通用操作系统&#xff0c;用于完成特定功能&#xff1b;性能实时性能源可靠性要求高&#xff1b;占用资源少&#xff1b;可剪裁&#xff0c;可配置。…

渗透测试 | Web信息收集

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…

《程序员面试金典(第6版)》面试题 16.04. 井字游戏(棋盘类问题,C++)

题目描述 设计一个算法&#xff0c;判断玩家是否赢了井字游戏。输入是一个 N x N 的数组棋盘&#xff0c;由字符" "&#xff0c;“X"和"O"组成&#xff0c;其中字符” "代表一个空位。 以下是井字游戏的规则&#xff1a; 玩家轮流将字符放入空位…

专门为麻醉科和手术室开发的:手术麻醉系统源码,系统稳定,功能完整,支持二次开发

手术麻醉系统源码&#xff1a;C# .net 桌面软件 C/S版 系统极其稳定&#xff0c;扩展性强&#xff0c;已在多家医院运营。 文末获取联系 手术麻醉信息管理系统是专门为麻醉科和手术室开发的围手术期临床信息管理系统&#xff0c;具备以下功能: 1.手术程管理系统整合了手术室、…

人工智能实践: 基于T-S 模型的模糊推理

模糊推理是一种基于行为的仿生推理方法, 主要用来解决带有模糊现象的复杂推理问题。由于模糊现象的普遍存在, 模糊推理系统被广泛的应用。模糊推理系统主要由模糊化、模糊规则库、模糊推理方法以及去模糊化组成, 其基本流程如图1所示。

C++(继承下)

目录&#xff1a; 1.继承与有元 2.继承与静态成员 3.单继承、多继承 4.如何定义一个不能被继承的类&#xff1f;&#xff1f; 5.分享有意思的一道题 6.菱形继承及菱形虚拟继承 --------------------------------------------------------------------------------------------…