design-patterns - 为什么不在访问者模式中重载 "visit"方法呢?

标签 design-patterns visitor-pattern

这是访问者设计模式的上下文/示例代码:

public interface Visitable{
    public void accept(Visitor v);
}

public class Book implements Visitable{
    public void accept(Visitor v){
        v.visit(this);
    }
    public void read() {}
    /**
    book stuff
    **/
}
public class Movie implements Visitable{
    public void accept(Visitor v){
        v.visit(this);
    }
    public void watch() {}
    /**
    movie stuff
    **/
}

public interface Visitor{
    public void visit(Book b);
    public void visit(Movie m);
}

public class Person implements Visitor{
    public void visit(Book b){
        b.read();
    }
    public void visit(Movie m){
        m.watch();
    }
}

我的导师说重载 visit 方法不是一个好主意,我应该为每个访问方法指定一个不同的名称,如下所示。我不相信这个想法。有人可以解释一下重载 visit 方法有什么缺点吗?

public interface Visitor{
    public void visitBook(Book b);
    public void visitMovie(Movie m);
}

public class Person implements Visitor{
    public void visitBook(Book b){
        b.read();
    }
    public void visitMovie(Movie m){
        m.watch();
    }
}

最佳答案

John Vlissides 的书Pattern Hatching(GOF 作者之一,他的书有时被认为是设计模式的补充)解释了两种实现 Visitor 的方法的优点。

他说使用不同变量名称的原因是:

A more substantial advantage comes when there's a resonalbe default behavior, and subclasses tend to override just a few of the operations. When we overload, subclasses must override all of the functions; otherwise your friendly C++ compiler will probably complain that your selective overrides hide one or more of the base class operations. We get around this probelm when we give Visitor operations difference names. Subclasses can then redefine a subset of the operations with impunity. - Pattern Hatching p.36

关于design-patterns - 为什么不在访问者模式中重载 "visit"方法呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20462392/

相关文章:

design-patterns - 这种类似 monad 的函数式编程模式叫什么名字?

c++ - 对称访客模式

c++ - 混合双重分派(dispatch)和静态多态性

c# - Stateful Expression 访问者多次运行问题

iOS Networking API 设计模式思路?

.net - 审计日志方法的提示

javascript - 无法在对象文字中使用 jQuery 函数

C# 和设计模式 - 需要一个优雅的解决方案来解决常见问题

java - 动态派生类 - 访问者模式

访问者在子类节点上的 C++ 访问者模式丢失 "is a"关系