抽象出一个新的生成器以处理不同的数据源,并且将数据处理逻辑与数据源获取逻辑分离,是一种更好的设计。这种设计模式通常被称为“策略模式”,它允许你在运行时选择不同的策略(数据源)来获取和处理数据,而不需要修改核心逻辑。
实现步骤
以下是如何实现这种设计模式的详细步骤:
1. 定义数据处理接口
定义一个接口来处理从数据源获取的数据。这种接口可以支持多种报表生成策略:
public interface ReportGeneratorStrategy {void generateReport(List<Map<String, Object>> data);
}
2. 实现具体的报表生成策略
例如,单数据报表和客户统计报表各自实现自己的策略:
public class SingleDataReportGenerator implements ReportGeneratorStrategy {@Overridepublic void generateReport(List<Map<String, Object>> data) {// 实现单数据报表生成逻辑}
}public class CustomerStatisticsReportGenerator implements ReportGeneratorStrategy {@Overridepublic void generateReport(List<Map<String, Object>> data) {// 实现客户统计报表生成逻辑}
}
3. 创建一个新的生成器类
这个类用来选择数据源和相应的报表生成策略:
@Service
public class ReportService {public void generateReport(String query, DataService dataService, ReportGeneratorStrategy strategy) {List<Map<String, Object>> data = dataService.getData(query);strategy.generateReport(data);}
}
4. 使用配置和Spring来选择数据源和策略
你可以使用Spring来配置你的应用,以便选择适当的数据源和报表生成策略:
@RestController
@RequestMapping("/report")
public class ReportController {private final ReportService reportService;private final DataService adbLoader; // 假设你用@Bean定义了AdbLoaderprivate final DataService dbService; // 假设你用@Bean定义了DbService@Autowiredpublic ReportController(ReportService reportService, AdbLoader adbLoader, DbService dbService) {this.reportService = reportService;this.adbLoader = adbLoader;this.dbService = dbService;}@GetMapping("/generate")public ResponseEntity<String> generateReport(@RequestParam String query, @RequestParam boolean isSingleData,@RequestParam String dataSourceType) {DataService dataService;if ("adb".equalsIgnoreCase(dataSourceType)) {dataService = adbLoader;} else {dataService = dbService;}ReportGeneratorStrategy strategy;if (isSingleData) {strategy = new SingleDataReportGenerator();} else {strategy = new CustomerStatisticsReportGenerator();}reportService.generateReport(query, dataService, strategy);return ResponseEntity.ok("Report generated successfully");}
}
5. 配置文件
通过配置文件指定数据源类型和其他参数:
dataSource.type=db // or adb
优点
- 分离关注点:数据获取和报表生成逻辑是独立的,可以分别更改。
- 可扩展性:可以轻松添加新类型的数据源和报表生成策略。
- 更少的代码修改:通过参数化的方式,减少对旧代码的侵入性修改。
这种设计提高了代码的灵活性和可维护性,使得你能够根据业务需求动态地选择数据源和报表生成策略。