访问者模式和复合模式
Visitor pattern and composite pattern
我正在尝试开发一种构造算术和逻辑表达式并对其执行运算的方法。对于结构,我使用复合模式,对于操作,我使用访问者模式。
我对具体访问者的实现有点困惑class。
这是我目前的做法:
我的补充class:
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
我的问题是,我的每个结构(ADDITION、SUBTRACTION、NEGATION 等)中的求值方法是否会破坏访问者模式的目的,因为所有求值都应该在访问者中完成class?那么我如何在访问者 class 中实现它呢?我在想我可以做类似的事情:
visit_addition (expression : ADDITION)
do
value := expression.left_expression.accept(Current) +
expression.right_expression.accept(Current)
end
但是我的结构中必须有许多接受方法,对于算术表达式,它必须是 return INTEGER,对于逻辑运算,它必须是 return BOOLEAN。
实际上,执行此操作的方法如下:
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' 属性在您的访问者 class.
中定义
要回答您的其他问题,在 ADDITION class 中您不需要“评估”。
我正在尝试开发一种构造算术和逻辑表达式并对其执行运算的方法。对于结构,我使用复合模式,对于操作,我使用访问者模式。
我对具体访问者的实现有点困惑class。
这是我目前的做法:
我的补充class:
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
我的问题是,我的每个结构(ADDITION、SUBTRACTION、NEGATION 等)中的求值方法是否会破坏访问者模式的目的,因为所有求值都应该在访问者中完成class?那么我如何在访问者 class 中实现它呢?我在想我可以做类似的事情:
visit_addition (expression : ADDITION)
do
value := expression.left_expression.accept(Current) +
expression.right_expression.accept(Current)
end
但是我的结构中必须有许多接受方法,对于算术表达式,它必须是 return INTEGER,对于逻辑运算,它必须是 return BOOLEAN。
实际上,执行此操作的方法如下:
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' 属性在您的访问者 class.
中定义要回答您的其他问题,在 ADDITION class 中您不需要“评估”。