设计模式 - 数据到对象

6
假设我有一些数据存储在文件或者数据库中,这些数据可能是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个回答

4
使用策略模式(见此处),您希望提供不同的方法来解析数据。一种方法会解析JSON,另一种方法会解析XML,另一种方法会读取数据库。每种方法都可以看作是解析数据和生成数据对象的策略。
创建一个公共接口,比如说IDataObjectParser,其中只有一个方法public List<DataObject> parse()。每个解析器都将实现这个接口。然后您可以随时交换解析器,例如在运行时或根据配置文件。

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))

有趣。这是某种设计模式吗? - Thom Thom Thom
从不同的角度来看,许多设计模式都与特定的解决方案纠缠在一起。我不会过于强调试图找到正式的设计模式。 - Weltschmerz

0
如果你所说的“数据”是指持久化机制,那么这就是使用数据访问对象(或DAO)的完美情况。
这通常与Java Web应用程序和关系型数据库管理系统的实现相关联,但它在所有需要持久性的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接