场景
设计模式-策略模式在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不同执行不同的业务逻辑。