有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java设计模式数据到对象

假设我在一个文件或数据库中有一些数据。它可以是JSON、XML、YAML、CSV、String[]等

我想用这些数据创建一个模型对象。例如:

数据:

{
    "name": "John Doe",
    "age": "30"
}

模型(伪代码):

class Person {
    Person(name, age) {
        this.name = name;
        this.age = age;
    }
    // business logic
}

一些从JSON数据创建Person对象的代码(伪代码):

peopleArray = [];
recordSet = aJSONReader.read('file');
for (recordSet as r) {
    peopleArray.add(new Person(r[0], r[1]));
}

您将使用什么从给定数据构建模型对象?在我的示例中,我将开始支持JSON。如果我想更改它或支持新的数据格式,该怎么办? 如何将此代码解耦?哪种设计模式适合这里


共 (3) 个答案

  1. # 1 楼答案

    我喜欢这个技巧。创建一个抽象对象,其职责是提供属性。在这种情况下nameage

    interface PersonInput {
    
        public String getName();
    
        public int getAge();
    }
    

    让Person类在构造函数中使用该对象

    class Person {
    
        public Person(PersonInput input) {
            name = input.getName();
            age = input.getAge();
        }
    
    }
    

    现在您可以有许多PersonInput的实现,每个实现都处理不同的数据格式(CSV、XML等)

    JSON示例:

    class JsonPersonInput implements PersonInput {
    
        private String name;
        private int age;
    
        public JsonPersonInput(String json) throws JSONException {
            JSONObject data = new JSONObject(json);
            name = data.getString("name");
            age = data.getInt("age");
    
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    
    }
    

    你是这样用的

    new Person(new JsonPersonInput(jsonString))
    
  2. # 2 楼答案

    使用策略模式(参见here)。您希望提供不同的方法来解析数据。一个方法将解析JSON,另一个方法将解析XML,另一个方法将读取数据库。每种方法都可以看作是解析数据和生成数据对象的策略

    创建一个公共接口,比如说IDataObjectParser,使用一个类似public List<DataObject> parse()的方法。每个解析器都将实现这个接口。然后,您可以随时交换解析器,例如在运行时或根据配置文件

  3. # 3 楼答案

    如果“data”指的是持久性机制,那么这是Data Access Objects(或DAO)的最佳情况

    这通常与Java web应用程序和RDBMS实现相关联,但它在所有需要持久性的Java应用程序中都有应用程序

    您只需要为您的个人定义一个DAO接口,比如PersonDAO,上面有两个方法getPerson()savePerson()

    interface PersonDAO {
        public Person readPerson(String path);
        public void addPerson(Person personToBeSaved);
    }
    

    然后创建另一个类,比如说一个用于JSON实现的类,它实现了DAO,让我们调用我们的JsonPersonDAO

    如果您使用工厂来生成Person对象,那么您只需要在需要时更改在单个位置使用的DAO实现。如果要从类内部生成Person对象,只需更改它使用的DAO实现

    请在此进一步阅读:

    http://www.oracle.com/technetwork/java/dataaccessobject-138824.html

    http://best-practice-software-engineering.ifs.tuwien.ac.at/patterns/dao.html