使用策略模式重构审批

之前在公司与同时合作开发了一个考核系统,最后干完后整个代码也是合在了我这里,于是进行了codereview,进行优化代码,在审核这边,我先是拆分了公共代码,然后对重复的代码块进行了封装,但是审核这一块还是太过臃肿,而且不易扩展,于是就用策略模式进行了重构。

原先的审批if后续扩展审核的时候就需要再加if,回退也是同样的操作,于是我把回退与审批同时写进了策略

java 复制代码
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.接口实现

这里以初审人的接口为例,写一个实现接口

java 复制代码
/**
 * 初审策略实现类
 */
@Service
@Slf4j
public class AuditPreliminaryExaminationImpl implements AuditService {

    @Override
    public AuditEnum getLevel() {
        return AuditEnum.PRELIMINARY_EXAMINATION;
    }

    @Override
    public void auditIndex(String type, String deptId,Long fillTaskId, Set<Long> indexStatusIds) {
        // 业务代码
        ...
    }

    @Override
    public void rollback(String type, String deptId, TIndexStatus tIndexStatus) {
        // 初审人不能回退
        log.error("初审人不能回退");
    }
}

4.定义策略上下文

根据审核的接口获取所有的实现类,然后根据对应的审核等级,放入map集合中对应起来

java 复制代码
/**
 * 审核策略上下文
 */
@Component
public class AuditStrategyFactory implements ApplicationContextAware {

    private static final Map<AuditEnum, AuditService> AUDIT_MAP = new ConcurrentHashMap<>();

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        // 获取所有的策略实现类对象
        Map<String, AuditService> beansOfType = context.getBeansOfType(AuditService.class);
        // 存入map
        beansOfType.values().forEach(bean -> AUDIT_MAP.put(bean.getLevel(), bean));
    }

    /**
     * 根据等级获取对应的审核实现类
     *
     * @param auditEnum
     * @return
     */
    public static AuditService getInstance(AuditEnum auditEnum) {
        return AUDIT_MAP.get(auditEnum);
    }
}

5.业务使用

以回退为例

java 复制代码
// 获取对应的审核枚举
AuditEnum auditEnum = AuditEnum.getAuditEnum(e.getAuditorType());
// 通过枚举获取到对应的策略
AuditService instance = AuditStrategyFactory.getInstance(auditEnum);
// 执行策略
instance.rollback(indexRecord.getIndexRecordType(), indexRecord.getResponsibleDepartment(), e);
                   
相关推荐
南风聊AI3 小时前
从单体LLM到多Agent协作,如何用AI重构内容生产SOP
人工智能·chatgpt·重构
usrcnusrcn3 小时前
告别靠天吃饭!有人工业物联网重构农业灌溉
物联网·重构
xinyaozixun3 小时前
闪极loomos系列AI眼镜重磅发布,重构日常佩戴体验,再次引领智能穿戴赛道
人工智能·重构
辣机小司5 小时前
【踩坑记录:EasyExcel 生产级实战:策略模式重构与防御性导入导出校验指南(实用工具类分享)】
java·spring boot·后端·重构·excel·策略模式·easyexcel
无代码专家1 天前
无代码:重构企业数字化转型的效率逻辑
大数据·人工智能·低代码·重构
yugi9878381 天前
基于Takens嵌入定理和多种优化算法的混沌序列相空间重构MATLAB实现
算法·matlab·重构
山风wind1 天前
设计模式-策略模式详解
设计模式·策略模式
乾元1 天前
当网络变成博弈场:混合云时代,如何用 AI 重构跨域链路的成本与体验平衡
运维·网络·人工智能·网络协议·安全·华为·重构
龙亘川1 天前
大模型重构政务热线:技术架构、场景落地与实战案例全解析
重构·架构·政务
说私域1 天前
社群经济视域下智能名片链动2+1模式商城小程序的商业价值重构
人工智能·小程序·重构·开源