具有二叉表达式树的访问者设计模式
Visitor Design Pattern with Binary Expression Trees
我目前正在尝试重构一些代码以实现访问者设计模式,但我无法从概念上理解正在发生的事情。
当前代码基于字符数组(即表达式)创建二叉表达式树,然后按前缀顺序遍历树(使用树 class 中的遍历方法,其中树是也构造),然后计算 "Calculator" class 中的表达式,它实现了 "IVisitor" 接口。为此 class 提供的唯一方法是一个访问方法,该方法 returns 一个 Object 并且需要一个 Node 作为其参数。我的节点 class 有一个 accept 方法(以 IVisitor 对象作为参数)应该与访问方法交互。
我不太确定这些部分应该如何组合在一起,我观看了无数 YouTube 视频,试图找出如何将访问者设计模式应用于此。
如有任何想法,我们将不胜感激,如果您需要查看任何代码,请随时询问。
谢谢!
我忘记的是运算符(字符)和操作数(双精度)的不同类型。一旦我意识到这一点,在 visit() 方法中,我们可以检查节点是否是一个运算符(内部节点),进一步检查哪个运算符(+、-、/、*),然后调用左右两侧的 accept() 方法正确的节点(两者都转换为双打)与中间的实际运算符。
示例:
if (n.getContent() == (Object) '+')
d = (Double) n.getLeft().accept(this) + (Double) n.getRight().accept(this);
d 是一个 Double 变量。这将继续被调用,直到我们到达一个操作数(叶节点),我们通过以下方式在 visit() 方法中检查它:
// If node has no children, we are at an operand (Double)
if (n.getLeft() == null && n.getRight() == null)
return Double.parseDouble(n.getContent().toString());
这将 return 原始 accept() 调用的值,并将在此实例中将两个值加在一起。
正在回复以备后用。
我目前正在尝试重构一些代码以实现访问者设计模式,但我无法从概念上理解正在发生的事情。
当前代码基于字符数组(即表达式)创建二叉表达式树,然后按前缀顺序遍历树(使用树 class 中的遍历方法,其中树是也构造),然后计算 "Calculator" class 中的表达式,它实现了 "IVisitor" 接口。为此 class 提供的唯一方法是一个访问方法,该方法 returns 一个 Object 并且需要一个 Node 作为其参数。我的节点 class 有一个 accept 方法(以 IVisitor 对象作为参数)应该与访问方法交互。
我不太确定这些部分应该如何组合在一起,我观看了无数 YouTube 视频,试图找出如何将访问者设计模式应用于此。
如有任何想法,我们将不胜感激,如果您需要查看任何代码,请随时询问。
谢谢!
我忘记的是运算符(字符)和操作数(双精度)的不同类型。一旦我意识到这一点,在 visit() 方法中,我们可以检查节点是否是一个运算符(内部节点),进一步检查哪个运算符(+、-、/、*),然后调用左右两侧的 accept() 方法正确的节点(两者都转换为双打)与中间的实际运算符。
示例:
if (n.getContent() == (Object) '+')
d = (Double) n.getLeft().accept(this) + (Double) n.getRight().accept(this);
d 是一个 Double 变量。这将继续被调用,直到我们到达一个操作数(叶节点),我们通过以下方式在 visit() 方法中检查它:
// If node has no children, we are at an operand (Double)
if (n.getLeft() == null && n.getRight() == null)
return Double.parseDouble(n.getContent().toString());
这将 return 原始 accept() 调用的值,并将在此实例中将两个值加在一起。
正在回复以备后用。