3

有人告诉我“为数据库对象建模一个抽象容器,该容器构造接受子变量的可变参数,然后在不重复代码的情况下公开一些子检查功能”。

这暗示了“计算孩子的数量”、“按标识符查找”等内容。

为简单起见,下面的代码只有一个来自基本抽象 DatabaseObject 类型的字段(即名称),但真正的代码具有诸如“标识符”之类的东西和一些复杂的元数据查找噱头。

这个想法当然很有用,但只要看看我开始编写的代码就让我想吐:如果我继续沿着这条路走下去,那将是一个纠缠的弗兰肯斯坦。有什么办法可以把它变成像样的Java?有什么设计模式可以参考吗?(想到复合...)

前提:要共享的实际功能很有用,并且确实适用于任何潜在的可嵌套类型(模式有表,表有列,复合索引有子索引等),尤其是标识符查找......

...但是“必须有更好的方法”。我感觉到我内心的声音在说“每当你写这样的代码时,就给自己一巴掌”。

帮助 :)

public abstract class DatabaseContainerObject<ChildType extends DatabaseObject>
    extends DatabaseObject {
  protected List<ChildType> children;
  public DatabaseContainerObject(String name, ChildType... children) {
    super(name);
    this.children = new ArrayList<ChildType>(children.length);
    this.children.addAll(Arrays.asList(children));
  }
  protected List<ChildType> getChildren() {
    return Collections.unmodifiableList(children);
  }
  ... count ...
  ... find ...
  ... sort ...
  ... remove ...
  ...
}
4

3 回答 3

1

想想策略模式(http://en.wikipedia.org/wiki/Strategy_pattern)。原因:

  1. 解耦数据和数据操作。
  2. 您可以在运行时更改算法(“count # of children”、“find by identifier”)。

我想,它是这样的:

public abstract class DatabaseContainerObject<ChildType extends DatabaseObject>
extends DatabaseObject {

    protected List<ChildType> children;

    private DataOperator dataOperator;

    public Object find(){
         return dataOperator.find(children);
    }

}

public interface DataOperator{
     public <ChildType extends DatabaseObject> find(List<ChildType> childList);
}

public Class GeneralDataOperator extends DataOperator{
    public <ChildType> find(List<ChildType> childList){
        //implements find; 
    }
}

然后,您可以使用依赖注入。

于 2012-06-09T15:50:24.460 回答
0

Composite 很快就浮现在脑海中,但您还应该研究装饰器模式。

Find 显然是递归的,但是 Count eg 在叶子对象上非常有限,在所有类型的节点上都差不多。

于 2012-06-09T14:42:28.697 回答
0

来自第 18 条建议的复合模式(骨架实现) :来自Effective Java 2nd Edition的Prefer Interfaces to Abstract Classes

  • 使用count()find()sort()remove()等方法定义一个 iterface ( EntityCollection )
  • 抽象类DatabaseContainerObject实现EntityCollection接口
  • SchemaTableCompositeIndex类扩展DatabaseContainerObject并实现EntityCollection接口。这里Schema , Table , CompositeIndex是 Composite Pattern 中的 *Component*s

优点是未来的类可以扩展DatabaseContainerObject或实现EntityCollection

于 2012-06-11T07:37:15.040 回答