策略模式-通过枚举newInstance替代工厂

策略模式-使用枚举newInstance

  • 前言
  • 一、枚举类:MarkCheckDataTypeEnum
  • 二、抽象类:AbstractMarkChecker
  • 三、检查类:MarkPeopleChecker
  • 四、demo演示
  • 总结


前言

很久没写文章了~~
吐槽下:入职新公司后,基本在搬砖,我爱劳动我光荣~

遇到一个小需求:根据接口入参-不同类型,进行不同字段的检查。不想写if…else嵌套,就写了个最简单的策略模式。


一、枚举类:MarkCheckDataTypeEnum

创建一个枚举类,将业务实现类作为枚举的一个属性,
如:
STD_PEOPLE(“std_people”, MarkPeopleChecker.class)

public enum MarkCheckDataTypeEnum {/*** 主体-人*/STD_PEOPLE("std_people", MarkPeopleChecker.class),/*** 主体-房屋*/STD_HOUSE("std_house", MarkHouseChecker.class),/*** 主体-小区*/STD_RESIDENTIAL("std_residential", MarkResidentialChecker.class),/*** 主体-商铺*/STD_BUSINESS("std_business", MarkBusinessChecker.class),/*** 主体-企业*/STD_ENTERPRISE("std_enterprise", MarkEnterpriseChecker.class),/*** 主体-区域*/STD_PARK("std_park", MarkParkChecker.class),;/*** 主体类型*/private String dataType;/*** 主体的预检查类*/private Class<?> checker;MarkCheckDataTypeEnum(String dataType, Class checker) {this.dataType = dataType;this.checker = checker;}public String getDataType() {return dataType;}public void setDataType(String dataType) {this.dataType = dataType;}public Class<?> getChecker() {return checker;}public void setChecker(Class<?> checker) {this.checker = checker;}/*** 根据主体获取检查类** @param dataType 主体类型* @return 检查类* @throws Exception new实例异常*/public static AbstractMarkChecker getMarkChecker(String dataType) throws Exception {for (MarkCheckDataTypeEnum markCheckDataTypeEnum : MarkCheckDataTypeEnum.values()) {if (markCheckDataTypeEnum.getDataType().equals(dataType)) {return (AbstractMarkChecker) markCheckDataTypeEnum.getChecker().newInstance();}}return MarkCommonChecker.class.newInstance();}
}

二、抽象类:AbstractMarkChecker

BusinessException这个是自定义异常,用于抛出检查类:检查不通过的原因。
1:有点编码基础的,也可以换成自己的异常类
2:或者把不通过的原因返回出来,如:

public abstract String check(List<String> assetFieldNameList);

我的代码如下:

import lobster.base.exception.BusinessException;
import org.springframework.stereotype.Service;import java.util.List;/*** 保存标注时,进行必要信息检查* 人:* 未检测到【证件号】或者【姓名】+【手机号】标注字段,而有其他人员非必要信息字段标注的情况下* 提示:您的标注信息未包含人员必要信息字段【证件号】或【姓名+手机号】,可能导致人员信息数据无法入库,请仔细检查。* <p>* 房屋:* 未检测到【房屋地址】或者【楼栋+单元+楼层+房号】或者【房号】标注字段,而有其他房屋非必要信息字段标注的情况下* 提示:您的标注信息未包含房屋必要信息字段【房屋地址】或【楼栋+单元+楼层+房号】或【房号】,可能导致房屋信息数据无法入库,请仔细检查。* <p>* <p>* 小区:* 未检测到【小区名】标注字段,而有其他小区非必要信息字段标注的情况下* 提示:您的标注信息未包含小区必要信息字段【小区名】,可能导致小区信息数据无法入库,请仔细检查。* <p>* 商铺:* 未检测到【商铺名称+商铺地址】标注字段,而有其他商铺非必要信息字段标注的情况下* 提示:您的标注信息未包含商铺必要信息字段【商铺名称+商铺地址】,可能导致商铺信息数据无法入库,请仔细检查。* <p>* 企业:* 未检测到【企业名称+企业地址】标注字段,而有其他企业非必要信息字段标注的情况下* 提示:您的标注信息未包含企业必要信息字段【企业名称+企业地址】,可能导致企业信息数据无法入库,请仔细检查。* <p>* 区域:* 未检测到【区域名称】标注字段,而有其他区域非必要信息字段标注的情况下* 提示:您的标注信息未包含区域必要信息字段【区域名称】,可能导致区域信息数据无法入库,请仔细检查。** @author lobster*/
@Service
public abstract class AbstractMarkChecker {/*** 检查主体必要字段** @param assetFieldNameList 当前主体,标注时选择的字段* @throws BusinessException 业务异常*/public abstract void check(List<String> assetFieldNameList) throws BusinessException;
}

三、检查类:MarkPeopleChecker

检查类和MarkCheckDataTypeEnum的checker对应。
这里只贴一个MarkPeopleChecker,检查类都差不多

