之前在公司与同时合作开发了一个考核系统,最后干完后整个代码也是合在了我这里,于是进行了codereview,进行优化代码,在审核这边,我先是拆分了公共代码,然后对重复的代码块进行了封装,但是审核这一块还是太过臃肿,而且不易扩展,于是就用策略模式进行了重构。
原先的审批if后续扩展审核的时候就需要再加if,回退也是同样的操作,于是我把回退与审批同时写进了策略
if (CollectionUtils.isEmpty(tApprovalProcessConfigurationList) && auditorType == 3)
if (auditorType < 3)
if (CollectionUtils.isNotEmpty(tApprovalProcessConfigurationList) && 4 == auditorType)
if (CollectionUtils.isNotEmpty(tApprovalProcessConfigurationList) && 3 == auditorType)
策略模式的介绍,大家可以百度一下,特别多,这里我就不说了
1.选定不变且唯一的参数,作为key
策略模式在上下文对象中是一个map<key, ServiceImpl>类型,于是我们就要确定这个key,根据上面的各种if我也是把auditorType审核的层级做了一个枚举
2.策略接口
定义完枚举就可以开始写策略接口了,因为我的策略主要是审核与回退于是定义了相对应的方法,还有一个方法是为了获取当前实现类的审核枚举,他是几级审核来用
3.接口实现
这里以初审人的接口为例,写一个实现接口
/*** 初审策略实现类*/
@Service
@Slf4j
public class AuditPreliminaryExaminationImpl implements AuditService {@Overridepublic AuditEnum getLevel() {return AuditEnum.PRELIMINARY_EXAMINATION;}@Overridepublic void auditIndex(String type, String deptId,Long fillTaskId, Set<Long> indexStatusIds) {// 业务代码...}@Overridepublic void rollback(String type, String deptId, TIndexStatus tIndexStatus) {// 初审人不能回退log.error("初审人不能回退");}
}
4.定义策略上下文
根据审核的接口获取所有的实现类,然后根据对应的审核等级,放入map集合中对应起来
/*** 审核策略上下文*/
@Component
public class AuditStrategyFactory implements ApplicationContextAware {private static final Map<AuditEnum, AuditService> AUDIT_MAP = new ConcurrentHashMap<>();@Overridepublic void setApplicationContext(ApplicationContext context) throws BeansException {// 获取所有的策略实现类对象Map<String, AuditService> beansOfType = context.getBeansOfType(AuditService.class);// 存入mapbeansOfType.values().forEach(bean -> AUDIT_MAP.put(bean.getLevel(), bean));}/*** 根据等级获取对应的审核实现类** @param auditEnum* @return*/public static AuditService getInstance(AuditEnum auditEnum) {return AUDIT_MAP.get(auditEnum);}
}
5.业务使用
以回退为例
// 获取对应的审核枚举
AuditEnum auditEnum = AuditEnum.getAuditEnum(e.getAuditorType());
// 通过枚举获取到对应的策略
AuditService instance = AuditStrategyFactory.getInstance(auditEnum);
// 执行策略
instance.rollback(indexRecord.getIndexRecordType(), indexRecord.getResponsibleDepartment(), e);