设计模式-策略模式

测试模式在我们代码中使用频率比较高,其主要作用是解决多重判断的问题,具体代码如下:

业务类相关代码:

//根据前台传递的专项代码获取专项代码查询对应的子类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/

原文地址:https://www.cnblogs.com/chenyuanbo/p/13190638.html