场景
设计模式-策略模式在Java中的使用示例:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127622238
上面讲了策略模式在Java中的使用示例。
但是在有些场景下不需要严格的规则区分,只需要根据传递的参数以及自定义存储的处理逻辑映射,进行不同的代码逻辑。
可以借助于枚举类的使用,在static代码块中将映射关系存储,在实际业务层中根据传递参数获取对应的处理逻辑。
通过switch进行判断进行。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
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不同执行不同的业务逻辑。