使用嵌套列表转换对象的设计模式

时间:2013-04-12 01:44:00

标签: java design-patterns guava

我有一个服务,其流程基本上如下:

  1. 接收输入对象。这只是一个POJO对象,我在设计中没有多少发言权。
  2. 转换为我的服务的规范化对象。
  3. 对规范化对象执行一些业务逻辑,并收集一些关于它的额外数据。
  4. 转换为数据传递给的另一个服务的输出对象。 (另一个POJO。)
  5. 将转换后的数据传递给其他服务。
  6. 这意味着,我的服务的很大一部分是从InputFoo类型转换为NormalizedFoo类型到OutputFoo类型。

    这将是一项非常简单的任务。我正在使用Google Collections库,可以使用这样的类:

    public class InputFooToNormalizedFooConverter implements Function<InputFoo, NormalizedFoo> {
      public NormalizedFoo apply(InputFoo input) {
        NormalizedFoo output = new NormalizedFoo();
        output.setProperty(input.getProperty());
      }
    }
    

    和另一个这样的课程:

    public class NormalizedFooFooToOutputFooConverter implements Function<NormalizedFoo, OutputFoo> {
      public NormalizedFoo apply(InputFoo input) {
        NormalizedFoo output = new NormalizedFoo();
        output.setProperty(input.getProperty());
      }
    }
    

    但是每种类型的Foo基本上都有这样的层次结构:

    public class Foo {
       List<Bar> barItems;
       // .. other properties
    }
    
    public class Bar {
       List<Baz> bazItems;
       List<Quux> quuxItems;
       // .. other properties
    }
    
    public class Baz {
       // .. other properties
    }
    
    public class Quux {
       // .. other properties
    }
    

    这意味着我的NormalizedFooToOutputFooConverter类型为NormalizedBarToOutputBarConverter implements Function<NormalizedBar, OutputBar>,依此类推。

    更糟糕的是,输入完全与标准化模型完全匹配。它更像是

    public class InputFoo {
      public List<InputBar> bars;
      public List<InputBaz> bazs;
      public List<InputQuux> quuxs;
      // .. other properties
    }
    
    public class InputBar {
      private String barId;
      // .. other properties
    }
    
    public class InputBaz {
      private String barId;
      private String bazId;
      // .. other properties
    }
    
    public class InputQuux {
      private String barId;
      private String quuxId;
      // .. other properties
    }
    

    在这些模型中,我可以根据每个Baz找出QuuxBar属于哪个barId

    此时,我有大约20个不同的转换器,用于从InputNormalizedNormalizedOutput。更糟糕的是,他们中的一些人的名字像ReallyLongInputTypeToReallyLongNormalizedTypeConverter,创造了极长的类名。对于所有转换器,我觉​​得我在这里做错了。有没有更好的方法来组织我的转换器?

0 个答案:

没有答案