访问者模式使用Java 8默认方法

Nar*_*hai 8 java oop design-patterns visitor-pattern default-method

访问者模式(双分派)是在其自己的权利非常有用的模式,但它经常被仔细检查是否有新的成员加入到继承层次,这是一个有效点突破的接口.

但是在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
   }
}
Run Code Online (Sandbox Code Playgroud)

现在使用默认方法,如果NewType将来引入新类型,则不会再破坏客户端代码.

这是否使访问者更容易接受和有用?

Hol*_*ger 4

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

\n\n

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

\n\n

虽然此注释有一个有效的观点,即可以在编译时检测未处理的情况,但这仅适用于每个访问者始终必须为每个visit方法提供实现的情况。当您有很多情况时,这可能会导致代码相当臃肿(并且可能导致其他开发人员abstract为其访问者编写自己的基类)。

\n\n

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

\n\n

而且,为了回答您的问题,当以不强制每个访问者为每个方法提供实现的方式使用访问者模式时,在接口中使用方法是一种选择。但它并没有使访问者模式\xe2\x80\x9c更容易采用和有用\xe2\x80\x9d,因为它从来没有真正的问题。使用访问者类别的选项始终存在。defaultabstract

\n