Java多态解耦核心是业务代码完全 unaware 具体实现:接口定义契约(如NotificationSender)、业务类仅持接口引用、工厂返回接口、运行时动态绑定,新增实现无需修改原有代码。

Java 中多态实现业务逻辑解耦,核心不是“写个接口”,而是让业务代码彻底不知道、也不需要知道具体是谁在干活。
用接口定义契约,不暴露实现细节
所有可替换的业务模块必须实现同一个接口,比如 NotificationSender:
- 接口只声明
send(String content),不规定是短信、邮件还是站内信 - 禁止在接口里用
ArrayList、HttpURLConnection等具体类型,全用抽象或基本类型 - 接口方法命名聚焦职责(如
validate()、process()、notify()),不带实现痕迹
业务类只持接口引用,不做类型判断
像订单服务、风控服务这类核心类,变量声明和参数类型必须是接口,例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
private final PaymentProcessor processor;—— 不是AlipayProcessor - 构造器注入时传入
PaymentProcessor实例,而不是 new 出某个具体类 - 绝对避免
if (obj instanceof WechatProcessor)或强制转型,这是解耦失败的明确信号
工厂或加载器返回接口,隐藏创建逻辑
谁来创建对象,由工厂或插件加载器负责,但返回值类型必须是接口:
立即学习“Java免费学习笔记(深入)”;
- 工厂方法签名应为
NotificationSender create(String type),不是new SmsSender() - 内部可用配置映射(如
"sms" → SmsSender.class)、ServiceLoader、Spring Bean 查找,这些对业务层完全透明 - 新增一种通知方式,只需加一个实现类 + 配置项,不改任何已有业务代码
运行时动态绑定,编译期零耦合
调用发生时,JVM 根据对象实际类型决定执行哪个方法:
-
sender.send("hello")这行代码编译时只知道NotificationSender接口 - 运行时才绑定到
SmsSender或EmailSender的具体实现 - 这种延迟绑定使业务逻辑与实现彻底分离,连类名都不出现在业务模块的字节码里

















