用于填充多个类字段的设计模式

Posted

技术标签:

【中文标题】用于填充多个类字段的设计模式【英文标题】:Design pattern to use to populate multiple class fields 【发布时间】:2022-01-23 09:05:26 【问题描述】:

我有一个用例,我必须解析 XML 文档并在内部模型 POJO Details 的相应字段中填写详细信息。 比方说,XML 如下所示 -

<?xml version="1.0" encoding="UTF-8"?>

...
<TagA>
 <Child1>
 ...
 </Child1>
 <Child2>
 ...
 </Child2>
</TagA>

...

<TagB>
 <Child1>
 ...
 </Child1>
 <Child2>
 ...
 </Child2>
</TagB>
....

内部模型 POJO 如下所示 -

public class Details 

...

Set<TagAInfo> tagAInformation; 
Set<TagBInfo> tagBInformation;

...


XML 有多个字段,例如 TagAs、TagB 等。

当前实现: 所以目前有一个映射器/解析器类(比如说Mapper.java)在details 上调用多个方法,如mapTagAInfo(details, xmlRootElement)mapTagBInfo(details, xmlRootElement) 等的Details.java) 类似以下 -

public class Mapper 
 ....

public Details mapInfo(XmlElement xmlRootElement) 
  Details details = new Details();
  mapTagAInfo(details, xmlRootElement)
  mapTagBInfo(details, xmlRootElement)
  mapTagCInfo(details, xmlRootElement)
 ....
 return details;


private void mapTagAInfo(details, xmlRootElement) 
  stp1: Extract <TagA> tag element info using a utility which reads the xml document
  stp2: use the stp1 info and convert to internal model POJO TagAInfo and 
  add to details (details.addTagAInfo(tagAInfo))


问题:目前的实现让代码看起来很丑(就像在单个类中Mapper.java 发生了多件事),所以想知道我是否可以使用一些设计模式来改进代码 ?如果是这样,请建议使用哪种设计模式,并举例说明设计模式的使用会有很大帮助。

更新:该项目使用 Dom4j 读取 XML。此外,问题更多的是处理映射器类的职责。正如人们所看到的,它有很多功能,如 mapTagAInfo、mapTagBInfo 等。想知道我是否应该将职责委托给不同的类 - 例如。 TagAInfoEnricher、TagBInfoEnricher 等。如果是,那么该怎么做,使用什么设计模式等?

【问题讨论】:

【参考方案1】:

尝试使用 JAXB 解组。

例子:

https://howtodoinjava.com/jaxb/jaxb-unmarshaller-example/ https://howtodoinjava.com/jaxb/read-xml-to-java-object/

【讨论】:

项目使用Dom4j读取XML。此外,问题更多的是处理映射器类的责任。正如人们所看到的,它有很多功能,如 mapTagAInfo、mapTagBInfo 等。想知道我是否应该将职责委托给不同的类 - 例如。 TagAInfoEnricher、TagBInfoEnricher 等。如果是,那么该怎么做,使用什么设计模式等?【参考方案2】:

我通常喜欢使用构建器模式 Lombok @Builder 注解来创建我的对象。

@Builder
@Getter
class Details implements Serializable 

  Set<TagAInfo> tagAInformation; 
  Set<TagBInfo> tagBInformation;

  public static void mapTagAInfo(details, xmlRootElement) 
    ...
  
 

我喜欢使用的另一种设计模式是在类中创建静态方法来构造我的对象,尤其是 DTO

不知道有没有帮助

【讨论】:

请查看更新后的问题。

以上是关于用于填充多个类字段的设计模式的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ - 相当于用于填充历史字段的休眠拦截器?

Java传输对象模式

从父模式填充字段

从父模式填充字段

jQuery自动完成,通过选择建议选项填充多个字段

单例模式