场景
设计模式-策略模式在Java中的使用示例:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127622238
上面讲了策略模式在Java中的使用示例。
下面看一个在SpringBoot中的实际使用示例。
业务场景:
有多个煤矿,信号灯有多个厂家/规则,每个煤矿对应一种信号灯。
需要编写通用接口,根据传递的请求码不同获取到该煤矿对应的信号灯规则,并执行对应的信号灯规则获取数据。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
1、新建信号灯规则接口类
public interface SignalLightRules { List<SignalrightDevsDTO> getSignalrightDevsDtoList(String mineApiCode); }
其中方法getSignalrightDevsDtoList是用来获取信号灯信息。
2、新建厂家1/规则1的实现类
@Component(Constants.SIFANGJI) public class SiFangJiSignalLightRules implements SignalLightRules{ @Autowired private SNDataUploadServiceImpl snDataUploadService; @Autowired private BusSignallightControlService busSignallightControlService; @Override public List<SignalrightDevsDTO> getSignalrightDevsDtoList(String mineApiCode) { //获取所有信号灯id List<Long> signalLightIdList = busSignallightControlService.selectBusSignallightControlIdList(); List<SignalrightDevsDTO> signalrightDevsDtoList = snDataUploadService.getSignalrightDevsDtoList(signalLightIdList,mineApiCode); return signalrightDevsDtoList; } }
注意这里添加注解
@Component(Constants.SIFANGJI)
并且名称使用了常量类的常量。
附常量类
public class Constants { public static final String SIFANGJI = "sifangji"; public static final String KEERMA = "keerma"; }
然后在具体获取信号灯数据的方法中调用的两个service都是跟本厂家/规则具体业务相关。
3、新建厂家2/规则2的实现类
@Component(Constants.KEERMA) public class KeErMaSignalLightRules implements SignalLightRules{ @Override public List<SignalrightDevsDTO> getSignalrightDevsDtoList(String mineApiCode) { return new ArrayList<>(); } }
这里具体业务实现直接返回一个空list。
4、新建信号灯工厂类,用来获取对应的信号灯规则
@Component public class SignalLightRulesFactory { //Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id 即前面@Component注解指定的名称,value值则为对应的策略实现类 @Autowired Map<String,SignalLightRules> signalLightRulesStrategy; private static final SignalLightRules DEFAULT_RULES = new SiFangJiSignalLightRules(); public SignalLightRules getSignalLightRules(String signalLightKey){ SignalLightRules signalLightRules = signalLightRulesStrategy.get(signalLightKey); return signalLightRules == null?DEFAULT_RULES:signalLightRules; } }
注意这里添加@Component注解,并且在存储规则的map上添加@Autowired,
Spring会自动将Strategy接口的实现类注入到这个Map中,key为bean id 即前面@Component注解指定的名称,
value值则为对应的策略实现类。
5、不同的煤矿使用的信号灯规则可能相同也可能不同,所以需要配置一个煤矿与信号灯规则的映射关系的存储。
import com.badao.demo.constant.Constants; import org.springframework.lang.Nullable; import java.util.HashMap; import java.util.Map; 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; } }
这里使用枚举类来实现,存储apiCode与signalRule的对应关系。
然后再static静态代码块中初始化,将所有的映射关系存储进map,并且提供一个根据key获取value的方法。
6、在实际业务Controller层中
@GetMapping("/signalright_devs") public AjaxResult SignalRightDevs(@RequestParam("mineApiCode") String mineApiCode) { try{ MineMessageEnum resolve = MineMessageEnum.resolve(mineApiCode); if(null == resolve){ return AjaxResult.error(HttpStatus.BAD_REQUEST, Constants.NO_API_CODE); }else { SignalLightRules signalLightRules = signalLightRulesFactory.getSignalLightRules(resolve.getSignalRule()); List<SignalrightDevsDTO> signalrightDevsDTOS = signalLightRules.getSignalrightDevsDtoList(mineApiCode); if(null != signalrightDevsDTOS && signalrightDevsDTOS.size()>0){ return AjaxResult.success(signalrightDevsDTOS); }else { return AjaxResult.success(); } } }catch (Exception exception){ System.out.println("SignalRightDevs:"+exception.getMessage()); return AjaxResult.error(HttpStatus.ERROR,Constants.SERVER_ERROR); } }
首先接口传递apiCode参数,并且判断是否为合法参数,如果不存在则返回自定义错误提示。
存在则获取对应的信号灯规则,通过
signalLightRulesFactory.getSignalLightRules(resolve.getSignalRule());
获取具体规则,注意上面注入信号灯工厂。
@Autowired private SignalLightRulesFactory signalLightRulesFactory;
7、测试
传递规则1对应的apicode,返回对应业务规则数据
传递规则2对应的apicode,返回空数据
传递非法参数
标签:传参,return,策略,模式,信号灯,mineApiCode,public,Constants,String From: https://www.cnblogs.com/badaoliumangqizhi/p/17373701.html