设计模式-策略模式
测试模式在我们代码中使用频率比较高,其主要作用是解决多重判断的问题,具体代码如下:
业务类相关代码:
//根据前台传递的专项代码获取专项代码查询对应的子类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/
浙公网安备 33010602011771号