当访问者类型取决于访问者类型时的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
。