【问题标题】:Visitor pattern and composite pattern访客模式和复合模式
【发布时间】:2015-08-04 07:57:05
【问题描述】:

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

我对具体访问者类的实现有点困惑。

这是我目前的做法:

我的附加课:

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

现在对于访问者模式,这里有一个具体的访问者,它应该评估给定的表达式(我还想要一个进行类型检查、漂亮打印等的具体访问者)。

class
    EVALUATE_VISITOR

inherit
    VISITOR

create
    make

feature -- attribs
    value : INTEGER
    value_bool : BOOLEAN

feature -- ctor
    make
        do

        end

feature

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

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

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

但是我的结构中必须有许多接受方法,对于算术表达式,它必须返回 INTEGER,而对于逻辑运算,它必须返回 BOOLEAN。

【问题讨论】:

    标签: design-patterns composite visitor-pattern eiffel


    【解决方案1】:

    实际上这样做的方法如下:

        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
    

    这是在计算 INTEGER 加法的访问者中。 `last_value' 属性在您的访问者类中定义。

    要回答您的其他问题,在 ADDITION 类中您不需要“评估”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      相关资源
      最近更新 更多