Design patterns 访问者模式和复合模式

Design patterns 访问者模式和复合模式,design-patterns,composite,visitor,eiffel,Design Patterns,Composite,Visitor,Eiffel,我试图开发一种方法来构造算术和逻辑表达式,并对它们执行操作。对于结构,我使用复合模式,对于操作,我使用访问者模式 我对具体的visitor类的实现有点困惑 以下是我目前的做法: 我的附加类: class ADDITION inherit BINARY create make feature -- ctor make (left : EXPRESSION ; right : EXPRESSION) do left_exp

我试图开发一种方法来构造算术和逻辑表达式,并对它们执行操作。对于结构,我使用复合模式,对于操作,我使用访问者模式

我对具体的visitor类的实现有点困惑

以下是我目前的做法:

我的附加类:

class
    ADDITION

inherit
    BINARY

create
    make

feature -- ctor
    make (left : EXPRESSION ; right : EXPRESSION)
        do
            left_expression := left
            right_expression := right
        end

feature -- deferred implementation
    evaluate : INTEGER
        do
            Result := left_expression.evaluate + right_expression.evaluate
        end

    to_string : STRING
        do
            create Result.make_empty
        end

    accept (v : VISITOR)
        do
            v.visit_addition (Current)
        end
end
现在对于访问者模式,这里有一个具体的访问者,它应该对给定的表达式求值(我还需要一个具体的访问者,它执行类型检查、漂亮的打印等)

我的问题是,在我的每一个结构(加法、减法、否定等)中使用评估方法是否会违背访问者模式的目的,因为所有评估都应该在访问者类中完成?那么我如何在visitor类中实现它呢?我在想我可以做一些类似的事情:

visit_addition (expression : ADDITION)
    do
        value := expression.left_expression.accept(Current) +
                    expression.right_expression.accept(Current)
    end

但是,我的结构中必须有许多accept方法,对于算术表达式,它必须返回整数,对于逻辑运算,它必须返回布尔值。

实际上,实现这一点的方法如下:

    visit_addition (expression: ADDITION)
        local
            l_left_value, l_right_value: INTEGER
        do
            expression.left_expression.accept (Current)
            l_left_value := last_value

            expression.right_expression.accept (Current)
            l_right_value := last_value

            last_value := l_left_value + l_right_value
        end
这是在计算整数加法的访问者中。“last_value”属性是在访问者类中定义的

要回答你的另一个问题,在加法课上你不需要“评估”

    visit_addition (expression: ADDITION)
        local
            l_left_value, l_right_value: INTEGER
        do
            expression.left_expression.accept (Current)
            l_left_value := last_value

            expression.right_expression.accept (Current)
            l_right_value := last_value

            last_value := l_left_value + l_right_value
        end