1

介绍:

我为数据库过滤器构建了一个类层次结构:

class Filter {
}

class PropertyFilter<T> extends Filter {
  Boolean exists;
  T equal;
}

class ComparableFilter<T> extends PropertyFilter<T> {
  T greaterThan;
  T lessThan;
}

这样我可以PropertyFilter<String>用于字符串和ComparableFilter<DateTime>DateTime 对象。


棘手的部分:

我有一些过滤器查询构建器,它遵循与过滤器类相同的层次结构。查询构建器的每一方都应该只添加额外的查询。

例子:

class FilterQueryBuilder<T extends Filter> {
  protected final T filter;      

  public FilterQueryBuilder(T filter) {
    this.filter = filter;
  }

  public Query getQuery() {
    return new Query();
  }
}

class PropertyFilterQueryBuilder<T extends PropertyFilter<?>> extends FilterQueryBuilder<T> {
  public PropertyFilterQueryBuilder(T filter) {
    super(filter);
  }

  public Query getQuery() {
    Query query = super.getQuery();
    if(filter.exists != null) addExistsQuery(query, filter.exists);
    if(filter.equal != null) addEqualQuery(query, filter.equal);
    return query;
  }
}

class ComparableFilterQueryBuilder<T extends ComparableFilter<?>> extends PropertyFilterQueryBuilder<T> {
  public ComparableFilterQueryBuilder(T filter) {
    super(filter);
  }

  public Query getQuery() {
    Query query = super.getQuery();
    if(filter.greaterThan != null) addGreaterThanQuery(query, filter.greaterThan);
    if(filter.lessThan != null) addLessThanQuery(query, filter.lessThan);
    return query;
  }
}

问题/问题:

如您所见,我总是必须调用super.getQuery()然后返回修改后的查询对象。

如果每个类只有一个这样的方法会容易得多addFiltersToQuery

addFiltersToQuery() {
  if(filter.x != null) addXQuery(query, filter.x);
  if(filter.y != null) addYQuery(query, filter.y);
}

但是我当然会用我的类层次结构覆盖这个方法。虽然如果我addFiltersToQueryFilterQueryBuilder课堂上打电话,我只会得到最新的实现。

有没有办法在不使用的情况下调用所有实现super

4

1 回答 1

0

我现在建立了一些方法来解决这个问题:

class FilterQueryBuilder<T extends Filter> {
  private final T filter;
  private List<Consumer<Query>> queryConsumers = new ArrayList<>();

  public FilterQueryBuilder(T filter) {
    this.filter = filter;
  }

  protected void addQueryConsumer(Consumer<Query> consumer) {
     queryConsumers.add(consumer);
  }

  public Query getQuery() {
    Query query = new Query();
    queryConsumers.forEach(c -> c.accept(query));
    return query;
  }
}

class PropertyFilterQueryBuilder<T extends PropertyFilter<?>> extends FilterQueryBuilder<T> {
  public PropertyFilterQueryBuilder(T filter) {
    super(filter);
    addQueryConsumer(query -> {
      if(filter.exists != null) addExistsQuery(query, filter.exists);
      if(filter.equal != null) addEqualQuery(query, filter.equal);
    });
  }
}

class ComparableFilterQueryBuilder<T extends ComparableFilter<?>> extends PropertyFilterQueryBuilder<T> {
  public ComparableFilterQueryBuilder(T filter) {
    super(filter);
    addQueryConsumer(query -> {
      if(filter.greaterThan != null) addGreaterThanQuery(query, filter.greaterThan);
      if(filter.lessThan != null) addLessThanQuery(query, filter.lessThan);
    });
  }
}

每个类将其查询添加写入queryConsumers数组,并且FilterQueryBuilder该类应用所有这些消费者。

于 2015-07-27T10:15:21.780 回答