首页 > 其他分享 >SpringBoot中使用枚举类、switch、常量类(声明并初始化map)实现类策略者模式,接口返回常量数据

SpringBoot中使用枚举类、switch、常量类(声明并初始化map)实现类策略者模式,接口返回常量数据

时间:2023-05-24 10:56:55浏览次数:53  
标签:map 常量 SIGNAL public switch static final Constants String

场景

SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130503707

SpringBoot+@Validate+全局异常拦截实现自定义规则参数校验(校验get请求参数不能为空且在指定枚举类型中):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130605437

Java中使用枚举类和switch实现映射存储的类似策略模式实现定制化流程:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130502199

在上面几篇文章的基础上,实现提供一个接口根据请求参数不同返回对应固定的常量值。

比如接口请求需要提供请求码,根据请求码查询对应的策略,并返回常量类中声明和初始化的字符串常量和Map常量。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、新建枚举类存储请求码与不同对象的策略关系

package com.badao.demo.enums;

import com.badao.demo.constant.Constants;
import org.springframework.lang.Nullable;

import java.util.HashMap;
import java.util.Map;

public enum MineMessageEnum
{
    ZLW("zlw", "0001","badao1",Constants.SIFANGJISIGNAL,null),
    JJT("jjt", "0002","badao2", Constants.SIFANGJISIGNAL,null),
    CCL("ccl", "0005","badao3",Constants.KEERMASIGNAL,Constants.KEERMATURNOUT);

    private final String apiCode;
    private final String mineCode;
    private final String mineName;
    private final String signalRule;
    private final String turnoutRule;

    private static final Map<String, MineMessageEnum> mappings = new HashMap<>();

    static
    {
        for (MineMessageEnum messageEnum : values())
        {
            mappings.put(messageEnum.apiCode, messageEnum);
        }
    }

    @Nullable
    public static MineMessageEnum resolve(@Nullable String mineApiCode)
    {
        return (mineApiCode != null ? mappings.get(mineApiCode) : null);
    }

    MineMessageEnum(String apiCode, String mineCode, String mineName,String signalRule,String turnoutRule)
    {
        this.apiCode = apiCode;
        this.mineCode = mineCode;
        this.mineName = mineName;
        this.signalRule = signalRule;
        this.turnoutRule = turnoutRule;
    }

    public String getApiCode() {
        return apiCode;
    }

    public String getMineCode() {
        return mineCode;
    }

    public String getMineName() {
        return mineName;
    }

    public String getSignalRule() {
        return signalRule;
    }

    public String getTurnoutRule() {
        return turnoutRule;
    }
}

这里存储请求码apiCode与不用业务类型signalRule的对应关系。

这里的signalRule使用常量类存储

package com.badao.demo.constant;

import java.util.HashMap;
import java.util.Map;

public class Constants {

    //枚举类常量
    public static final String SIFANGJISIGNAL = "sifangjiSignal";
    public static final String KEERMASIGNAL = "keermaSignal";

    //字典值常量
    public static final String VEHICLE_TYPE_DICT_TYPE = "vehicle_type";
    public static final String VEHICLE_TYPE_DICT_DESC = "车辆类型";
    public static final String SIGNAL_STATE_DICT_TYPE = "signal_state";
    public static final String SIGNAL_STATE_DICT_DESC = "信号灯状态";
    public static final String SIGNAL_MODEL_DICT_TYPE = "signal_state";
    public static final String SIGNAL_MODEL_DICT_DESC = "信号灯模式";

    public static final Map<String,String> SIFANGJI_SIGNAL_STATE_MAP = new HashMap<String,String>(){{
        put("0","绿灯");
        put("1","红灯");
    }};

    public static final Map<String,String> SIFANGJI_SIGNAL_MODEL_MAP = new HashMap<String,String>(){{
        put("0","就地模式");
        put("1","集控模式");
    }};

    public static final Map<String,String> KEERMA_SIGNAL_STATE_MAP = new HashMap<String,String>(){{
        put("0","掉线");
        put("1","红");
        put("2","绿");
        put("3","黄");
    }};
}

其中声明了字典值的常量类,使用Map进行存储并初始化。

2、接口请求时传递apiCode并校验,具体流程参考上面博客

    @AccessLimit(seconds = 10,maxCount = 2)
    @GetMapping("/dict_values")
    public AjaxResult getDictValues(@Validated MyRequestParams requestParams)
    {
        String mineApiCode = requestParams.getMineApiCode();
        MineMessageEnum resolve = MineMessageEnum.resolve(mineApiCode);
        List<DictDTO> dictDtoList = snDataUploadService.getDictDtoList(resolve);
        return AjaxResult.success(dictDtoList);
    }

然后再service的实现中

    @Override
    public List<DictDTO> getDictDtoList(MineMessageEnum resolve) {
        List<DictDTO> dictDTOList = new ArrayList<>();
        dictDTOList.add(commonServiceUtils.getCarTypeDictMap());
        dictDTOList = commonServiceUtils.getSignalDictMap(resolve,dictDTOList);
        dictDTOList = commonServiceUtils.getTurnoutDictMap(resolve,dictDTOList);
        return  dictDTOList;
    }

封装了不用类型数据的获取

