将java域模型从域A转换为域B.

时间:2013-08-06 07:26:40

标签: java dns transform converter

我有一个域模型A,我想将其转换为另一个域模型B.因此,对于每个模型元素,我需要将其转换为一个或多个B元素。

域A看起来很简单,如:

public class Model
{
    public List<ModelElement> elements;
}

public class ModelElement
{
    public SubElement subElement;
}

public class SubElement
{
    public String someData;
}

域B看起来像

public class Layout
{
    public List<Layer> layers;
}

public class Layer
{
    public LayerData layerData;
}

public class LayerData
{
    public int layerNumber;
    public String name;
}

这真的很简单,我的模型有点复杂,但是为了解释我认为这已经足够了。

所以我的问题是,转换器的好方法是什么。

我想写一个单独的类,它遍历模型并转换每个元素。到最后我有一个巨大的转换器类,这不太好。

我的另一种方法是建立一个工厂,它为域A的每个元素提供一个特定的转换器。然后,每个转换器可以调用工厂来获取子元件的转换器。不幸的是,我需要一些元素转换其他数据。因此,要在某些转换器中使用它,我必须将它们传递给所有上层转换器,这听起来也不是很好。

这样做的好方法是什么?

感谢您的帮助 西蒙

2 个答案:

答案 0 :(得分:0)

您可能需要查看DOZER。 lib将允许字段的通配符转换(如果它们共享相同的名称)并且还允许自定义转换器。

答案 1 :(得分:0)

如果您的数据模型是层次结构且有限的,我会使用第一种方法,但将其职责划分为几个类。让主类发布转换所需的数据。然后它调用根(模型/布局)的转换器类,它转换并调用子转换器(ModelElement / Layer级别)等等。诀窍是始终将引用传递给主类,它将像转换器的信封或数据存储一样工作。通过这样做,您将获得一个漂亮,分离的设计与单一责任:提供数据,转换单个类等等。

这只是我要去的设计草图。鉴于这些信息,这是我能得到的最好的。您可能希望适应它并可能添加一些抽象(例如,为信封类减少数据发布的接口)。