【问题标题】:There must be a better way to code this :(必须有更好的编码方式:(
【发布时间】:2012-06-09 14:19:30
【问题描述】:

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

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

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

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

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

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

帮助:)

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 ...
  ...
}

【问题讨论】:

  • 是的,显然是复合材料。例如。如果你想在组合中搜索某些东西,总是首先检查你是否满足谓词(然后返回 this 或其他东西),否则在所有子节点上调用 find。

标签: java design-patterns generics


【解决方案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; 
    }
}

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

【讨论】:

  • 我对依赖注入了解不多……请问这里如何应用?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    Item 18: Prefer Interfaces to Abstract Classes中的Effective Java 2nd Edition中带有建议的复合模式(骨架实现)。
    • 使用方法 count()find()sort() 定义一个 iterface (EntityCollection) , remove()
    • 抽象类DatabaseContainerObject实现EntityCollection接口
    • SchemaTableCompositeIndex 类扩展DatabaseContainerObject 并实现EntityCollection 接口。这里 SchemaTableCompositeIndex 是 Composite Pattern 中的*Component*s

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多