设计模式之解释器模式
1. 什么是解释器模式
Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法。简单地说,Interpreter模式是一种简单的语法解释器构架。
换一种解释就是定义一个语法, 定义一个解释器,该解释器处理该语法句子将某些复杂问题,表达为某种语法规则,然后构建解释器来解释处理这类句子。
解释器模式的结构:
- Context:解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。
- AbstractExpression:解释器抽象类。
- ConcreteExpression:解释器具体实现类。
优缺点:
优点:
- 容易修改,修改语法规则只要修改相应非终结符即可
- 扩展方便,扩展语法,只要增加非终结符类即可
缺点:
- 对于复杂语法的表示会产生复杂的类层次结构,不便管理和维护
- 解释器采用递归方式,效率会受影响
一般的适用场景:
- 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
- 该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
- 效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
使用时的注意事项:
- 尽量不要在重要的模块中使用解释器模式
- 解释器模式在实际的系统开发中使用的非常少
- 可以考虑一下Expression4J、MESP、Jep等开源的解析工具包
2. 具体的实例
有一个大数据的项目,大数据统计项目遇到了问题:
按照计算模型对现有数据统计、分析、预测,一般的计算模型是一个或多个运算公式,通常是加减乘除四则运算,设计方案要有高扩展性。
计算模型的设计:
计算模型按正常算术方式书写,解释器处理语法逻辑
计算模型里有两类符号:数据和计算符
用逆波兰算法分析算式语法
用解释器模式处理数据。
这里项目中其实就是要使用解释器来计算符号公式。 解释的意思就是用一种方式或语法来执行他。
项目设计的类图如下所示:
.png)
具体的代码如下:
AbstractExpresstion:抽象表达式:
1 | public abstract class AbstractExpresstion { |
VarExpresstion:
1 | public class VarExpresstion extends AbstractExpresstion { |
具体的”加减乘除“运算符:
1 | public class AddExpresstion extends SymbolExpresstion { |
1 | public class SubExpresstion extends SymbolExpresstion { |
1 | public class MultiExpresstion extends SymbolExpresstion { |
1 | public class DivExpresstion extends SymbolExpresstion { |
逆波兰实现,具体就是统一的实现运算的,让计算表达式转换成为逆波兰表达式,然后可以实现按运算符运算顺序规则的运算。
1 | public class RPN { |
底部的计算器:
1 | public class Calculator { |
测试类:
1 | public class MainTest { |
看一下输出吧,就是实现了表达式的运算:
.png)