【问题标题】:Visitor Design Pattern with Binary Expression Trees具有二元表达式树的访问者设计模式
【发布时间】:2019-10-04 08:01:26
【问题描述】:

我目前正在尝试重构一些代码以实现访问者设计模式,但我无法从概念上理解正在发生的事情。

当前代码基于字符数组(即表达式)创建二叉表达式树,然后按前缀顺序遍历树(使用 Tree 类中的 traverse 方法,树也是在其中构造的),然后求值“计算器”类中的表达式,它实现了“IVisitor”接口。为这个类提供的唯一方法是一个访问方法,它返回一个对象并且需要一个节点作为它的参数。我的 Node 类有一个 accept 方法(以 IVisitor 对象作为参数)应该与 visit 方法交互。

我不确定这些部分应该如何组合在一起,我观看了无数 YouTube 视频,试图弄清楚如何将访问者设计模式应用于此。

任何想法都将不胜感激,如果您需要查看任何代码,请随时提出。

谢谢!

【问题讨论】:

    标签: java tree binary-tree visitor-pattern


    【解决方案1】:

    我忘记了不同类型的运算符(字符)和操作数(双精度)。一旦我意识到这一点,在 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());
    

    这会将值返回给原始的 accept() 调用,并将在此实例中将两个值相加。

    响应保存以备后用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多