工厂模式+策略模式实现题目模块的录入

一、需求如下:

          我现在要录入题目,但是要进行分类,有单选题,多选题,判断题,简答题。

二、问题:

          代码业务需要多次if -else 去判断题目的类型,过于繁琐。以及后续业务可能拓展题型,这样后续代码需要重构。

          所以采用工厂加策略模式去设计,只要传入题目的类型就去使用工厂模式去调用对应的题目策略。

三、什么是工厂模式?

建立一个工厂,能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程,这就是简单工厂的主要功能。

比方如下图:客户需要一辆宝马,具体的简单工厂会根据用户的实际需求去生产对应型号的宝马,最后返回客户需要的宝马产品

工厂模式+策略模式实现题目模块的录入_第1张图片

   四、什么是策略模式

主要指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

在实际的代码中,外卖平台上的某家店铺为了促销,设置了多种会员优惠,其中包含超级会员折扣8折、普通会员折扣9折和普通用户没有折扣三种,也就是针对不同的会员有不同的优惠力度。

   工厂模式+策略模式实现题目模块的录入_第2张图片五、工厂加策略实现题目的录入

一、定义一个接口:SubjectTypeHandler

public interface SubjectTypeHandler {

    /**
     * 枚举身份的识别
     */
    SubjectInfoTypeEnum getHandlerType();

    /**
     * 实际的题目的插入
     */
    void add(SubjectInfoBO subjectInfoBO);

    /**
     * 实际的题目的插入
     */
    SubjectOptionBO query(int subjectId);

}

二、实现接口 RadioTypeHandler 单选题。其他类型也一样

public class RadioTypeHandler implements SubjectTypeHandler {

    @Resource
    private SubjectRadioService subjectRadioService;

    @Override
    public SubjectInfoTypeEnum getHandlerType() {
        return SubjectInfoTypeEnum.RADIO;
    }

    @Override
    public void add(SubjectInfoBO subjectInfoBO) {
        //单选题目的插入
      ***
    }

 
}

三、定义个工厂类SubjectTypeHandlerFactory

@Component
public class SubjectTypeHandlerFactory implements InitializingBean {
    /**
     * 把实现接口的类注入进来
     */
    @Resource
    private List subjectTypeHandlerList;

    private Map handlerMap = new HashMap<>();
    //获取到对应的类
    public SubjectTypeHandler getHandler(int subjectType) {
        SubjectInfoTypeEnum subjectInfoTypeEnum = SubjectInfoTypeEnum.getByCode(subjectType);
        return handlerMap.get(subjectInfoTypeEnum);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        for (SubjectTypeHandler subjectTypeHandler : subjectTypeHandlerList) {
            handlerMap.put(subjectTypeHandler.getHandlerType(), subjectTypeHandler);
        }
    }

}

四、主方法调用

   //加载到对应的方法
SubjectTypeHandler handler = 
                subjectTypeHandlerFactory.getHandler(subjectInfo.getSubjectType());
   //调用对应的方法
handler.add(subjectInfoBO);

你可能感兴趣的:(策略模式)