【问题标题】: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 等。如果是,那么该怎么做,使用什么设计模式等?

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    【讨论】:

    • 项目使用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

    不知道有没有帮助

    【讨论】:

    • 请查看更新后的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多