1. 策略+工厂实现相同业务抽象
策略模式:一种解耦的方法,它对算法进行封装,使得算法的调用和算法本身分离。使用策略模式客户端代码不需要调整,算法之间可以互相替换,因为不同的算法实现的是同一个接口。策略模式是一种对象行为型模式。策略模式符合“开闭原则”。
1.1 定义策略接口
将成员的业务方法抽象为统一的策略接口。其中 InitializingBean 接口来自Spring框架,用于实现环境的统一工厂。
public interface SubjectTypeHandler {
/**
* 枚举身份的识别
*/
SubjectInfoTypeEnum getHandlerType();
/**
* 实际的题目的插入
*/
void add(SubjectInfoBO subjectInfoBO);
/**
* 实际的题目的查询
*/
SubjectOptionBO query(int subjectId);
}
1.2 实现策略工厂
此处的工厂即策略模式下的 “环境类” 要素,功能为根据不同的name找到其对应的不同的策略实现,实现方法为将实现NameHandler接口的类都装载到strategyMap里,除使用工厂实现外,也可以使用枚举+代理实现。
@Component
public class SubjectTypeHandlerFactory implements InitializingBean {
@Resource
private List<SubjectTypeHandler> subjectTypeHandlerList;
private Map<SubjectInfoTypeEnum, SubjectTypeHandler> handlerMap = new HashMap<>();
public SubjectTypeHandler getHandler(int subjectType){
SubjectInfoTypeEnum byCode = SubjectInfoTypeEnum.getByCode(subjectType);
return handlerMap.get(byCode);
}
@Override
public void afterPropertiesSet() throws Exception {
for (SubjectTypeHandler subjectTypeHandler : subjectTypeHandlerList) {
handlerMap.put(subjectTypeHandler.getHandlerType(), subjectTypeHandler);
}
}
}
1.3 为各成员实现各自的具体策略实现类
将各自的不同实现类声明为组件(用于维护工厂),org.springframework.beans.factory.InitializingBean#afterPropertiesSet内部实现工厂注册。
/**
* 单选题目的策略类
*
*/
@Component
public class RadioTypeHandler implements SubjectTypeHandler {
@Resource
private SubjectRadioService subjectRadioService;
@Override
public SubjectInfoTypeEnum getHandlerType() {
return SubjectInfoTypeEnum.RADIO;
}
@Override
public void add(SubjectInfoBO subjectInfoBO) {
//单选题目的插入
List<SubjectRadio> subjectRadioList = new LinkedList<>();
subjectInfoBO.getOptionList().forEach(option -> {
SubjectRadio subjectRadio = RadioSubjectConverter.INSTANCE.convertBoToEntity(option);
subjectRadio.setSubjectId(subjectInfoBO.getId());
subjectRadio.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode());
subjectRadioList.add(subjectRadio);
});
subjectRadioService.batchInsert(subjectRadioList);
}
@Override
public SubjectOptionBO query(int subjectId) {
SubjectRadio subjectRadio = new SubjectRadio();
subjectRadio.setSubjectId(Long.valueOf(subjectId));
List<SubjectRadio> result = subjectRadioService.queryByCondition(subjectRadio);
List<SubjectAnswerBO> subjectAnswerBOList = RadioSubjectConverter.INSTANCE.convertEntityToBoList(result);
SubjectOptionBO subjectOptionBO = new SubjectOptionBO();
subjectOptionBO.setOptionList(subjectAnswerBOList);
return subjectOptionBO;
}
}
public class MultipleTypeHandler implements SubjectTypeHandler
......
经过改造,后面如果新增成员或者新功能实现,新增策略实现即可。这种改造符合开闭原则,适用较为复杂的逻辑判断。
标签:SubjectInfoTypeEnum,取代,策略,实现,模式,else,subjectRadio,public From: https://www.cnblogs.com/chillymint/p/18113309