如何设计不在/排除查询行为

时间:2014-06-13 06:55:07

标签: java design-patterns solid-principles

标题可能不是很清楚,但我找不到更好的标题。这是问题所在。我有一个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原则?我们是否应该在设计模式下对问题进行分类,从而得出解决方案?

2 个答案:

答案 0 :(得分:1)

在我看来,问题的根源在于这句话:

  

另一种类型的范围表示查询除了提供的页面以外的所有页面“。

范围与查询无关,它应该只代表所有元素的子集。您似乎想以不同的方式执行查询,因此我建议在QueryEngine中使用新方法:

interface QueryEngine{
  void query(Scope scope){
    ...
  }
  void queryComplement(Scope scope) {
    ...
  }
} 

答案 1 :(得分:1)

一种可能性是执行控制反转:QueryEngine询问Scope是否处理网页,Scope单独回答true或{{ 1}},类似于

false