多态在文件导出中体现为通过exporter接口统一契约,运行时由工厂自动选择具体实现类。各格式实现类(excel/pdf/csvexporter)独立封装逻辑,新增格式只需注册,无需修改调用方代码。

Java 中多态在文件导出场景中,核心是用统一接口屏蔽格式差异,运行时根据请求动态决定具体实现类。不是靠 if-else 判断后手动 new 某个类,而是让系统自动“选”——这正是多态的价值。
导出接口统一定义
先定义一个通用导出契约,所有格式都遵守它:
public interface Exporter<t> {
void export(List<t> data, OutputStream out) throws IOException;
String getContentType(); // 如 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
String getFileExtension(); // 如 "xlsx" 或 "pdf"
}</t></t>
这个接口不关心是 Excel 还是 PDF,只声明“我能导出数据到输出流”。
具体实现类各自负责本职
每个格式写一个实现类,互不干扰:
-
ExcelExporter:用 Apache POI 写.xlsx,支持样式、合并单元格、大数据流式写入(SXSSFWorkbook) -
PdfExporter:用 iText7 直接构建表格并写入PdfWriter,或基于模板填充(AcroForm),也支持流式生成 -
CsvExporter:纯文本写入,UTF-8 + BOM,适合超大数据量
它们都实现 Exporter<t></t>,但内部逻辑完全独立。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
工厂根据请求自动选择实现类
Controller 不硬编码格式判断,而是交给工厂:
// 根据路径后缀或 Accept 头自动识别
String format = resolveExportFormat(request); // 如 "xlsx" 或 "pdf"
Exporter<order> exporter = ExporterFactory.getExporter(format);
exporter.export(orderList, response.getOutputStream());
response.setContentType(exporter.getContentType());
response.setHeader("Content-Disposition", "attachment;filename=report." + exporter.getFileExtension());</order>
ExporterFactory 内部是简单映射:
public class ExporterFactory {
private static final Map<string supplier>>> MAP = Map.of(
"xlsx", () -> new ExcelExporter(),
"pdf", () -> new PdfExporter(),
"csv", () -> new CsvExporter()
);
@SuppressWarnings("unchecked")
public static <t> Exporter<t> getExporter(String format) {
return (Exporter<t>) MAP.getOrDefault(format, () -> new ExcelExporter()).get();
}
}</t></t></t></string>
这样新增格式(比如导出 Word)只需加一个 WordExporter 类 + 注册一行,Controller 和调用方代码零修改。
关键细节让多态真正落地
-
泛型支持不同业务对象:
Exporter<user></user>和Exporter<order></order>都能复用同一套结构,字段映射逻辑可抽成FieldMapping配置,不耦合实体 -
流式写入避免 OOM:
export()方法直接操作OutputStream,不生成临时文件,内存友好 -
HTTP 响应头由实现类提供:
getContentType()返回对应 MIME 类型,前端用.xlsx后缀访问时浏览器自动识别为 Excel -
模板与代码生成可共存:
PdfExporter内部可以是 iText 纯代码绘表,也可以是PdfStamper填充 AcroForm 模板——对外仍是同一个export()方法
不需要在业务层写 if ("pdf".equals(format)) { new PdfExporter().export(...) },那种写法只是条件分支,不是多态。真正的多态是:你只面向接口编程,运行时 JVM 自动绑定到实际子类的方法。
本质上,多态在这里解决的不是“怎么导”,而是“怎么让导出逻辑可插拔、可扩展、可测试”。格式切换变成配置问题,而不是代码重构问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










