设计模式-策略模式
测试模式在我们代码中使用频率比较高,其主要作用是解决多重判断的问题,具体代码如下:
业务类相关代码:
//根据前台传递的专项代码获取专项代码查询对应的子类beanId String strategyBeanId = SpecialEnum.getName(declarationPramDTO.getZxdm()); if (StringUtils.isBlank(strategyBeanId)) { throw new BizException("所传递专项类型渠道不存在"); } DeclarationStrategy declarationStrategy = SpringUtils.getBean(strategyBeanId, DeclarationStrategy.class); if (null == declarationStrategy) { //该渠道不存在,请确认 throw new BizException("该渠道不存在,请管理员确认"); } try { return declarationStrategy.exportDeclaration(request, declarationPramDTO); }catch (Exception e){ e.printStackTrace(); throw new BizException("系统错误,请联系管理员"); }
枚举类:
根据专项代码获取对应的beanId
public enum SpecialEnum { /** 首台套 */ STT("STT","首台套"), /** 国家中小企业公共服务示范平台奖励项目 */ GJSFJL("GJSFJL","enterpriseServeAward"), /** 首台套保险 */ STTBF("sttbf","NMTInsurance") ; private String index; private String desc; SpecialEnum(String index, String desc) { this.index = index; this.desc = desc; } public String getIndex() { return index; } public void setIndex(String index) { this.index = index; } public String getName() { return desc; } public void setName(String desc) { this.desc = desc; } public static String getName(String index){ SpecialEnum[] enums = SpecialEnum.values(); for (SpecialEnum eventEnum : enums){ if (eventEnum.getIndex().equals(index)){ return eventEnum.getName(); } } return ""; } }
spring 工具类:
@Component public class SpringUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通过class获取Bean. public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
策略接口:
public interface DeclarationStrategy { /** * * @Author cyb * @Date 2020-06-23 9:53 * @param request * @param declarationPramDTO:导出申报书参数实体 * @return java.lang.String * @Exception */ String exportDeclaration(HttpServletRequest request, DeclarationPramDTO declarationPramDTO) throws Exception; }
策略子类实现:
public class EnterpriseServeAward implements DeclarationStrategy { @Override public String exportDeclaration(HttpServletRequest request, DeclarationPramDTO declarationPramDTO) { return "进入国家中小企业公共服务示范平台奖励项目专项"; } }
以上代码及为策略模式的对应相关代码,主要的是枚举中子类beanId,如果子类名称为单词组成,则首字母需小写,如果子类名称为单词简写(字母大写),则枚举中的beanId则与策略子类名称一致,不用首字母小写。获取beanId也可以将对应数据存放在数据库中进行读取,不使用枚举。
以上即为本篇博客内容,如若对以上有所以为请留言或者私聊博主,转发请说明出处,本人博客地址为:https://www.cnblogs.com/chenyuanbo/