多态替代if-else的核心是将类型判断逻辑下沉至子类,通过统一接口(如documentexporter)和具体实现(pdfexporter、docxexporter)实现行为自治;配合工厂/策略模式解耦创建与使用,用map注册实例;警惕伪多态,优先配置驱动;推荐sealed class+switch提升类型安全。

用多态替代 if-else 的核心,是把“根据类型做不同操作”的逻辑,从调用方下沉到具体类型内部,让对象自己决定怎么行为。
把分支逻辑封装进子类方法
当一段 if-else 判断的是对象类型(如 if (type.equals("PDF")) {...} else if (type.equals("DOCX")) {...}),说明你本该用多态。先定义统一接口或抽象类,比如 DocumentExporter,声明一个 export() 方法;再为每种格式写实现类:PdfExporter、DocxExporter。调用时只需 exporter.export(),不再需要判断类型。
用工厂或策略模式解耦创建与使用
避免在业务代码里 new 具体实现类。引入简单工厂或策略容器:比如用 Map
- 注册示例:exporters.put("pdf", new PdfExporter());
- 使用示例:exporters.get(type).export(data);
警惕“伪多态”:别只是为了消除 if-else 而强行继承
如果子类之间行为差异极小,或只是参数不同(比如只差一个文件后缀、一个 HTTP header),更适合用配置驱动或模板方法 + 参数化构造。强行拆成多个类反而增加维护成本。多态真正发力的场景,是各分支有独立状态、复杂流程或未来可能大幅扩展行为。
配合枚举和 sealed class 提升类型安全(Java 17+ / Kotlin)
用 sealed interface 或 enum 明确限定所有可能类型,编译器能帮你检查是否遗漏处理分支。例如定义 sealed interface ExportFormat,下设 PdfFormat、DocxFormat 等子类。配合 switch 表达式,既保留清晰分发语义,又获得编译期完整性保障,比运行时 if-else 更可靠。











