场景: 在对试题进行添加的时候,而试题有多种类型(单选,多选,判断,简答)
表的设计:题目信息表,单选题表,多选题表,判断表,简答表,关联表
这个时候可以使用工厂加策略的模式来实现
一个工厂 包含四种类型 根据题目的类型 自动映射做处理
首先定义一个枚举类
/***
* 题目类型枚举
* 1单选 2多选 3判断 4简答
*/
public enum SubjectInfoTypeEnum {
RADIO(1,"单选"),
MULTIPLE(2,"多选"),
JUDGE(3,"判断"),
BRIEF(4,"简答");
private int code;
private String desc;
SubjectInfoTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static SubjectInfoTypeEnum getEnum(int code) {
for (SubjectInfoTypeEnum resultCodeEnum : SubjectInfoTypeEnum.values()) {
if (resultCodeEnum.getCode() == code) {
return resultCodeEnum;
}
}
return null;
}
}
然后定义一个试题类型的handler
获取处理类型,返回一个枚举类型SubjectInfoTypeEnum。
getHandlerType()方法用于返回身份枚举类型。
add(SubjectInfoBO subjectInfoBO)方法用于添加试题,参数为一个试题信息对象。
public interface SubjectTypeHandler {
/**
* 枚举身份的识别
* @return
*/
SubjectInfoTypeEnum getHandlerType();
/**
* 试题添加
* @param subjectInfoBO
*/
void add(SubjectInfoBO subjectInfoBO);
}
然后创建一个题目工厂类
/**
* 题目类型工厂
*
* 用于根据题目类型获取对应的题目类型处理器。其中,subjectTypeHandlerList是所有题目类型处理器的列表,
* handlerMap是用于存储题目类型与处理器映射关系的哈希表。getHandler方法根据题目类型获取对应的处理器,
* afterPropertiesSet方法在所有依赖属性被设置完成后调用,用于初始化handlerMap。
*/
@Component
public class SubjectTypeHandlerFactory implements InitializingBean {
@Resource
private List<SubjectTypeHandler> subjectTypeHandlerList;
private Map<SubjectInfoTypeEnum, SubjectTypeHandler> handlerMap = new HashMap<>();
public SubjectTypeHandler getHandler(int subjectType){
SubjectInfoTypeEnum subjectInfoTypeEnum = SubjectInfoTypeEnum.getEnum(subjectType);
return handlerMap.get(subjectInfoTypeEnum);
}
/**
* 初始化
* 用于在Bean的所有依赖属性被设置完成后调用
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
for (SubjectTypeHandler subjectTypeHandler : subjectTypeHandlerList){
handlerMap.put(subjectTypeHandler.getHandlerType(), subjectTypeHandler);
}
}
}
实现几个策略类
以 单选 和 多选为例 (往后拓展即可) 添加策略类即可
RadioTypeHandler 实现 SubjectTypeHandler 中的方法
/**
* 单选题目的策略类
*/
@Component
public class RadioTypeHandler implements SubjectTypeHandler{
@Resource
private SubjectRadioService subjectRadioService;
@Override
public SubjectInfoTypeEnum getHandlerType() {
return SubjectInfoTypeEnum.RADIO;
}
@Override
public void add(SubjectInfoBO subjectInfoBO) {
//单选题目的插入
//todo
}
}
/**
* 多选题目的策略类
*/
@Component
public class MultipleTypeHandler implements SubjectTypeHandler{
@Resource
private SubjectMultipleService subjectMultipleService;
@Override
public SubjectInfoTypeEnum getHandlerType() {
return SubjectInfoTypeEnum.MULTIPLE;
}
/**
* 添加多选题目的业务逻辑
* @param subjectInfoBO
*/
@Override
public void add(SubjectInfoBO subjectInfoBO) {
//多选题目的插入
//todo
}
}
业务中使用
//根据试题信息对象中的试题类型,获取一个对应的试题类型处理器。
SubjectTypeHandler handler = subjectTypeHandlerFactory.getHandler(subjectInfoBO.getSubjectType());
//
subjectInfoBO.setId(subjectInfo.getId());
//使用获取到的试题类型处理器添加试题信息对象。
handler.add(subjectInfoBO);