找一个示例

    public List<DictDTO> getSignalDictMap(MineMessageEnum resolve,List<DictDTO> dictDTOList){
        DictDTO signalStateDictDTO = DictDTO.builder().dictType(Constants.SIGNAL_STATE_DICT_TYPE).dictDescription(Constants.SIGNAL_STATE_DICT_DESC).build();
        DictDTO signalModelDictDTO = DictDTO.builder().dictType(Constants.SIGNAL_MODEL_DICT_TYPE).dictDescription(Constants.SIGNAL_MODEL_DICT_DESC).build();
        if(null == resolve.getSignalRule()){
            signalStateDictDTO.setDictMaps(new HashMap<>());
            signalModelDictDTO.setDictMaps(new HashMap<>());
        }else{
            switch (resolve.getSignalRule()){
                case Constants.SIFANGJISIGNAL:
                    signalStateDictDTO.setDictMaps(Constants.SIFANGJI_SIGNAL_STATE_MAP);
                    signalModelDictDTO.setDictMaps(Constants.SIFANGJI_SIGNAL_MODEL_MAP);
                    break;
                case Constants.KEERMASIGNAL:
                    signalStateDictDTO.setDictMaps(Constants.KEERMA_SIGNAL_STATE_MAP);
                    signalModelDictDTO.setDictMaps(Constants.KEERMA_SIGNAL_MODEL_MAP);
                    break;
                default:
                    signalStateDictDTO.setDictMaps(new HashMap<>());
                    signalModelDictDTO.setDictMaps(new HashMap<>());
            }
        }
        dictDTOList.add(signalStateDictDTO);
        dictDTOList.add(signalModelDictDTO);
        return dictDTOList;
    }

3、比如这里接口是返回固定的字典值,所以封装一个实体类,包含字典类型、字典描述、字典值Map

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DictDTO {
    private String dictType;
    private String dictDescription;
    private Map<String,String> dictMaps;
}

运行效果

 

传递不同参数的效果

 

标签:map,常量,SIGNAL,public,switch,static,final,Constants,String
From: https://www.cnblogs.com/badaoliumangqizhi/p/17427362.html

相关文章

  • R语言如何做马尔可夫转换模型markov switching model|附代码数据
    全文链接:http://tecdat.cn/?p=6962最近我们被客户要求撰写关于马尔可夫转换模型的研究报告,包括一些图形和统计输出。假设有时间序列数据,如下所示。经验表明,目标变量y似乎与解释变量x有关。然而,乍一看,y在水平中间波动,所以它似乎并不总是有稳定的关系(背后有多个状态)上面的样本......
  • 万字长文之HashMap源码解析(包含红黑树)
    〇、储备知识之红黑树0.1>2-3树红黑树是一种自平衡的二叉树,它可以避免二分搜索树在极端的情况下蜕化成链表的情况。那么什么是红黑树呢?要想便于了解红黑树,我们先了解一下跟它息息相关的2-3树。2-3树是一种绝对平衡的多叉树,在这棵树中,任意一个节点,它的左右子树的高度是相同的。如下......
  • map判断是否存在某个key,以及遍历jsonobject
    if(filter.containsKey("nodeData")){JSONObjectjsonObject=(JSONObject)filter.get("nodeData");Iteratoriterator=jsonObject.keySet().iterator();while(iterator.hasNext()){Stri......
  • 为什么 HashMap 会死循环?
    HashMap死循环发生在JDK1.8之前的版本中,它是指在并发环境下,因为多个线程同时进行put操作,导致链表形成环形数据结构,一旦形成环形数据结构,在get(key)的时候就会产生死循环。如下图所示:死循环原因HashMap导致死循环的原因是由以下条件共同导致的:HashMap使用头插法进......
  • MapReduce和Yarn原理
    MapReduce原理 问题1.什么是计算,什么是分布式计算?答案:计算指的是从海量数据中提取出有效的价值信息的过程(广义上解释),狭义上指的是1+1=2即:数学运算.分布式计算指的是多台机器协调,共同完成同1个计算任务.问题2:分布式计算的两种模式?答案:分散汇......
  • iOS 缩放等级 Set the Zoom Level of an MKMapView
    SettheZoomLevelofanMKMapViewhttp://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/IfyouhaveeverbuiltawebapplicationusingtheGoogleMapsAPI,youarelikelyintimatelyfamiliarwiththislineofcode:map.set......
  • springboot 接入通用tkmapper和pagehelper,boot starter版,mysql5.7,boot2.7.9
    1、pom文件引入<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency><dependency><groupId......
  • FreeSWITCH1.10.5源码编译(CentOS 7.10)
    一、安装sofia-sipcd/usr/local/src/freeswitch-1.10.5.-releasegitclonehttps://github.com/freeswitch/sofia-sip.gitcdsofia-sip./configuremakemakeinstallldconfig二、安装spandspcd/usr/local/src/freeswitch-1.10.5.-releasegitclonehttps://github.......
  • ConcurrentHashMap 相关
    为什么ConcurrentHashMap要放弃分段锁?答:1、因为在JDK7中 Segment 继承了重入锁ReentrantLock。在每个 Segment 在增长的时候,这时候锁的粒度也会在不断的增长。每个锁控制的是一段,当分段很多,并且加锁的分段不连续的时候,内存空间的浪费比较严重。在并发操作中,因为分段锁的......
  • 若依框架当参数为Map集合时数据权限的设置
    1、controller接口参数类型@PreAuthorize("@ss.hasPermi('manual:staff:list')")@GetMapping("/list")publicTableDataInfolist(@RequestParamMap<String,Object>map){map.put("params",newParmStaffCostManu......