多态的核心作用是将“导出行为”抽象为统一接口,使不同格式(Excel、PDF、CSV、Word)各自实现具体逻辑,调用方只需面向接口操作。通过定义ReportExporter接口、各格式实现类及ExporterFactory工厂,实现解耦、可扩展与运行时适配。

在报表导出系统中,多态的核心作用是把“导出行为”抽象出来,让不同格式(如 Excel、PDF、CSV、Word)的实现各自负责具体逻辑,而调用方只需面向统一接口操作——无需 if-else 判断格式类型,也不用硬编码每种导出类的创建和调用。
定义统一导出接口
这是多态落地的第一步。所有导出格式都实现同一个接口,约定核心方法:
- export(ReportData data, String outputPath):执行导出动作
- getSupportFormat():返回支持的格式标识(如 "xlsx"、"pdf"),便于工厂或路由识别
- 可选:isStreaming() 或 getContentType(),用于 Web 响应头设置
例如:
public interface ReportExporter {void export(ReportData data, String outputPath);
String getSupportFormat();
}
为每种格式提供具体实现类
每个实现类只关注自身格式的细节,互不干扰:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ExcelExporter:用 Apache POI 构建 Workbook,处理样式、合并单元格
- PdfExporter:用 iText 或 Apache PDFBox 生成 PDF 流,控制分页、字体嵌入
- CsvExporter:简单字符拼接 + UTF-8 BOM 处理,注意字段转义
- WordExporter:基于 Apache POI XWPF 或模板引擎(如 Docx4j)填充表格
它们都实现 ReportExporter 接口,但内部完全独立——改 Excel 导出逻辑,不影响 PDF 的编译和运行。
用策略模式+工厂解耦调用逻辑
避免在业务代码里 new 具体类。通过工厂按格式获取对应实例:
public class ExporterFactory {private static final Map
"xlsx", new ExcelExporter(),
"pdf", new PdfExporter(),
"csv", new CsvExporter()
);
public static ReportExporter getExporter(String format) {
return EXPORTERS.getOrDefault(format.toLowerCase(), null);
}
}
使用时就非常干净:
ReportExporter exporter = ExporterFactory.getExporter("pdf");if (exporter != null) {
exporter.export(reportData, "/tmp/report.pdf");
}
扩展性与运行时适配
新增格式只需三步:写新实现类 → 注册到工厂(或自动扫描 @Component)→ 前端传参支持该 format 值。无需修改原有任何导出调用代码。
进阶可结合 Spring 的 @Qualifier 或自定义注解(如 @ExportFormat("xlsx"))配合依赖注入,实现更灵活的运行时装配;也可加一层 ExportContext 封装通用参数(如页眉、水印、加密开关),由各实现类选择性读取。

