import lobster.base.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import java.util.List;/*** 人:* 未检测到【证件号】或者【姓名】+【手机号】标注字段,而有其他人员非必要信息字段标注的情况下* 提示:您的标注信息未包含人员必要信息字段【证件号】或【姓名+手机号】,可能导致人员信息数据无法入库,请仔细检查。** @author lobster*/
@Slf4j
@Service
public class MarkPeopleChecker extends AbstractMarkChecker {private static final String NAME = "name";private static final String ID_CARD = "id_card";private static final String MOBILE = "mobile";@Overridepublic void check(List<String> assetFieldNameList) throws BusinessException {boolean containsName = assetFieldNameList.contains(NAME);boolean containsIdCard = assetFieldNameList.contains(ID_CARD);boolean containsMobile = assetFieldNameList.contains(MOBILE);if (containsIdCard) {log.info("标注主体:std_people 存在【证件号】");return;}if (containsName && containsMobile) {log.info("标注主体:std_people 存在【姓名】+【手机号】");return;}throw new BusinessException(500, "您的标注信息未包含人员必要信息字段【证件号】或【姓名+手机号】,可能导致人员信息数据无法入库,请仔细检查");}
}

四、demo演示

直接执行main方法就行

代码如下(示例):

import com.example.springDemo.markprecheck.MarkCheckDataTypeEnum;
import com.google.common.collect.Lists;
import lobster.base.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController("mark/pre/check")
public class MarkPreCheckController {@GetMapping(value = "demo", name = "通过枚举实现策略")public static String demo() {try {MarkCheckDataTypeEnum.getMarkChecker("std_people").check(Lists.newArrayList("name", "sex"));} catch (BusinessException e) {log.error("出现业务异常:", e);return e.getMsg();} catch (Exception e) {log.error("出现系统异常:", e);return e.getMessage();}return "success";}//直接执行main方法就行public static void main(String[] args) {String errorMsg = demo();System.out.println(errorMsg);}
}

实例代码打印结果:
在这里插入图片描述


总结

总来的来,emm~~这个示例很简单,没啥说的。
主要是通过MarkCheckDataTypeEnum.getMarkChecker()来获取检查类实例,然后调用检查类的check方法。
通过扩展枚举类MarkCheckDataTypeEnum与具体的检查类,对代码进行解耦。但解耦不多,不如工厂+策略的方式。

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

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

相关文章

这几个PR小技巧你Get到了吗?

学习是永无止境的&#xff0c;需要不间断地学习&#xff0c;获取新知识。今天带来了5个PR小技巧&#xff0c;可以先收藏起来Adobe Premiere Pro 2024的获取查看Baidu Cloud 1、双倍稳定画面更舒适 一般来说大型电视剧、电影使用的拍摄设备都是非常高端的&#xff0c;不像我们…

【研究】国内外大模型公司进展

2022年11月&#xff0c;OpenAI推出基于GPT-3.5的ChatGPT后&#xff0c;引发全球AI大模型技术开发与投资热潮。AI大模型性能持续快速提升。以衡量LLM的常用评测标准MMLU为例&#xff0c;2021年底全球最先进大模型的MMLU 5-shot得分刚达到60%&#xff0c;2022年底超过70%&#xf…

面相对象程序设计

面相对象程序设计包含内容如下 局域网聊天程序设网页浏览器设计电子日历记事本的设计 以其中的一个的报告进行举例 1需求与总体设计 1 1.1需求分析 1 1.2总体设计方案 1 1.2&#xff0e;1系统功能分析以及功能表 1 1.3系统类图的关系以及表之间的联系 2 2详细设计 3 2.1 Manag…

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下&#xff0c;返回状态为fulfilled&#xff0c;值为undefined。 所以可以直接进行.then操作&#xff1a; this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …

ARM day1练习 求1~100内的和

题目要求:用ARM汇编语言实现1~100之间之和&#xff08;5050 0x13BA&#xff09; .text 声明以下内容是文本段的内容 .global _start .global声明_start标签是一个全局标签_start:mov r1,#0x0 r1 summov r2,#0x1 r2 ifun: 加法函数cmp r2,#100 r2中的值和100作比较add…

理解CNN模型如何学习

深度学习模型常常被认为是不可解释的。但是人们正在探索不同的技术来解释这些模型内发生了什么。对于图像&#xff0c;由卷积神经网络学习的特征是可解释的。我们将探索两种流行的技术来理解卷积神经网络。 可视化中间层的输出 可视化中间层的输出将有助于我们理解输入图像如何…

JupyterLab使用指南(七):JupyterLab使用 LaTeX 生成数学公式

在 JupyterLab 中&#xff0c;可以使用 LaTeX 语法生成复杂的数学公式。JupyterLab 内置对 LaTeX 的支持&#xff0c;使得我们可以方便地在 notebook 中编写和展示数学公式。以下是详细的步骤和示例。 1. 使用 LaTeX 生成数学公式 LaTeX 是一种专门用于排版数学公式的语言。J…

