Java 如何设计不在/排除查询行为
标题可能不太清楚,但我想不出更好的。问题就在这里。我有一个作用域接口,它提供了查询引擎应该查询的所有页面Java 如何设计不在/排除查询行为,java,design-patterns,solid-principles,Java,Design Patterns,Solid Principles,标题可能不太清楚,但我想不出更好的。问题就在这里。我有一个作用域接口,它提供了查询引擎应该查询的所有页面 interface Scope{ Set<Page> getPages(); } interface QueryEngine{ void query(Scope scope){ queryIn(scope.getPages()); } } 在这种情况下,我必须在QueryEngine中执行以下操作 interface QueryEngine{
interface Scope{
Set<Page> getPages();
}
interface QueryEngine{
void query(Scope scope){
queryIn(scope.getPages());
}
}
在这种情况下,我必须在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();
}
接口范围{
设置getPages();
布尔值应排除();
}
我觉得上述两种方法都会导致QueryEngine中的if,else条件
这意味着它不会因修改而关闭
如何设计这样的行为?在解决任何设计问题时,应该遵循什么方法?我们是否应该首先检查是否遵循了坚实的原则?我们是否应该根据设计模式对问题进行分类,从而得出解决方案?在我看来,问题的根源在于这句话: 还有另一种类型的作用域,表示“查询除它提供的页面以外的所有页面” 范围与查询无关,它应该只表示所有元素的子集。您似乎希望以不同的方式执行查询,因此我建议在
QueryEngine
中使用新方法:
interface QueryEngine{
void query(Scope scope){
...
}
void queryComplement(Scope scope) {
...
}
}
一种可能性是执行控制反转:
查询引擎询问范围
是否处理页面,范围
独立回答真
或假
,类似于
interface Scope {
boolean process(Page page);
}
interface QueryEngine {
void query(Scope scope, Set<Page> pages) {
Set<Pages> pagesToProcess = new HashSet<Page>();
for (Page page : pages) {
if (scope.process(page)) {
pagesToProcess.add(page);
}
}
queryIn(pagesToProcess);
}
}
class IncludeScope implements Scope {
private static final Set<Page> INCLUDING_PAGES = ...
public boolean process(Page page) {
return INCLUDING_PAGES.contains(page);
}
}
class ExcludeScope implements Scope {
private static final Set<Page> EXCLUDING_PAGES = ...
public boolean process(Page page) {
return !EXCLUDING_PAGES.contains(page);
}
}
接口范围{
布尔过程(第页);
}
接口查询引擎{
无效查询(范围、设置页面){
Set pagesToProcess=new HashSet();
用于(第页:页){
if(范围、流程(第页)){
pagesToProcess.add(第页);
}
}
查询(页面处理);
}
}
类IncludeScope实现作用域{
私有静态最终集,包括_页面=。。。
公共布尔进程(第页){
返回,包括页面。包含(第页);
}
}
类ExcludeScope实现作用域{
私有静态最终集,不包括_页面=。。。
公共布尔进程(第页){
返回!不包括页面。包含(页面);
}
}
如果您的ExcludeScope
返回了不应处理的页面,我会说您的接口契约被破坏了-如果您声明接口方法返回了要处理的页面,那么返回不应使用ExcludeScope
处理的页面是矛盾的。是的,我同意。是否应该有操作员在这种情况下,基于操作的方法?如非用于排除的运算符,或所有页面中用于查询的运算符?您还可以反转控件-例如,QueryEngine
为每个页面询问是否应处理页面,并且scope
返回true
或false
-然后,您的ExcludeScope
实现可以只保留一个不被处理的页面列表并对照它们进行检查。这很有意义,查询方法应该反映它对范围的作用。如果您同意,您可以将答案标记为正确吗?
interface Scope {
boolean process(Page page);
}
interface QueryEngine {
void query(Scope scope, Set<Page> pages) {
Set<Pages> pagesToProcess = new HashSet<Page>();
for (Page page : pages) {
if (scope.process(page)) {
pagesToProcess.add(page);
}
}
queryIn(pagesToProcess);
}
}
class IncludeScope implements Scope {
private static final Set<Page> INCLUDING_PAGES = ...
public boolean process(Page page) {
return INCLUDING_PAGES.contains(page);
}
}
class ExcludeScope implements Scope {
private static final Set<Page> EXCLUDING_PAGES = ...
public boolean process(Page page) {
return !EXCLUDING_PAGES.contains(page);
}
}