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

场景

设计模式-策略模式在Java中的使用示例:

设计模式-策略模式在Java中的使用示例_java 策略模式示例_霸道流氓气质的博客-CSDN博客

上面讲了策略模式在Java中的使用示例。

但是在有些场景下不需要严格的规则区分,只需要根据传递的参数以及自定义存储的处理逻辑映射,进行不同的代码逻辑。

可以借助于枚举类的使用,在static代码块中将映射关系存储,在实际业务层中根据传递参数获取对应的处理逻辑。

通过switch进行判断进行。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、首先定义枚举类

public enum EcuPrefixEnum
{
    CAR_NUM,  ECU_CAR_NUM;

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

    static
    {
        mappings.put(MineMessageEnum.JJT.getApiCode(),CAR_NUM);
        mappings.put(MineMessageEnum.ZLW.getApiCode(),ECU_CAR_NUM);
    }

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

}

这里定义了两种不同方式的枚举变量。

其中在static中初始化存储了映射关系,map中的key又是另一个枚举类,此枚举类用来存储信息用,

也可直接使用字符串写死。

mappings.put("jjt",CAR_NUM);

这里使用MineMessageEnum来存储映射关系信息。

比如需要通过apiCode来获取不同的mineCode和mineName,则可以通过

MineMessageEnum.resolve(mineApiCode).getMineCode()
MineMessageEnum.resolve(mineApiCode).getMineName()

来实现。

MineMessageEnum代码:

public enum MineMessageEnum
{
    JJT("jjt", "0001","名称1", Constants.SIFANGJI),
    ZLW("zlw", "0002","名称2",Constants.SIFANGJI),
    CCL("ccl", "0003","名称3",Constants.KEERMA);

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

    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)
    {
        this.apiCode = apiCode;
        this.mineCode = mineCode;
        this.mineName = mineName;
        this.signalRule = signalRule;
    }

    public String getApiCode() {
        return apiCode;
    }

    public String getMineCode() {
        return mineCode;
    }

    public String getMineName() {
        return mineName;
    }

    public String getSignalRule() {
        return signalRule;
    }
}

上面的Constants是一个常量类

public class Constants {

    public static final String SIFANGJI = "sifangji";
    public static final String KEERMA = "keerma";

}

下面resolve用来根据传递的参数来获取map中对应的value。

2、在实际业务中可以根据传递参数和switch进行不同的逻辑处理

    public  BusCarEcu getBusCarEcu(String carNumber,String mineCode) {
        try {
            String ecuKeyPrefix;
            switch (EcuPrefixEnum.resolve(mineCode)){
                case CAR_NUM:
                    ecuKeyPrefix = carNumber;
                    break;
                case ECU_CAR_NUM:
                    ecuKeyPrefix = Constants.ECU+carNumber;
                    break;
                default:
                    ecuKeyPrefix = Constants.ECU+carNumber;
            }
            BusCarEcu busCarEcu = redisCache.getCacheObject(ecuKeyPrefix);
            return busCarEcu;
        }catch (Exception exception){
            System.out.println("getBusCarEcu结果异常:"+exception.getMessage());
            return new BusCarEcu();
        }
    }

以上结果就是传递mineCode为jjt时则获取对应的mineCode和mineName,并且在执行getBusCarEcu业务方法时,

根据mineCode不同执行不同的业务逻辑。

猜你喜欢

转载自blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130502199