模板方法模式适用于流程固定、步骤可变的导入导出场景,通过抽象父类定义通用骨架(如校验表头、解析数据、批量入库/写入流),将字段映射、业务校验、数据落库等差异逻辑交由子类实现,配合工具类与统一入口提升复用性与可维护性。

模板方法模式适合解决“流程固定、步骤可变”的导入导出场景。核心是把通用流程(如读文件、校验表头、解析数据、保存或写入)抽成骨架,把差异部分(如字段映射规则、业务校验逻辑、数据落库方式)留给子类实现,从而避免重复编码、提升可维护性。
明确不变的导入导出骨架
无论导什么业务数据,基本流程高度一致:
- 下载模板 → 用户按格式填写 → 上传文件 → 校验表头是否匹配
- 逐行读取 → 执行业务校验(如编号唯一、必填项非空、枚举值合法)→ 收集错误信息
- 无错误则批量入库;有错误则生成含错误提示的反馈模板供用户修正
- 导出时:查数据 → 构建表头 → 填充内容 → 写入流 → 返回文件响应
抽象父类定义模板方法和钩子
创建一个抽象基类(如 AbstractExcelHandler),声明:
- final export():调用 prepareHeaders() → buildData() → writeToFile() → finish()
- final import():调用 validateHeader() → readRows() → validateRow() → saveBatch() → handleErrors()
- 抽象方法(子类必须实现):getTemplateClass()、buildExportData()、validateBusinessRule()、saveImportedRecords()
- 钩子方法(可选覆盖):isSkipEmptyRow()、beforeSaveHook(),用于微调行为而不破坏主流程
子类专注业务逻辑,不碰流程控制
每个业务模块(如用户导入、指标导入、订单导出)只需继承抽象类,实现自己的细节:
- 指定对应 VO 类(含 @ExcelProperty 注解),EasyExcel 自动绑定字段
- 重写 validateBusinessRule(LogicIndExcelVOExt vo):检查“逻辑指标编号不能重复”、“业务口径不能为空”等业务约束
- 重写 saveImportedRecords(List
list) :调用对应 service.saveBatch(),并捕获数据库异常转为 errorMsg - 导出时重写 buildExportData():根据查询参数组装 List
,支持全量/选中导出
配合工具类与统一入口降低使用门槛
实际落地时还需配套支持:
- 提供 ExcelUtil 工具类:封装表头校验、空行跳过、日期格式自动识别等共性能力
- Controller 层只暴露标准接口:/export?bizType=user、/import/template?bizType=index、/import/submit
- 通过 bizType 路由到不同子类实例(可用 Spring 的 FactoryBean 或策略模式解耦)
- 所有子类共享统一的异常处理、日志记录、操作审计逻辑


















