gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:44:43 25 4
gpt4 key购买 nike

标题可能不是很清楚,但我想不出更好的标题。问题就在这里。我有一个 Scope 接口(interface),它提供了 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());
}
}
}

或者应该是由 boolean 值驱动的东西

interface Scope{
Set<Page> getPages();
boolean shouldExclude();
}

我觉得上述两种方法都会导致 QueryEngine 中出现 if, else 条件这意味着它不会因修改而关闭。

如何设计这样的行为?在解决任何设计问题时应该遵循什么方法?我们是否应该首先检查是否遵循了 SOLID 原则?我们是否应该在设计模式下对问题进行分类,从而得出解决方案?

最佳答案

一种可能性是执行控制反转:QueryEngine 询问 Scope 是否处理页面,Scope 回答独立地 truefalse,类似于

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

关于java - 如何设计不在/排除查询行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24199383/

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