小菜学设计模式——解释器模式

本文介绍了解释器模式的概念及其在不同浏览器解析HTML的应用。通过解释器模式,可以更灵活地改变和扩展文法,适用于频繁出现的问题解决方案。文章还探讨了模式的优缺点及与其他模式的比较。

背景

    html在不同的浏览器都需要解析,这个解析过程就是解释器模式的体现。


1、使用意图

    对有规律的句子进维护解析


2、生活实例

    说到解析,就让我想到浏览器,IE浏览器直接就降低了我的工作效率,因为的他的怪异模式对html的解析确实很让人头疼。解释器模式的体现,就是四大浏览器(IE、谷歌、火狐、Safari)对html语言的解析上。


3、Java 例子(框架、JDK 、JEE)

    正则表达式


4、模式类图

095336_I04Q_1989321.png

  1. 抽象表达式(AbstractExpression): 声明一个抽象的解释方法。 

  2. 终结符表达式(TerminalExpression):  实现和语法中末端符号相关的interpret方法。在每个句子的末端符号中均需要一个TerminalExpression实例,来结束整个的解释过程。

  3. 非终结符表达式(NonterminalExpression): 另外一个实现了AbstractExpression 接口的类,用来处理语法树中非末端节点的语法。一般这个类的实例集合就是解释的内容的核心。

  4. 全局信息(Context): Interpreter方法所需要的信息的容器(全局信息),该信息对Interpreter而言全局可见。充当几个AbstractExpresssion 实例之间的通讯频道。 

  5. 客户端(Client) : 对于一个特定的句子而言,语法树往往由若干个TerminalExpressions 和 NonterminalExpression组成。换句话说用一个List集合存储所有的AbstractExpression实例,然后,逐个遍历,把Context传入后调用他们的解释器方法。


5、模式优点

    解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

    如果一个特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题

    当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可使用解释器模式。

    用了解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类的实现大体类似,这些类都易于直接边写。

    解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。


6、与类似模式比较

    解释器模式,可以这样理解,首先规范一下解释的抽象方法,就这单独定义抽象类,然后,解释的具体过程就是子类需要去实现的,一般这个子类至少需要两个一个是终结符表达式,一个是非终结符表达式,终结符表达式告诉我们解释需要终结,而非终结表达式则是整个解释的核心,所有的内容都在非终结符表达式解释得出,那么由于内容是巨大的,所以非终结符表达式也是多个的,所以客户端需要一个集合对象来存储这些终结符表达式,等到需要解释时,逐个遍历,也就是解释的过程,遇到抽象表达式就解释操作。其中Context作为解释的依赖对象传递,其实他就是一个抽象表达式的共享对象而已。

    


转载于:https://my.oschina.net/heweipo/blog/471812

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值