《Java设计模式及实践》—3.3 解释器模式
3.3 解释器模式
计算机用来解释句子或表达式。当需要编写一系列处理这种需求的代码时,首先要知道句子或表达式的结构,要有一个表达式或句子的内部表示。多数情况下,最合适的结构是基于组合模式的组合结构。我们将在第4章中进一步讨论组合模式。现在可以将组合表示视为将相似性质的对象集合在一起。
1.目的
解释器模式定义语法的表示以及该语法的对应解释。
2.实现
解释器模式使用组合模式来定义对象结构的内部表示。除此之外,它还添加了实现来解释表达式并将其转换为内部结构。因此,解释器模式属于行为型模式。解释器模式的类图如图3-4所示。
图 3-4
解释器模式由以下类组成:
Context(环境):Context用于封装解释器的全局信息,所有具体的解释器均需访问Context。
AbstractExpression(抽象表达式):一个抽象类或接口,声明执行的解释方法,由所有具体的解释器实现。
TerminalExpression(终结符表达式):一种解释器类,实现与语法的终结符相关的操作。终结符表达式必须始终被实现和实例化,因为它表示表达式的结尾。
NonTerminalExpression(非终结符表达式):这是实现语法的不同规则或符号的类。对于每一个语法都应该创建一个类。
在实践当中,解释器模式用来解释正则表达式。为这种场景实现解释器模式是一个很好的练习,这里我们选择一个简单的语法作为例子。我们将应用解释器模式来解析带有一个变量的简单函数f (x)。
为了简单,我们选择逆波兰表示法,这是一种在运算符末尾添加操作数的表示法。1 + 2变为1 2 +, (1 + 2)* 3变为1 2 + 3 *。优点是不再需要括号,因此它简化了任务。
下面的代码为表达式创建了接口:
实现具体类需要下列元素:
Number(数字)类:它解释所有数字。
Operatorc((操作符)+、-、*、/)类:在下面的例子中,将使用加号(+)和减号(-)。
现在到了复杂的部分,我们需要实现操作符类,操作符类是组合表达式,由两个表达式组合而成:
类似地,接下来实现一个减号类:
可以看到,我们已经创建了一个类,该类允许我们构建一棵这样的语法树:操作是节点,变量和数字是叶子。结构非常复杂,可用于解释表达式。
现在写一段代码,通过建立好的类来实现语法树:
3.适用情况和示例
解释器模式适用于表达式被解释并转换为其内部表示的情况。内部表示是基于组合模式的,因此解释器模式不适用于复杂的语法。
Java在java.util.Parser中实现了解释器模式,它用于解释正则表达式。在解释正则表达式时返回匹配器对象。匹配器使用基于正则表达式的模式类创建的内部结构:
- 点赞
- 收藏
- 关注作者
评论(0)