Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当访问者类型取决于访问者类型时的Java访问者模式_Java_Design Patterns_Visitor Pattern - Fatal编程技术网

当访问者类型取决于访问者类型时的Java访问者模式

当访问者类型取决于访问者类型时的Java访问者模式,java,design-patterns,visitor-pattern,Java,Design Patterns,Visitor Pattern,我正试图找出我目前的问题所需要的正确方法(和模式)。一切似乎都在引导我走向访问者模式,而维基百科几乎正是我所需要的。但是,我的问题是,我正在从数据库中检索这些CarElements,需要根据我请求的CarElements类型创建正确的访问者。例如,如果我检索到挡风玻璃的列表,我想传入CarElementWashVisitor。在这里,我感觉自己与模式背道而驰,但在不检查子类类型的情况下,我不确定正确的方法是什么。我基本上需要一些方法来根据对象的运行时类型确定要做什么。下面是我在上面链接到的维基百

我正试图找出我目前的问题所需要的正确方法(和模式)。一切似乎都在引导我走向访问者模式,而维基百科几乎正是我所需要的。但是,我的问题是,我正在从数据库中检索这些
CarElement
s,需要根据我请求的
CarElement
s类型创建正确的访问者。例如,如果我检索到
挡风玻璃
的列表,我想传入
CarElementWashVisitor
。在这里,我感觉自己与模式背道而驰,但在不检查子类类型的情况下,我不确定正确的方法是什么。我基本上需要一些方法来根据对象的运行时类型确定要做什么。下面是我在上面链接到的维基百科示例的摘要部分:

interface CarElementVisitor {
    void visit(Wheel wheel);
    void visit(Engine engine);
    void visit(Body body);
    void visit(Car car);
}

interface CarElement {
    void accept(CarElementVisitor visitor); // CarElements have to provide accept().
}

class CarElementPrintVisitor implements CarElementVisitor { /**/ }

class CarElementDoVisitor implements CarElementVisitor { /**/ }
更新:

事实证明,这个问题其实很简单(如下面公认的答案所示)。以下是我一直在寻找的:

class MyVisitor implements CarElementVisitor {
    private MyService carwashService;

    /* visit(Wheel w), visit(Engine e)... etc */

    void visit(Windshield w) {
        carwashService.wash(w);
    }
}

需要帮忙吗

class FindTheRightVisitorVisitor implements CarElementVisitor {
    private CarElementVisitor theVisitor;
    ... getter etc ...
    void visit(Windshield w) {
        if (theVisitors == null) {
            theVisitors = new CarElementWashVisitor();
        }
    }
}
并在此处使用:

CarElement root = ...;
CarElementVisitor findIt = new FindTheRightVisitorVisitor();
root.accept(findIt);
CarElementVisitor theRightVisitor = findIt.getTheVisitor();
root.accept(theRightVisitor);

需要帮忙吗

class FindTheRightVisitorVisitor implements CarElementVisitor {
    private CarElementVisitor theVisitor;
    ... getter etc ...
    void visit(Windshield w) {
        if (theVisitors == null) {
            theVisitors = new CarElementWashVisitor();
        }
    }
}
并在此处使用:

CarElement root = ...;
CarElementVisitor findIt = new FindTheRightVisitorVisitor();
root.accept(findIt);
CarElementVisitor theRightVisitor = findIt.getTheVisitor();
root.accept(theRightVisitor);

是的,这实际上比我需要的要多,我意识到我只需要一个访问者(每种类型都有方法),访问者调用或委托给实际逻辑,因为它知道在那一点上调用哪个服务。谢谢是的,这实际上比我需要的要多,我意识到我只需要一个访问者(每种类型都有方法),访问者调用或委托给实际逻辑,因为它知道在那一点上调用哪个服务。谢谢如果访问者是唯一的,则可以将其作为静态值存储在每个car元素类中。但这似乎不是因为一个挡风玻璃也可以访问打印访问者。因此,也许每个具体访问者类都有一组允许的具体访问者,反之亦然。wash访问者是do访问者的子类吗?正确,访问者实际上是一个弹簧注入组件。不必是DoVisitor的子类,只需实现
CarElementVisitor
。如果访问者是唯一的,则可以将其作为静态值存储在每个car元素类中。但这似乎不是因为一个挡风玻璃也可以访问打印访问者。因此,也许每个具体访问者类都有一组允许的具体访问者,反之亦然。wash访问者是do访问者的子类吗?正确,访问者实际上是一个弹簧注入组件。不必是DoVisitor的子类,只需要实现
CarElementVisitor