背景
html在不同的浏览器都需要解析,这个解析过程就是解释器模式的体现。
1、使用意图
对有规律的句子进维护解析
2、生活实例
说到解析,就让我想到浏览器,IE浏览器直接就降低了我的工作效率,因为的他的怪异模式对html的解析确实很让人头疼。解释器模式的体现,就是四大浏览器(IE、谷歌、火狐、Safari)对html语言的解析上。
3、Java 例子(框架、JDK 、JEE)
正则表达式
4、模式类图
- 抽象表达式(AbstractExpression): 声明一个抽象的解释方法。
- 终结符表达式(TerminalExpression): 实现和语法中末端符号相关的interpret方法。在每个句子的末端符号中均需要一个TerminalExpression实例,来结束整个的解释过程。
- 非终结符表达式(NonterminalExpression): 另外一个实现了AbstractExpression 接口的类,用来处理语法树中非末端节点的语法。一般这个类的实例集合就是解释的内容的核心。
- 全局信息(Context): Interpreter方法所需要的信息的容器(全局信息),该信息对Interpreter而言全局可见。充当几个AbstractExpresssion 实例之间的通讯频道。
- 客户端(Client) : 对于一个特定的句子而言,语法树往往由若干个TerminalExpressions 和 NonterminalExpression组成。换句话说用一个List集合存储所有的AbstractExpression实例,然后,逐个遍历,把Context传入后调用他们的解释器方法。
5、模式优点
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
如果一个特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式。
用了解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类的实现大体类似,这些类都易于直接边写。
解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。
6、与类似模式比较
解释器模式,可以这样理解,首先规范一下解释的抽象方法,就这单独定义抽象类,然后,解释的具体过程就是子类需要去实现的,一般这个子类至少需要两个一个是终结符表达式,一个是非终结符表达式,终结符表达式告诉我们解释需要终结,而非终结表达式则是整个解释的核心,所有的内容都在非终结符表达式解释得出,那么由于内容是巨大的,所以非终结符表达式也是多个的,所以客户端需要一个集合对象来存储这些终结符表达式,等到需要解释时,逐个遍历,也就是解释的过程,遇到抽象表达式就解释操作。其中Context作为解释的依赖对象传递,其实他就是一个抽象表达式的共享对象而已。