类型:【行为型】
类图:
描述:
解释器模式,给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
优点:
解释器是一个简单语法分析工具,它最显著的优点就是拓展性,修改语法规则只要修改相应的非终结符表达式就可以了,若拓展语法,则只要增加非终结符类就可以了。
缺点:
- 解释器模式会引起类膨胀。每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来了非常多的麻烦。
- 解释器模式采用递归调用方法。每个非终结符表达式只关心与自己有关的表达式,每个表达式需要知道最终的结果,必须一层一层的剥茧,使用递归会使得调试非常复杂。
- 效率问题。解释器模式由于使用大量的循环和递归,效率不太理想。
使用场景:
- 重复发生的问题可以使用解释器模式。eg,多个应用服务器,各个日志的格式不同,但数据要素是相同的,按照解释器的说法就是终结符表达式都是相同的,但是非终结符表达式就需要制定了。
- 一个简单语法需要解释的场景。解释器模式一般用来解析比较标准的字符集,如SQL,不过这部分逐渐被专业工具代替了。
注意事项:
尽量不要在重要的模块中使用解释器模式,否则维护会是很大的问题。在项目中可以使用shell、JRuby、Groovy等脚本语言来代替解释器模式,弥补java编译型语言的不足。