9

访问者模式(双重分派)就其本身而言是一种非常有用的模式,但如果将任何新成员添加到继承层次结构中,它经常被仔细检查是否会破坏接口,这是一个有效的观点。

但是在 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如果将来引入新类型,现在使用默认方法不再破坏客户端代码。

这是否使访客更易于采用和有用?

4

1 回答 1

4

您的问题包含隐式断言,即访客必须是interface. 由于访问者模式不是 Java 特定的,因此它不强制要求这样的实现。

事实上,世界各地有很多使用访问者abstract的类或同时使用但提供实现类的情况。interfaceabstract

尽管此注释具有在编译时检测未处理案例的可能性的有效点,但这仅适用于每个访问者始终必须为每个visit方法提供实现的情况。当您有很多案例时,这可能是一个相当大的代码膨胀(并且可能导致其他开发人员为他们的访问者编写自己的abstract基类)。

如前所述,并非每个人都以这种方式使用访问者模式。许多实现使用abstract类来提供空visit方法或visit委托给另一个visit采用更抽象类型的方法的方法。对于这些实现,添加新类型从来都不是问题。

而且,为了回答您的问题,当以不强制每个访问者为每个方法提供实现的方式使用访问者模式时,可以选择在接口中使用方法。但这并没有使访问者模式“更易于采用和有用”,因为它从来没有真正的问题。使用访问者类的选项一直存在。defaultabstract

于 2014-05-13T13:08:33.107 回答