java 开发模式之十九 :解析器模式
2017-12-24 23:32
134 查看
原理或定義
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。属于行为类模式结构
AbstractExpression:声明一个抽象的Interpret方法,抽象语法树中所有的节点都必须实现该抽象方法。TerminalExpression:-实现和语法中末端符号相关的Interpret方法。在每个句子的末端符号中均需要一个TerminalExpression实例。
NonterminalExpression:另外一个实现了AbstractExpression 接口的类,用来处理语法树中非末端节点的语法。它含有下一个AbstractExpression(s)的引用,调用它每个子节点的Interpret方法。
Context:Interpreter方法所需要的信息的容器,该信息对Interpreter而言全局可见。充当几个AbstractExpresssion 实例之间的通讯频道。
類圖
使用場景
1、当有一个语言需要解释执行,并且你可以把该语言中的句子表示为一个抽象的语法树时,可使用解释器模式.而当存在以下情况时,该模式的效果最好:2、该文法简单,对于复杂的文法,文法的类层次变得庞大而无法管理.此时,语法分析程序生成器这样得工具时更好得选择。它们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可以节省时间;
3、效率不是一个关键的问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先把他们转换成另外一种形式.例如:正则表达式通常被转换成状态机。
優缺點
主要优点有:1. 解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。
缺点主要有:
1.解释器模式会引起类的膨胀:每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。
2.解释器模式采用递归调用方法:递归都是一个不推荐的方式(只在必要条件下使用),它将导致调试非常复杂。低。
它会引起效率、性能以及维护等问题,一般在大中型的框架型项目中能找到它的身影,如一些数据分析工具、报表设计工具、科学计算工具等,如果你确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,可以考虑一下Expression4J、MESP、Jep 等开源的解析工具包。
相关文章推荐
- Java开发中的23种设计模式之十九:备忘录模式(Memento)
- Java模式研究袖珍版之Flyweight模式-Java基础-Java-编程开发
- [转]Java B/S开发模式漫谈
- Java版AVG游戏开发入门[0]——游戏模式转换中的事件交互
- Java开发下的设计模式简单说明
- Java版AVG游戏开发入门[0]——游戏模式转换中的事件交互 推荐
- java开发模式-简单工厂模式
- 传智播客Java web之 JSP开发模式
- Java Web开发中几种经典模式
- java开发模式
- java web开发总结(二):linux + apache2.2(prefork模式) + jk1.2.26 + tomcat6负载均衡配置优化
- java web开发总结(二):linux + apache2.2(prefork模式) + jk1.2.26 + tomcat6负载均衡配置优化
- 使用Java开发Domino业务应用的设计模式 (cont. 1)
- Java B/S开发模式漫谈 (转)
- 可扩展的Java应用程序开发模式-Java基础-Java-编程开发
- JAVA操作数据库方式与设计模式应用-Java基础-Java-编程开发
- Java开发中的23种设计模式
- Decorator模式中遭遇继承与聚合的冲突-Java基础-Java-编程开发
- (JAVA)大话类、方法、参数、对象、属性以及面向对象的开发模式(欢迎高手泼墨)
- java开发中C/S的一种常用设计模式(学习中)