标题可能不是很清楚,但我找不到更好的标题。这是问题所在。我有一个Scope接口,它提供了QueryEngine应该查询的所有页面。
interface Scope{
Set<Page> getPages();
}
interface QueryEngine{
void query(Scope scope){
queryIn(scope.getPages());
}
}
还有另一种类型的范围说明查询所有页面而不是它提供的页面。 我试图模仿这种行为。
interface ExcludeScope extends Scope{
}
在这种情况下,我必须在QueryEngine中执行类似下面的操作
interface QueryEngine{
void query(Scope scope){
if(scope instanceof ExcludeScope){
queryInPagesOtherThan(scope.getPages());
}else{
queryIn(scope.getPages());
}
}
}
或者它应该是由布尔值
驱动的东西interface Scope{
Set<Page> getPages();
boolean shouldExclude();
}
我觉得上述两种方法都会导致QueryEngine中的if,else条件 这意味着它不会因修改而关闭。
如何设计这样的行为?在解决任何设计问题时应该遵循的方法是什么?我们应该首先检查是否遵循了SOLID原则?我们是否应该在设计模式下对问题进行分类,从而得出解决方案?
答案 0 :(得分:1)
在我看来,问题的根源在于这句话:
另一种类型的范围表示查询除了提供的页面以外的所有页面“。
范围与查询无关,它应该只代表所有元素的子集。您似乎想以不同的方式执行查询,因此我建议在QueryEngine
中使用新方法:
interface QueryEngine{
void query(Scope scope){
...
}
void queryComplement(Scope scope) {
...
}
}
答案 1 :(得分:1)
一种可能性是执行控制反转:QueryEngine
询问Scope
是否处理网页,Scope
单独回答true
或{{ 1}},类似于
false