树节点数据中实现聚合(或类似)方法的最佳模式

4

在实现对树型节点数据层次结构进行聚合(或类似操作)方法时,我遇到了一个问题。可以看到这里有些地方过度使用了泛型,这并不令我满意,因此我的问题是:是否有更好的方法来实现它(可能避免在向下的聚合方法中从对象进行强制类型转换)?

目前的情况(省略了无关细节):

public interface AggregableTreeData<T extends AggregableTreeData> {
  void aggregate(T from);   
}

public abstract class FruitTreeData<T extends FruitTreeData<?>> 
      implements AggregableTreeData<T> {

  private BigDecimal size = BigDecimal.ZERO;

  @Override
  public void aggregate(T from) {
    this.size = this.size.add(from.size);
  }
}

public class OrangeTreeData<T extends OrangeTreeData<?>> 
    extends  FruitTreeData<T> {

  private boolean ripened = false;

  @Override
  public void aggregate(T from) {
    this.ripened = this.ripened || from.ripened;
  }
}

此外,我还有一个执行树形数据聚合的方法,看起来像这样:
//child.getData() and node.getData() is of type <T extends AggregableTreeData<T>>
void aggregateNode(TreeNode node) {
  for (TreeNode child : node.getChildren()) {
    aggregateNode(child);
    node.getData().aggregate(child.getData());
  }
}

"这不令我满意,为什么?" - gontard
2
由于在Java方法覆盖中只有不变的参数类型才能工作,因此很难避免使用泛型。也许您可以看一下访问者模式 - gontard
不令人满意-因为泛型的唯一原因在于Java方法覆盖的限制,以及像“FruitTreeData<T extends FruitTreeData <?>>”这样的丑陋结构。然而,访问者模式似乎很有前途,如果可能的话,我会尝试并发布更好的解决方案。 - antoni.rasul
1个回答

1

看起来这很适合使用组合模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接