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

时间:2014-03-29 21:28:19

标签: java oop design-patterns visitor-pattern default-method

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,则不会再破坏客户端代码。

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

1 个答案:

答案 0 :(得分:3)

您的问题包含访客必须是interface的隐含断言。由于 Visitor 模式不是特定于Java的,因此它不会强制执行此类实现。

事实上,世界各地有很多用途,使用{em>访客的abstract类或使用interface但提供abstract实施同时上课。

虽然this comment具有在编译时检测未处理案例的可能性,但这仅适用于每个访问者始终必须为每个visit方法提供实现的情况。当你有很多案例时,这可能是一个非常繁琐的代码(并且可能会导致其他开发人员为他们的访问者编写自己的abstract基类。)

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

并且,为了回答您的问题,当使用访客模式时,不要强迫每个访客为每个方法提供实现,使用default接口中的方法是一种选择。但它并没有使 Visitor 模式“更具可接受性和实用性”,因为它从未出现过真正的问题。使用abstract访客类的选项始终存在。