java23种设计模式-行为型模式之解释器模式

作者 薛之谦chj 转载请注明出处

我的知乎:https://zhuanlan.zhihu.com/c_1229107265379897344



内容简介:


定义:

Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.

给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

简介:

解释器模式是一种按照规定的语法(文法)进行解析的模式。

就比如编译器可以将源码编译解释为机器码,让 CPU 能进行识别并运行。解释器模式的作用其实与编译器一样,都是将一些固定的文法(即语法)进行解释,构建出一个解释句子的解释器。

简单理解,解释器是一个简单语法分析工具,它可以识别句子语义,分离终结符号和非终结符号,提取出需要的信息,让我们能针对不同的信息做出相应的处理。

解释器模式 核心:识别文法,构建解释

主要解决:

如果存在一种特定类型的问题,该类型问题涉及多个不同实例,但是具备固定文法描述,那么可以使用 解释器模式 对该类型问题进行解释,分离出需要的信息,根据获取的信息做出相应的处理。

简而言之,对于一些固定文法构建一个解释句子的解释器。

优缺点:

优点

扩展性强:在 解释器模式 中由于语法是由很多类表示的,当语法规则更改时,只需修改相应的非终结符表达式即可;若扩展语法时,只需添加相应非终结符类即可;

增加了新的解释表达式的方式;

易于实现文法:解释器模式 对应的文法应当是比较简单且易于实现的,过于复杂的语法并不适合使用 解释器模式 ;

缺点

语法规则较复杂时,会引起类膨胀:解释器模式 每个语法都要产生一个非终结符表达式,当语法规则比较复杂时,就会产生大量的解释类,增加系统维护困难;

执行效率比较低:解释器模式 采用递归调用方法,每个非终结符表达式只关心与自己有关的表达式,每个表达式需要知道最终的结果,因此完整表达式的最终结果是通过从后往前递归调用的方式获取得到。当完整表达式层级较深时,解释效率下降,且出错时调试困难,因为递归迭代层级太深;

使用场景:

一些重复出现的问题可以用一种简单的语言来进行表达;

一个简单语法需要解释的场景;

具体实现:

解释器模式(Interpreter)

解释器模式是我们暂时的最后一讲,一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄,先看看图:

Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下:

接口类:

实现类:

Context类:

测试类:

最后输出正确的结果:3

你可能感兴趣的:(java23种设计模式-行为型模式之解释器模式)