java多态实现即插即用的核心是统一契约(接口/抽象类)屏蔽实现差异,新类零侵入接入;需避免伪多态陷阱,依赖运行时动态装配而非编译期硬编码。

明确统一的抽象契约
所有可插拔的功能类必须遵守同一个“协议”,这是即插即用的前提。
- 优先选接口:比如
Rule、PaymentStrategy、Parser,只定义行为(方法签名),不带状态和默认逻辑 - 需要共享初始化逻辑或 protected 工具方法时,才用抽象类(如
AbstractRule),但要避免塞满 default 方法导致接口膨胀 - 契约中方法不能是
static、final或private——这些无法被重写,破坏多态基础
子类各自实现,不污染主流程
每个具体功能类只专注自身逻辑,不感知其他同类存在,也不修改调度代码。
- 例如规则引擎中:
OrderAmountRule实现@Condition判金额,CouponValidRule判优惠券,两者互不影响 - 支付场景下:
WechatPay和Alipay各自实现pay(),业务层只调payment.pay(amount) - 新增功能只需新增类+实现契约,无需改工厂、调度器、业务入口等已有代码
运行时动态装配,而非编译期硬编码
真正实现“即插”靠的是依赖注入或简单工厂,把对象创建与使用解耦。
- Spring 场景:用
@Service+ 接口类型注入,容器自动匹配所有实现类 - 轻量场景:用策略 Map 存储
Map<string rule></string>,根据配置 key 查找执行;或用 ServiceLoader 加载 classpath 下所有实现 - 组合扩展:像
UnitRuleGroup本身也实现Rule接口,可嵌套任意规则,支持递归调度
规避常见伪多态陷阱
看似用了继承/接口,但没发挥多态价值,等于白搭。
- 子类方法里写
if (type == X) { ... } else if (type == Y) { ... }—— 这只是 switch 搬进方法,违背多态初衷 - 抽象类中定义大量字段,导致无关子类被迫继承冗余状态
- 接口里堆砌十几个 default 方法,变成“伪抽象类”,违反单一职责
- 调用方直接 new 具体类(如
new WechatPay()),绕过契约,后续加新支付方式就得改调用点
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











