多态通过策略模式统一处理报表多维聚合:定义泛型接口AggregationStrategy<T,R>,各维度实现类独立封装,注册中心按需装配;支持嵌套组合与类型安全收敛,调用方仅面对aggregate(List<T>)接口。

多态在复杂报表统计中统一处理不同维度聚合计算,关键是把“怎么聚合”从具体维度逻辑里抽出来,让调用方只面对一个接口,运行时自动匹配对应实现。
用抽象聚合策略定义统一入口
定义一个 AggregationStrategy<T> 接口,声明核心方法:
- aggregate(List<T> data):返回结构化结果(如 Map<String, Object> 或自定义 Summary)
- getDimensionName():标识该策略适用的维度(如 "region"、"product_category"、"time_month")
- supports(Class<?> type):判断是否能处理当前数据类型,避免误用
每个维度聚合逻辑封装为独立实现类:RegionSumStrategy、ProductAvgStrategy、TimeRollupStrategy。它们互不依赖,新增维度只需加类,不改老代码。
用策略容器按需装配
构建一个策略注册中心,比如 Map<String, AggregationStrategy>,按维度名或业务场景键注册实例:
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 初始化时自动扫描并加载所有 Strategy 实现类(可用 Spring @Component 或 ServiceLoader)
- 报表服务根据请求参数(如 queryParam="dimension=region&method=sum")查出对应策略
- 传入原始明细数据(List<SaleRecord>),直接调用 aggregate() 得到结果
这样,同一份销售数据,可分别交由 RegionSumStrategy 算区域总和、TimeRollupStrategy 做季度上卷,调用方式完全一致。
支持嵌套与组合式聚合
某些报表需要先按 A 维度分组,再在每组内按 B 维度聚合。这时可让策略本身支持嵌套:
- 定义 CompositeAggregationStrategy,持有多个子策略,并控制执行顺序
- RegionThenProductStrategy 内部先用 RegionGroupingStrategy 分组,再对每组调用 ProductSumStrategy
- 所有策略仍实现同一接口,外层无需感知嵌套结构
组合过程不破坏多态契约,上层代码依然只认 aggregate(List<T>) 方法。
配合泛型与类型安全收敛结果
不同维度聚合后结构可能不同(有的返回 Map<String, Integer>,有的返回 List<TopNItem>)。可通过泛型约束收敛输出:
- 接口定义为 AggregationStrategy<T, R>,R 是该策略专属返回类型
- 调用方用类型令牌(TypeReference)明确预期结果类型,避免强转
- 前端或导出模块只接收统一的 ReportSection<R> 包装对象,内部字段由 R 决定
既保留各维度聚合的灵活性,又让外部消费逻辑保持稳定。

















