Java - 相同类结构的多个访问者模式

时间:2016-12-07 21:21:03

标签: java design-patterns visitor visitor-pattern dynamic-binding

所以我有一个由二进制表达式,一元表达式组成的表达式的类结构,所有这些都是抽象的,这些扩展到它们具体的具体操作类,如Add,Sub,Mul,Not等......就像这样。

Class Structure

我想为每个类创建2个访问者。一个用于toString,另一个用于评估表达式(计算值)。

问题是,我的toStringVisitor应该总是返回一个String,但evaluateVisitor将根据操作返回变量类型(即:Add将返回一个int,Lower than或Not将返回一个boolean,其他一些将返回其他类型以及)

我可以避免为这两位访问者创建2个访问者界面吗?

例如我现在所拥有的

public interface Visitor {

Public int visit(Neg c);
Public int visit(Add c);
Public int visit(Sub c);
Public int visit(Mul c);
Public boolean visit(Lowerthan c);
Public boolean visit(Greaterthan c);
Public boolean visit(Equal c);
Public boolean visit(Not c);
Public boolean visit(And c);
Public boolean visit(Or c);

}

仅适用于evaluateVisitor,而不适用于toString访客。

另外,使用例如:

之间有什么区别
Public int visit(Neg c);
Public int visit(Add c);
Public int visit(Sub c);
Public int visit(Mul c);

Public int visitNeg(Neg c);
Public int visitAdd(Add c);
Public int visitSub(Sub c);
Public int visitMul(Mul c);

我被告知我应该区分访问方法以避免动态绑定问题,但我无法弄清楚为什么会出现这种情况。

1 个答案:

答案 0 :(得分:4)

您可以将访客设为通用:

interface Visitor<R> {
    R visit(Neg c);
    ...
}

因此,您的ToStringVisitor将实施Visitor<String>,其他两个将实施Visitor<Integer>Visitor<Boolean>

关于使用visit()和visitNeg(),这是一个选择问题。有些人认为使用不同的名称会使API混乱。有些人觉得使用重载会使事情变得更复杂,容易出错。我个人不是超载的忠实粉丝。