如何抽象不同数据源生成对象?实现业务逻辑与数据源解耦
解耦数据填充逻辑与数据源的设计方案
核心原则:依赖抽象,而非具体实现
核心思路是把数据获取的逻辑和业务层的对象填充、图像生成逻辑彻底分开——业务层只需要知道“我能拿到需要的数据对象”,完全不用关心数据来自JSON、CSV还是数据库。
具体落地步骤
- 定义统一的数据访问接口
创建一个只负责“获取原始数据”的接口(比如叫DataProvider),只暴露核心方法,比如getRawData(),接口里不包含任何和具体数据源相关的细节。 - 为每个数据源实现接口
- 针对JSON文件:写
JsonDataProvider,实现读取、解析JSON的逻辑 - 针对CSV文件:写
CsvDataProvider,实现读取、解析CSV的逻辑 - 针对YAML文件:写
YamlDataProvider,同理处理YAML - 针对数据库:写
DbDataProvider,实现数据库查询、结果转换的逻辑 - 未来新增数据源时,只需要新增一个实现了
DataProvider的类,完全不用修改业务逻辑代码
- 针对JSON文件:写
- 抽离数据转换逻辑
因为不同数据源返回的原始格式(比如JSON的字典、CSV的行数据、数据库的结果集)不一样,单独写一个DataConverter类,负责把各种原始数据转换成你需要的业务对象。业务层只接收转换好的对象,不用管转换过程。 - 用工厂/配置管理数据源实例
可以写一个简单的DataProviderFactory,根据配置(比如配置文件里的数据源类型、路径/连接信息)创建对应的DataProvider实例。业务层通过工厂获取实例,不用自己手动创建具体的实现类。
关于你提到的模式:其实它们刚好适配你的场景
- Repository模式:本质就是封装数据访问逻辑,让业务层只和Repository交互,不用管底层数据源。你可以把
DataProvider和DataConverter封装到Repository里,业务层直接调用Repository的getBusinessObject()方法,完全隔离数据源细节。 - DAO模式:DAO(数据访问对象)就是
DataProvider的另一种叫法——专门负责和数据源打交道,业务层只依赖DAO接口,不关心具体实现。 - 抽象工厂模式:如果你的数据源有分组场景(比如测试环境用文件、生产环境用数据库),抽象工厂可以批量创建一组相关的DataProvider;如果只是单个数据源类型,用简单工厂就足够。
简化伪代码示例
// 统一数据访问接口 public interface DataProvider { Map<String, Object> getRawData(); } // JSON数据源实现 public class JsonDataProvider implements DataProvider { private String filePath; public JsonDataProvider(String filePath) { this.filePath = filePath; } @Override public Map<String, Object> getRawData() { // 读取、解析JSON文件的逻辑 return JsonUtils.parseFile(filePath); } } // 数据转换类 public class DataConverter { public static BusinessObject convert(Map<String, Object> rawData) { BusinessObject obj = new BusinessObject(); obj.setId((String) rawData.get("id")); obj.setName((String) rawData.get("name")); // 其他字段映射逻辑 return obj; } } // 业务逻辑类(图像生成) public class ImageGenerator { private DataProvider dataProvider; public ImageGenerator(DataProvider dataProvider) { this.dataProvider = dataProvider; } public void generateImage() { Map<String, Object> rawData = dataProvider.getRawData(); BusinessObject businessObj = DataConverter.convert(rawData); // 根据业务对象生成图像的逻辑,完全不关心数据源类型 } } // 使用示例 public class Main { public static void main(String[] args) { // 用JSON数据源生成图像 DataProvider jsonProvider = new JsonDataProvider("data.json"); ImageGenerator jsonGenerator = new ImageGenerator(jsonProvider); jsonGenerator.generateImage(); // 换成CSV数据源,只需要换DataProvider实例 DataProvider csvProvider = new CsvDataProvider("data.csv"); ImageGenerator csvGenerator = new ImageGenerator(csvProvider); csvGenerator.generateImage(); } }
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

