前言
文章内容主要参考了刘伟主编的《设计模式(第2版)》,同时也结合了自己的一些思考和理解,希望能帮到大家。
本篇讲解释器模式,但这个模式其实很少使用,很少有适用的场景。我们更多学习其中的思想加深我们对面向对象的思想的理解。同时也会学习一下表示一个语言的文法规则已经如何构造一棵抽象语法树
正文
一、定义
解释器模式(Interpreter Pattern):定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码,它是一个类行为型模式。
就比如Java语言无法直接解释类似“1 + 2 + 3 - 4 + 1”的字符串,我们可以定义一套文法规则来实现对这些语句的解释,即一个自定义语言
二、情景假设
现在需要构造一个语言解释器,使得系统可以执行整数间的乘、除和求模运算。例如用户输入表达式“3 * 4 / 2 % 4”,输出结果为2。使得解释器模式实现该功能。
在进一步分析之前我们先学习一下文法规则和抽象语法树
-
文法规则
文法规则就是用来表示一个语言的,让我们清楚了解其中语言逻辑结构。
解释一下就是:
表达式(expression)是由值(value)或操作(operation)构成。
操作(operation)是由1.表达式+表达式 或者2.表达式-表达式 两种构成
值(value)就是由一个整数值构成
其实上面的operation就是一种无限套娃的存在,所以operation就是非终结符表达式,因为其组成元素害可以是表达式,而value就是终结符表达式,不可以再分解。 -
抽象语法树
非终结符就是可拆分的情况,而终结符即不可拆分。
经过上面学习我们便可以进行情景分析及设计。比如上述情景的抽象语法树:
三、情景分析
关于上面情景的类图(具体分析在下面)
首先经过上面的抽象语法树制作和文法规则,我们知道表达式由非终止符表达式和终止符表达式构成,所以为了统一处理我们会构建一个抽象表达式类(本类图中就称为Node),之后分为两个子类实现对应着终止符表达式(本类图中称为ValueNode)和非终止符表达式(SymbolNode),然后非终止符表示类对于每一个符号都有个子类去具体实现。
抽象表示类Node
public interface Node
{
public int interpret();//解释当前结点,相当于计算当前结果
}
终止符表达式类ValueNode
public class ValueNode implements Node{
private int value;
public ValueNode(int value){
this.value = value;
}
public int interpret(){
//因为当前终止符就是当前值的意思,所以直接返回当前值
return this.value
}
}
非终止符表达式抽象类SymbolNode
注意这里是抽象,是因为我们会在子类中对于每一个字符进行具体实现
public class SymbolNode implements Node{
protected Node left;
protected