gpt4 book ai didi

Java设计模式: Enforce calling methods of all supertypes

转载 作者:太空宇宙 更新时间:2023-11-04 13:36:30 26 4
gpt4 key购买 nike

简介:

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

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);
}

但是我当然会用我的类层次结构覆盖这个方法。不过如果我打电话addFiltersToQuery里面FilterQueryBuilder类,我只会获得最新的实现。

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

最佳答案

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

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 类应用所有这些使用者。

关于Java设计模式: Enforce calling methods of all supertypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31638318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com