多态是规则引擎实现“即插即用”的核心机制:通过统一接口(如Rule)和运行时动态绑定,支持新增规则无需修改主流程;配合工厂或配置驱动解耦规则选择,避免static/final/private导致的多态失效。

Java 中多态是构建灵活业务规则引擎的底层支撑,不是锦上添花的语法糖,而是让规则“即插即用”的关键设计杠杆。
统一契约:所有规则必须实现同一接口或继承同一基类
规则引擎要能动态加载、调度和替换规则,前提是所有规则对外呈现一致的能力。比如定义:
-
Rule 接口:含
boolean evaluate(Context ctx)(条件判断)和void execute(Context ctx)(执行动作) - 或抽象基类 BasicRule:提供通用模板方法,子类只覆写关键逻辑
新增一条风控规则?只需写一个新类,implements Rule 或 extends BasicRule,不改引擎主流程,也不动已有规则。
运行时动态绑定:引擎只认接口,不关心具体是谁
规则引擎内部不写死 new FraudRule() 或 new CouponRule(),而是通过多态引用操作:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 规则注册表用
Map<String, Rule>存储,键为规则ID,值为任意实现类实例 - 执行时调用
rule.evaluate(ctx),JVM 根据实际对象类型自动分派到对应子类方法 - 哪怕你把
ctx传给十个不同规则,每个规则内部行为完全不同,但调用方式完全一样
配合工厂或配置驱动,让“选哪个规则”也解耦
硬编码 if-else 判断规则类型会破坏扩展性。更合理的方式是:
- 轻量工厂:根据配置项(如
rule.type=discount)返回对应Rule实现类 - 规则路由表:用
Map<String, Function<Context, Boolean>>存 Lambda,或用注解(如@RuleId("vip_discount"))自动注册 - Spring 环境下可结合
@ConditionalOnProperty或@Profile控制规则启停,无需改代码
避免多态失效,保证规则真正“活”起来
规则写了却没走子类逻辑?常见踩坑点:
- 规则方法被
static、final或private修饰 → 编译期绑定,失去动态性 - 子类方法签名与接口不一致(比如参数加了
Optional、返回类型没协变)→ 实际是重载,不是重写 - 调用方用了
new DiscountRule().evaluate(...)→ 绕过接口引用,多态失效 - 注册进引擎的对象是
null→ 运行时报NullPointerException,不是跳过规则
建议所有规则方法显式加 @Override,IDE 会实时校验是否真正重写了接口方法。
不复杂但容易忽略——多态让规则引擎从“写死逻辑”变成“装配逻辑”,新增规则就像换插件,而不是动电路板。

















