gpt4 book ai didi

java - 定义一个以接口(interface)作为值的映射,并在同一接口(interface)内声明

转载 作者:行者123 更新时间:2023-12-01 22:40:13 25 4
gpt4 key购买 nike

我正在尝试理解Java中的解释器设计模式。我从 Wikipedia 获取以下代码。里面写着

interface Expression {
public int interpret(Map<String,Expression> variables);
}

您能解释一下这里发生的情况吗?表达式是 Map 的值,它位于表达式类型的接口(interface)中。类似于递归调用吗?请解释一下。

最佳答案

为了回答你的问题,是的,相同的函数 interpret() 被一次又一次调用,但它们不属于同一类。因此它实际上不是递归函数。

使用 wiki 代码来解释解释器模式,但您需要来回 wiki 页面才能了解整个情况,

http://en.wikipedia.org/wiki/Interpreter_pattern

解释器模式是一种将给定表达式中的每个变量和运算符表示为一个单独的类,然后对这些类的对象进行求值的模式。

表达式 - 类,表达式 - ((y+z)-x)

就您指出的 wiki 示例而言,当您在 main() 中调用 Evaluator 的构造函数时,只会构造表达式(又是另一个 Expression 对象)并保存在Evaluator 的 syntaxTree 引用变量。

用表达式给出发生的情况的要点:x y z + -

  1. 第一个变量x,y,z将被存储在expressionStack变量中
  2. 当遇到+时,(y+z)会被压入表达式栈
  3. - 标记之后,((y+z)-x) 表达式对象将位于 expressionStack 中(检查压入和弹出Evaluator 中的运算符(operator)正在发生这种情况)

因此,一旦 Evaluator 的构造函数完成,您将拥有 Expression 对象,其实现又是一个表达式,表示为 ((y+z)-x)

现在是 main() 中有趣的部分,您使用 Number 替换变量 (x,y,z) 的值类并按此顺序发生,

  1. main () 句子.interpret(变量);  

  2. Evaluator.syntaxTree.interpret(variables);

  3. Variable.interpret(variables)//这里用实际值 (5,10,42) 替换 x, y, z。

然后计算表达式

如果您看到 Variables 类的 interpret(),它获取变量对应的 Number 对象的位置略有不同,使用上下文已经过去了。这是使用 main() 中传递的上下文对象将变量实际替换为数字。这反过来又调用 Numberinterpret() ,它只返回数字,并且操作发生为 ((10+5)-42) = -27.

优点:

通过使用这种技术,您可以继续添加操作(加、减),而不影响现有操作,并且一个操作独立于其他操作。它用于 SQL 查询和其他解释器。

谢谢,普拉萨纳五世。

关于java - 定义一个以接口(interface)作为值的映射,并在同一接口(interface)内声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26290891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com