You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何抽象不同数据源生成对象?实现业务逻辑与数据源解耦

解耦数据填充逻辑与数据源的设计方案

核心原则:依赖抽象,而非具体实现

核心思路是把数据获取的逻辑和业务层的对象填充、图像生成逻辑彻底分开——业务层只需要知道“我能拿到需要的数据对象”,完全不用关心数据来自JSON、CSV还是数据库。

具体落地步骤

  • 定义统一的数据访问接口
    创建一个只负责“获取原始数据”的接口(比如叫DataProvider),只暴露核心方法,比如getRawData(),接口里不包含任何和具体数据源相关的细节。
  • 为每个数据源实现接口
    • 针对JSON文件:写JsonDataProvider,实现读取、解析JSON的逻辑
    • 针对CSV文件:写CsvDataProvider,实现读取、解析CSV的逻辑
    • 针对YAML文件:写YamlDataProvider,同理处理YAML
    • 针对数据库:写DbDataProvider,实现数据库查询、结果转换的逻辑
    • 未来新增数据源时,只需要新增一个实现了DataProvider的类,完全不用修改业务逻辑代码
  • 抽离数据转换逻辑
    因为不同数据源返回的原始格式(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:51:02