在组合对象的单个条目实例中强制执行单项集合

时间:2011-03-25 02:03:56

标签: java

我有一个实现接口的抽象类。然后,我有几个扩展该抽象类的类,这些类又由一些对象的层次结构加上一个或多个扩展相同抽象类的对象列表组成,重复某些级别。实质上,

public interface Bar

public abstract class BarImpl implements Bar

public class Foo extends BarImpl {

  private String value1;
  private String value2;
  private List<Foo2> fooSubs;

  public List<Foo2> getFooSubs() {
    return fooSubs;
  }
}

public class Foo2 extends BarImpl {
  private String value3;
  private String value4;
  private List<Foo3> fooSubs;

  public List<Foo3> getFooSubs() {
    return fooSubs;
  }
}

...etc...

有问题的数据实际上是熟悉的X12医疗保健索赔数据。我已经定义了一个Loop接口,以对应组成X12文件的各种循环。

我的问题是这个 - 我还需要能够描述单个事务,理论上使用相同的对象或该对象上的一些包装器,其中对于某些指定的深度,每个对象列表的大小为1。

我的第一个是/是要向BarImpl抽象类添加一个布尔值的singleTransaction。扩展的每个类都会检查addFoo方法,以确保对象不会超出单个条目。在转换为FooSingle之前,我也会检查。

public void addFoo(Foo foo) throws FooException {
    if (singleTransaction && fooSubs.size() >= 1)
        throw new FooException();
    else
        fooSubs.add(foo);
}

我还必须删除setFoo方法,以防止分配已填充的List。也许只是让它最终......

这似乎是一种合理的方式吗?然后我可以有一个SingleBarImpl类来验证它在层次结构中有一条路径,向下过滤布尔值,然后可以安全地假设指定类只有一个每个列表对象。这样可以简化对层次结构的访问,因为我不再需要担心多个列表内容。

这让我觉得非常难看是为什么我提出这个问题,而且我不太清楚我应该寻找什么替代方案。所以我决定停止潜伏,创建一个帐户,并把它扔出去。所以...任何想法?我错过了一些让这更优雅的设计模式吗?

1 个答案:

答案 0 :(得分:0)

我不熟悉X12医疗保健索赔数据,因此无法正确建模域名,但听起来您想要使用GOF composite pattern。 “Leaf”实现类可以轻松替换“singleTransaction”标志