设计模式(27) -- 解释器模式

简介: 设计模式(27) -- 解释器模式

需求


1dc618a0ed9580ce8bfa6facb208c08f.png


分析


5d4c6812c8535adbb050f4ddf2e1bce8.png


解释器模式


基本介绍


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


原理图



66ba272a0bfc97be54a5fa679e3d5482.png


解释器模式实现四则运算


1dc618a0ed9580ce8bfa6facb208c08f.png

Expression

5d4c6812c8535adbb050f4ddf2e1bce8.png

SymbolExpression

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

SubExpression

66ba272a0bfc97be54a5fa679e3d5482.png

AddExpression

88b9988b40447cb37c7e3c492d49867f.png

VarExpression

80308c27701d3aead18db6c7b167f308.png

Calculator

1014213c4196c8798c8417b952a8a253.png

ClientTest

20190416165655169.png

运行结果:

1dc618a0ed9580ce8bfa6facb208c08f.png


spring源码使用解释器实例分析


5d4c6812c8535adbb050f4ddf2e1bce8.png


解释器模式的注意事项和细节


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


解释器模式的应用


解释器模式的优点


解释器是一个简单语法分析工具,它最显著的优点就是扩展性,修改语法规则只要修改

相应的非终结符表达式就可以了,若扩展语法,则只要增加非终结符类就可以了。


解释器模式的缺点


解释器模式会引起类膨胀


每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文

件,为维护带来了非常多的麻烦。


● 解释器模式采用递归调用方法


每个非终结符表达式只关心与自己有关的表达式,每个表达式需要知道最终的结果,必

须一层一层地剥茧,无论是面向过程的语言还是面向对象的语言,递归都是在必要条件下使的,它导致调试非常复杂。想想看,如果要排查一个语法错误,我们是不是要一个断点一个断点地调试下去,直到最小的语法单元。


● 效率问题


解释器模式由于使用了大量的循环和递归,效率是一个不容忽视的问题,特别是一用于

解析复杂、冗长的语法时,效率是难以忍受的。


解释器模式使用的场景


● 重复发生的问题可以使用解释器模式


例如,多个应用服务器,每天产生大量的日志,需要对日志文件进行分析处理,由于各个服务器的日志格式不同,但是数据要素是相同的,按照解释器的说法就是终结符表达式都是相同的,但是非终结符表达式就需要制定了。在这种情况下,可以通过程序来一劳永逸地解决该问题。


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


为什么是简单?看看非终结表达式,文法规则越多,复杂度越高,而且类间还要进行递归调用(看看我们例子中的栈)。想想看,多个类之间的调用你需要什么样的耐心和信心去排查问题。因此,解释器模式一般用来解析比较标准的字符集,例如SQL语法分析,不过该部分逐渐被专用工具所取代。


在某些特用的商业环境下也会采用解释器模式,我们刚刚的例子就是一个商业环境,而且现在模型运算的例子非常多,目前很多商业机构已经能够提供出大量的数据进行分析。


解释器模式的注意事项


尽量不要在重要的模块中使用解释器模式,否则维护会是一个很大的问题。在项目中可以使用shell、JRuby、Groovy等脚本语言来代替解释器模式,弥补Java编译型语言的不足。我们在一个银行的分析型项目中就采用JRuby进行运算处理,避免使用解释器模式的四则运算,效率和性能各方面表现良好。



相关文章
|
设计模式 移动开发 数据库
行为型设计模式10-解释器模式
行为型设计模式10-解释器模式
111 1
|
5月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
9月前
|
设计模式 SQL Java
【设计模式】抖音一面:你不知道解释器模式?
【设计模式】抖音一面:你不知道解释器模式?
80 1
|
9月前
|
设计模式 Go
[设计模式 Go实现] 行为型~解释器模式
[设计模式 Go实现] 行为型~解释器模式
|
9月前
|
设计模式 存储 Java
小谈设计模式(28)—解释器模式
小谈设计模式(28)—解释器模式
|
9月前
|
设计模式 存储 Java
23种设计模式,解释器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】解释器模式是一种行为设计模式,它用于定义一个语言的语法表示,并提供一个解释器来处理这种语法。主要用于频繁需要解释执行一组固定语法规则的场景,例如编程语言解释器、规则引擎等。
66 3
|
9月前
|
设计模式 存储 SQL
【设计模式系列笔记】解释器模式
解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言的文法,并且建立一个解释器来解释该语言中的句子。在Java中,解释器模式通常用于实现编程语言解释器、正则表达式解释器等。
97 0
|
9月前
|
设计模式
【设计模式】解释器模式
【设计模式】解释器模式
|
9月前
|
设计模式 监控 Java
聊聊Java设计模式-解释器模式
解释器模式(Interpreter Design Pattern)指给定一个“语言”,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。这里所指的“语言”是指使用规定格式和语法的代码。
104 4
聊聊Java设计模式-解释器模式
|
9月前
|
设计模式 Go 开发工具
Golang设计模式——18解释器模式
Golang设计模式——18解释器模式
65 0
Golang设计模式——18解释器模式