Visitor pattern (double dispatch)在它自己的权利中是一个非常有用的模式,但是如果将任何新成员添加到继承层次结构(这是一个有效点),它经常被仔细检查破坏接口。
但是在Java 8中引入默认方法之后,现在我们可以在接口中定义默认实现,客户端接口不会中断,客户端可以适当地优先采用更改的接口。
interface Visitor{
public void visit(Type1 type);
public void visit(Type2 type);
//added after the first version of visitor is released
default public void visit(NewType type){
//some default implementation
}
}
现在使用默认方法,如果将来引入新类型NewType
,则不会再破坏客户端代码。
这是否使访问者更容易接受和有用?
答案 0 :(得分:3)
您的问题包含访客必须是interface
的隐含断言。由于 Visitor 模式不是特定于Java的,因此它不会强制执行此类实现。
事实上,世界各地有很多用途,使用{em>访客的abstract
类或使用interface
但提供abstract
实施同时上课。
虽然this comment具有在编译时检测未处理案例的可能性,但这仅适用于每个访问者始终必须为每个visit
方法提供实现的情况。当你有很多案例时,这可能是一个非常繁琐的代码(并且可能会导致其他开发人员为他们的访问者编写自己的abstract
基类。)
如上所述,并非所有人都以这种方式使用访客模式。许多实现使用abstract
类来提供空的visit
方法或visit
方法,这些方法委托给另一个采用更抽象类型的visit
方法。对于这些实现,添加新类型永远不是问题。
并且,为了回答您的问题,当使用访客模式时,不要强迫每个访客为每个方法提供实现,使用default
接口中的方法是一种选择。但它并没有使 Visitor 模式“更具可接受性和实用性”,因为它从未出现过真正的问题。使用abstract
访客类的选项始终存在。