多态优化if-else的本质是将类型决策权从调用方移交至对象自身,通过统一接口、具体实现、策略容器集中分发及sealed class增强类型安全来实现开闭原则。

多态优化 if-else 的本质,是把“根据类型/条件选逻辑”的决策权,从调用方移交给对象自身。不再靠人工判断 type 字符串或枚举值再分支调用,而是让每个具体类型自己决定怎么做。
识别适合重构的 if-else 场景
不是所有 if-else 都该用多态。重点关注以下特征:
- 判断依据是单一字段(如 payMethod、exportFormat、eventType)
- 每个分支都执行结构相似的操作(比如都调 handle()、export()、validate())
- 各分支逻辑相对独立,无强共享状态
- 未来可能新增类型(如新增一种支付方式、导出格式)
定义统一行为接口,下沉分支逻辑
先抽象共性,不写具体实现。例如处理不同消息类型:
public interface MessageHandler {
boolean supports(String messageType);
void handle(Message message);
}
然后为每种类型提供独立实现:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- SmsHandler:封装短信发送、签名拼接、通道重试
- EmailHandler:处理模板渲染、附件加载、SMTP 配置
- WebhookHandler:负责 HTTP 调用、签名验证、失败回调
关键点:每个类内部完成全部逻辑,外部不感知差异。
用 Map 或策略容器集中管理分发
把原来散落在业务代码里的 if-else 收口到一处,避免硬编码:
private final Map<String, MessageHandler> handlerMap = new HashMap<>();
// 启动时注册(Spring 可用 @PostConstruct)
handlerMap.put("sms", new SmsHandler());
handlerMap.put("email", new EmailHandler());
handlerMap.put("webhook", new WebhookHandler());
// 使用时一行搞定
handlerMap.get(message.getType()).handle(message);
新增类型只需加实现类 + 注册,不改任何已有调用逻辑,符合开闭原则。
配合 sealed class 或枚举提升健壮性
Java 17+ 推荐用 sealed interface 限定所有合法类型:
public sealed interface MessageType permits SmsType, EmailType, WebhookType {}
public final class SmsType implements MessageType {}
public final class EmailType implements MessageType {}
// 编译器强制你覆盖所有子类,switch 表达式不会漏分支
比字符串 key 更安全,避免拼写错误和运行时空指针;也比 instanceof 判断更清晰、更可维护。

















