Bootstrap

工厂+策略模式

工厂+策略模式 实现不同等级不同处理方式

(一)应用背景介绍

在软件开发中,工厂模式和策略模式常常结合使用,特别适用于根据不同情况选择不同的处理方式的场景。举例来说,假设您正在开发一个考试系统,系统中有不同类型的题目,如选择题、填空题、判断题等,每种题目类型需要不同的处理方式。

(二)设计策略类

根据要求,用户具有不同的题目类型,在处理题目时需要根据题目类型享受对应的处理策略,而后面是具体业务在不同变动时新增的内容,可以在具体的策略中去单独操作或在外围确定题目类型后进行基本的处理。

总之,从基本操作上来看,处理题目的行为是必然存在的,不同的题目类型在对应不同的变动下需要采取具体的处理策略,所以,可以确定一个基本的接口来表达具体要处理题目的行为,不同题目类型对具体处理策略的实现放在对应的实现类中做处理:

1.定义一个题目查入接口
public interface SubjectTypeHandler {
/**
 * 枚举身份的识别
 */
SubjectInfoTypeEnum getHandlerType();

/**
 * 实际的题目的插入
 */
void add(SubjectInfoBO subjectInfoBO);
}
2.不同题目类型对应策略类

@Component
public class BriefTypeHandler implements SubjectTypeHandler{

    @Resource
    private SubjectBriefService subjectBriefService;
    
    @Override
    public SubjectInfoTypeEnum getHandlerType() {
        return SubjectInfoTypeEnum.BRIEF;
    }

    @Override
    public void add(SubjectInfoBO subjectInfoBO) {
        SubjectBrief subjectBrief = BriefSubjectConverter.INSTANCE.convertBoToEntity(subjectInfoBO);
        subjectBrief.setSubjectId(subjectInfoBO.getId().intValue());
        subjectBrief.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode());
        subjectBriefService.insert(subjectBrief);
    }

}

@Component
public class JudgeTypeHandler implements SubjectTypeHandler{

    @Resource
    private SubjectJudgeService subjectJudgeService;
    
    @Override
    public SubjectInfoTypeEnum getHandlerType() {
        return SubjectInfoTypeEnum.JUDGE;
    }

    @Override
    public void add(SubjectInfoBO subjectInfoBO) {
        //判断题目的插入
        SubjectJudge subjectJudge = new SubjectJudge();
        SubjectAnswerBO subjectAnswerBO = subjectInfoBO.getOptionList().get(0);
        subjectJudge.setSubjectId(subjectInfoBO.getId());
        subjectJudge.setIsCorrect(subjectAnswerBO.getIsCorrect());
        subjectJudge.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode());
        subjectJudgeService.insert(subjectJudge);
    }


}

...........

(三)设计对应的简单工厂模式

为了方便我们获取题目处理服务的各个策略类,我们创建一个工厂类来实现针对不同的题目类型实现对应的处理策略,具体如下:

@Component
public class SubjectTypeHandlerFactor implements InitializingBean {

    @Resource
    private List<SubjectTypeHandler> subjectTypeHandlerList;

    private Map<SubjectInfoTypeEnum,SubjectTypeHandler> subjectInfoTypeEnumSubjectTypeHandlerHashMap = new HashMap<>();


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

    public SubjectTypeHandler getHandler(int subjectType) {
        SubjectInfoTypeEnum subjectInfoTypeEnum = SubjectInfoTypeEnum.getByCode(subjectType);
        return subjectInfoTypeEnumSubjectTypeHandlerHashMap.get(subjectInfoTypeEnum);
    }

}

(四)具体实现应用测试如下

        SubjectTypeHandler handler = subjectTypeHandlerFactory.getHandler(subjectInfo.getSubjectType());
        subjectInfoBO.setId(subjectInfo.getId());
        handler.add(subjectInfoBO);
;