Stable Diffusion 插件安装与推荐,助力你的AI绘图

在上一篇文章我们安装了Stable Diffusion &#xff0c;这篇文章我们来安装Stable Diffusion的插件 Stable Diffusion的插件是绘画中重要的一环&#xff0c;好的插件可以让你的绘画更加得心应手 中英双语插件 为什么要安装中英双语插件呢&#xff0c;不能只安装中文插件吗&…

安卓应用开发学习:获取导航卫星信息

一、引言 我昨天写了《安卓应用开发学习&#xff1a;获取经纬度及地理位置描述信息》日志&#xff0c;今天再接再厉&#xff0c;记录一下跟着《Android App 开发进阶与项目实战》一书&#xff0c;实现获取导航卫星信息&#xff0c;并在手机上显示的功能的情况。先上实现后的在…

Redis的持久化方式和注意点

redis持久篇 两种持久化技术&#xff1a; AOF日志和RDB快照 Redis默认会开启RBD快照 AOF:持久化只会记录写操作命令。 是一种日志&#xff0c;写入到文件&#xff0c;有相应的格式文本 就是 Redis 里的AOF(Append Only File)持久化功能&#xff0c;注意只会记录写操作命令…

决定马萨诸塞州版图的关键历史事件

决定马萨诸塞州版图的关键历史事件&#xff1a; 1. 早期探索与*民定居&#xff1a;17世纪初&#xff0c;英国清教徒为寻求宗教自由&#xff0c;乘坐“五月花号”到达新大陆&#xff0c;并于1620年在现在的普利茅斯建立了第一个永久性英国*民地。随后&#xff0c;更多的英国*民…

LKD-Net: Large Kernel Convolution Network for Single Image Dehazing

LKD-Net&#xff1a;用于单幅图像去噪的大型核卷积网络 摘要 基于深度卷积神经网络(CNN)的单幅图像去噪方法已经取得了很大的成功。以往的方法致力于通过增加网络的深度和宽度来提高网络的性能。目前的方法侧重于增加卷积核的大小&#xff0c;以受益于更大的接受野来增强其性能…

昇思25天学习打卡营第1天|新手上路

这里写自定义目录标题 打卡昇思MindSpore扫盲快速入门 打卡 昇思MindSpore扫盲 第一节基本是一个mindspore的科普扫盲。大概介绍一通mindspore的一些架构&#xff0c;feature&#xff0c;以及其对比于其他同类框架的优势。简单扫读了一遍大概有点印象直接跳过。 快速入门 这…

Vue 3 中处理文件上传和响应式更新

Vue 3 中处理文件上传和响应式更新 一、前言1.创建文件上传组件2.解释代码3.在主应用中使用文件上传组件4.总结 一、前言 在现代 web 开发中&#xff0c;文件上传是一个常见需求。本文将详细介绍如何在 Vue 3 中处理文件上传&#xff0c;并确保上传后的文件列表能够响应式更新…

如何把图片转换成pdf格式?图片转PDF方法分享

如何把图片转换成pdf格式&#xff1f;图片转换为PDF格式的重要性不言而喻。PDF文件不仅能够在各种操作系统和设备上保持一致的显示效果&#xff0c;还能确保图片内容的清晰度和质量不受损害。此外&#xff0c;PDF格式支持加密和权限设置&#xff0c;可以保护图片内容不被轻易篡…

FireFox 编译指南2024 Windows10篇-环境准备(一)

1. 引言 在开源浏览器项目中&#xff0c;Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox&#xff0c;开发者需要做好充分的环境准备工作。这不仅是编译成功的基础&#xff0c;也是后续调试、优化和二次开发的关键步骤。 编译Firefox是一个复…

深入剖析Tomcat(十二) 详解StandardContext

StandardContext是Context容器的一个标准实现&#xff0c;一般情况下&#xff0c;Tomcat都是使用StandardContext类来创建Context容器。前面讲过&#xff0c;Context容器代表了一个Web应用&#xff0c;Tomcat本身支持部署多个应用&#xff0c;相应的每个应用都会有一个Standard…

实用软件下载:ABBYY Finereader 15最新安装包及详细安装教程

数据表明FineReader PDF提供实用、简易的工具&#xff0c;将纸质文档和PDF结合起来&#xff0c;提高了数字工作场所的效率。我们都知道 即时背景识别:使不可搜索的PDF能够在工作中立即使用。值得一提的是文档转换更精准&#xff1a;OCR技术&#xff0c;它提高了PDF转换、布局保…

基于STM32的简易计算器proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的简易计算器proteus仿真设计 讲解视频1.主要功能2. 仿真3. 程序4. 设计报告5. 资料清单&下载链接 基于STM32的简易计算器proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 …

深入JVM:详解JIT即时编译器

文章目录 深入JVM&#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析&#xff08;1&#xff09;同步锁消除&#xff08;…