多态通过依赖抽象而非具体实现来降低模块耦合。使用接口声明变量和参数,新增实现类无需修改原有业务代码,支持Mock测试、运行时动态绑定,消除条件分支硬编码,配合依赖注入与合理包结构形成松散协作链,并以清晰接口契约提升团队协同效率。

多态通过让调用方只依赖抽象(接口或父类),不绑定具体实现,直接削弱模块之间的强依赖关系。
依赖抽象,而非具体实现
代码中使用接口或抽象类声明变量、参数和返回值,调用逻辑就不再关心背后是哪个子类在工作。比如定义 PaymentProcessor 接口,WechatPay、Alipay、BankTransfer 各自实现它;订单服务只需接收 PaymentProcessor 类型参数,而无需知道当前走的是哪种支付渠道。
- 新增 ApplePay?加个实现类即可,原有下单、退款等业务代码完全不动
- 测试时可轻松注入 Mock 实现,不依赖真实第三方 SDK
- 编译期只校验接口契约(方法签名),运行时才决定执行哪个版本
消除条件分支带来的硬编码耦合
当方法里频繁出现 if (payType.equals("alipay")) 或 switch (channel),说明业务逻辑和渠道细节被混在一起——这既是内聚下降,也是耦合升高的信号。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把每种渠道封装成独立类,各自处理协议、签名、重试、幂等逻辑
- 主流程只保留“调用 processor.send()”这一句,不再掺杂判断逻辑
- 渠道策略可由配置、注解或工厂动态选择,上层无感知
配合依赖注入形成松散协作链
多态要真正起效,离不开依赖关系的合理组织。调用方不应自己 new 实现类,而应通过构造函数或 setter 接收接口类型依赖。
立即学习“Java免费学习笔记(深入)”;
- Controller 层只持有 OrderService 接口,不碰任何支付或通知的具体实现
- Service 层通过构造函数注入 NotificationSender、InventoryClient 等接口
- 实现类放在 infra 包下,接口定义放在 domain 或 api 包,包结构体现边界
接口即契约,提升协同可控性
在多人协作中,接口是一份明确的协作约定:输入是什么、输出是什么、异常怎么抛、幂等如何保证。前后端、不同小组按同一份接口开发,集成时只需确认实现是否符合契约。
- 命名带业务语义,如 RefundPolicy 而非 Helper
- 单个接口方法数控制在 5 个以内,职责不清就拆分
- 拒绝返回 Map<String, Object> 这类弱类型,统一用有含义的 DTO 或 Result 封装

















