规则引擎通过多态统一调度条件判定器,核心是定义conditionevaluator接口并由各业务类实现matches()方法,引擎仅调用接口方法实现动态分派,避免硬编码分支。

在规则引擎中用多态统一调度不同业务条件判定器,核心是让引擎只认一个接口,而具体判定逻辑由各子类自主实现——不是引擎去判断“该用哪个”,而是每个判定器自己回答“我是否匹配”。
定义统一的条件判定接口
所有业务条件判定器必须实现同一个接口,比如 ConditionEvaluator:
- 提供 matches(ExecutionContext context) 方法,返回布尔值,表示当前规则是否适用
- 可选增加 getPriority() 或 supports(String ruleType),用于工厂或路由层做初步筛选
- 避免在接口里暴露具体业务字段(如“金额”“部门ID”),全部通过 ExecutionContext 传入,保持扩展性
各业务场景实现自己的判定器
每个业务条件(如风控额度校验、营销资格判断、审批节点准入)都写一个独立实现类:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- CreditLimitCondition:检查用户授信余额是否充足
- MemberLevelCondition:根据会员等级和活动标签判断是否可参与
- DepartmentBudgetCondition:结合部门预算池和单笔报销金额做动态拦截
- 每个类内部封装完整判定逻辑,包括查缓存、调远程服务、解析配置参数等,不向外暴露细节
规则引擎按需加载并执行判定
引擎本身不硬编码任何业务分支,而是依赖多态完成动态分派:
- 规则注册时,通过简单工厂或 Spring Bean 名称(如 "credit_limit_condition")获取对应 ConditionEvaluator 实例
- 执行时仅调用 evaluator.matches(context),无需 instanceof 或 switch 判断类型
- 若需支持组合条件(AND/OR/NOT),可让 CompositeCondition 也实现同一接口,递归调用子判定器
- 日志和监控统一打在接口方法入口,便于统计各判定器命中率、耗时、失败原因
关键约束保障多态生效
多态不是写了 implements 就自动起作用,以下几点必须满足:
- 引擎持有的引用必须是 ConditionEvaluator 类型,不能是具体子类(如不能写 CreditLimitCondition c = ...)
- 所有 matches() 方法不能是 static、private 或 final,否则无法被动态覆盖
- 子类必须真正重写该方法(不能只是新增同名方法),且签名完全一致
- 类加载路径要确保唯一,避免同名类重复引入导致反射加载错乱
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










