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

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










