泛型+函数式接口重构动态审批流拦截器,将条件判断与动作执行解耦为可注册、可组合、类型安全的函数拓扑;定义Interceptor<I,O,E>统一接口支持checked异常,通过泛型擦除规避与ConcurrentHashMap协作时的类型丢失,并借助枚举key、链式组合及Spring Bean管理实现高内聚低耦合的审批流程。

用泛型方法 + 函数式接口重构动态审批流拦截器,核心是把“条件判断+动作执行”从硬编码分支里抽离出来,变成可注册、可组合、类型安全的函数拓扑。不改原有流程骨架,只替换掉满屏 if-else 和 switch-case 的胶水逻辑。
定义统一的泛型拦截器接口
避免每个拦截器都写一套参数和异常处理,用一个泛型函数式接口约束输入、输出与异常边界:
- interface Interceptor<I, O, E extends Exception> { O intercept(I input) throws E; }
- I 是上下文对象(如 ApprovalContext),O 是拦截结果(如 ApprovalDecision),E 是业务异常(如 ApprovalRuleException)
- 比 Function<I, O> 更实用——它天然支持 checked exception,避免到处 try-catch 或强转 RuntimeException
- 所有具体拦截器实现该接口,例如:new Interceptor<OrderApprovalReq, Boolean, RuleViolationException>() { ... }
构建类型安全的拦截器注册与分发拓扑
用 ConcurrentHashMap<String, Interceptor> 替代 switch(type),但关键在于泛型擦除下的类型保全:
- 注册时不丢失泛型信息:handlers.put("PO_APPROVAL", (Interceptor<PoContext, Boolean, Exception>) (ctx -> validatePoAmount(ctx)))
- 封装泛型 dispatch 方法:public <I, O, E extends Exception> O dispatch(String type, I input, Interceptor<I, O, E> fallback)
- 调用时由 input 类型自动推导 I,由 lambda 返回值推导 O,编译器全程校验,不会出现 ClassCastException
- key 推荐用枚举(如 ApprovalType.PO、ApprovalType.LEAVE),比字符串更安全、可导航、易重构
组合多个拦截器形成链式拓扑
真实审批流不是单点判断,而是“金额校验→部门权限→历史逾期检查→风控模型打分”的线性或分支拓扑:
- 用 Function<I, I> 封装“增强上下文”操作(如补充用户角色、加载历史数据)
- 用 BiFunction<I, O, O> 实现“结果聚合”,比如前序拦截器返回 true,后序才执行;或多个拦截器结果做 AND/OR 合并
- 示例链式调用:chain.apply(context).andThen(amtInterceptor).andThen(roleInterceptor).apply(context)
- Spring 环境下可将每个 Interceptor 声明为 @Bean,并用 @Qualifier("poAmountValidator") 注入,便于配置化启用/禁用
对接规则引擎与外部决策服务
泛型拦截器可作为规则引擎(如 Easy Rules)或 LLM Agent 的适配层,统一收口输入输出协议:
- Interceptor<ApprovalContext, Decision, RuleEngineException> 可包装 Easy Rules 的 RulesEngine.execute(facts)
- 也可对接 Agent 调用:return agent.invoke(context.toPrompt()).map(Decision::fromJson).orElseThrow(...)
- Facts 对象本身可作为泛型 I 的实现,让拦截器既兼容轻量规则,也承载复杂语义上下文
- 异常统一包装为 ApprovalException,上层无需关心是规则不匹配、Agent 超时还是风控服务熔断


















