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

背景

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

1、使用意图

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

2、生活实例

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

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

正则表达式

4、模式类图

  1. 抽象表达式(AbstractExpression): 声明一个抽象的解释方法。
  2. 终结符表达式(TerminalExpression):  实现和语法中末端符号相关的interpret方法。在每个句子的末端符号中均需要一个TerminalExpression实例,来结束整个的解释过程。
  3. 非终结符表达式(NonterminalExpression): 另外一个实现了AbstractExpression 接口的类,用来处理语法树中非末端节点的语法。一般这个类的实例集合就是解释的内容的核心。
  4. 全局信息(Context): Interpreter方法所需要的信息的容器(全局信息),该信息对Interpreter而言全局可见。充当几个AbstractExpresssion 实例之间的通讯频道。
  5. 客户端(Client) : 对于一个特定的句子而言,语法树往往由若干个TerminalExpressions 和 NonterminalExpression组成。换句话说用一个List集合存储所有的AbstractExpression实例,然后,逐个遍历,把Context传入后调用他们的解释器方法。

5、模式优点

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

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

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

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

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

6、与类似模式比较

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

时间: 2024-10-13 17:32:46

小菜学设计模式——解释器模式的相关文章

小菜学设计模式——建造者模式

背景 不要小看炒菜这件小事上,想要上一道佳肴,那是需要循规蹈矩,步步小心的.我相信你肯定在外面吃过没放盐的快餐,吃过放多了盐的快餐.....既然炒菜是一个如此复杂的过程,又必须循规蹈矩,那为什么不给他一个死规定呢?如果谁没有按照规定做事,就进行对应的提醒警告.这就是建造者模式的由来,限制规则步骤,但是开发规则细节.比如说盛菜之前必须放盐,那么规定一定要放盐,具体放多少自己论情况而定. 1.使用意图 如果你需要将一个复杂对象的构建与它的表示(构建具体过)分离,使得同样的构建过程可以创建不同的表示的

小菜学设计模式——访问者模式

背景 最后一个设计模式,也是<大话设计模式>公认最难的设计模式,当然不是理解上困难,我觉得应该是使用上困难,这个设计模式虽然具有非常良好的扩展能力,但却需要类的结构早早定义清晰,试想,需求时刻变化,你的类可以稳定吗? 1.使用意图 容易扩展,满足开发封闭原则 2.生活实例 男人和女人的状态,把ConcreteElmentA看成男人,把ConcreteElementB看成女人,那么,所有的Visitor实例就是成功状态.失败状态.结婚状态.升职状态等.把这些状态放在客户端的集合中维护,一旦需要,

小菜学设计模式——桥接模式

背景 很多情况下继承会带来麻烦,对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性. 1.使用意图 尽量使用合成聚合,尽量不要使用类的继承. 将两个角色之间的继承关系改为聚合关系,就是将它们之间的强关联改换成为弱关联.因此,桥梁模式中的所谓脱耦,

小菜学设计模式——代理模式

背景 很多时候,因为你的地位特殊而赋予你了不同的权限,那么你拥有别人做不到的事情.这个时候,如果你的朋友很想完成这样一件事情,但是她知道自己可能无法完成,但是你可以帮他处理,同时必要的话还可以中间拿点外快,不过最后要知道你是代理他完成这样一个事情,这就是代理模式出现的原因. 1.使用意图 通过代理角色代理真实角色去完成某一件特定事情,代理为什么会出现,因为代理身份的特殊性. 2.生活实例 找房子的时候会找代理,代理能够帮我找到房子,但是他额外收取了我一个月的房租,不说了,房租好贵! 3.Java

小菜学设计模式——命令模式

背景 外面小摊与店面的比较,你就会发现,店面似乎更加容易管理,为什么呢?因为在客户与老板自己新增了很多员工,这些员工各司其职,所以井然有序,事情才会高效进行.这里有个重要的设计模式就是命令模式. 1.使用意图 在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"

小菜学设计模式——组合模式

背景 很多人学习C语言的时候,都会学习一种很厉害的的算法,递归算法,说实话,递归真的是一个非常厉害的算法,因为它能解决很多意想不到的问题,比如文件夹删除,如果不采用递归,还真不知道要写多少代码呢?关于递归,他总是要一个结束条件,否则就无限循环了,其实这里涉及到结构问题,也就是新的设计模式,组合模式. 1.使用意图 一致对待整体与部分 2.生活实例 组织架构关系,整体与部分可以被一致对待 3.Java 例子(框架.JDK .JEE) 无论是文件还是文件夹,Java都统一使用类File定义,文件夹是

小菜学设计模式——迭代器模式

背景 迭代就是遍历的一个过程,既然是遍历自然是无处不在,比如说,在大街上看美女的时候,总是一个也不放过,一个个尽收眼底,不过,说实话,夏天看美女,其实我是拒绝的,不说了,鼻血有要留出了 1.使用意图 遍历每一个对象 2.生活实例 公交车上的售票员查票,对每一个乘客都进行查票,验票. 3.Java 例子(框架.JDK .JEE) 集合的顶层接口Collection就是实现了接口Iterable,他就是一个迭代器模式的封装,Iterable只有一个方法,Iterator<T> iterator()

小菜学设计模式——外观模式

背景 一个坦克系统,子系统是履带系统,发动机系统,火炮系统,防卫装甲系统等.对外的接口就是暴露给使用人员的是Run(), shot(), stop()等.如果没有采用Facade模式,开动坦克需要直接依赖履带系统,发动机系统.直接去操作履带,操作发动机?各个接口和子系统都产生了紧耦合.(引用自互联网) 问题产生了:组件的客户(接口)和组件内各个复杂子系统有过多的耦合,随着外部客户程序和各个子系统的变化,这种耦合面临着变化的挑战. 如何简化外部客户程序和系统间的交互接口,如何将外部程序的演化和内部

小菜学设计模式——策略模式

背景 同一个问题,总是有许多中解决问题的办法,如何才能让这些办法同时存在而又互不干扰呢?就可以使用策略模式. 1.使用意图 策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户端. 意图很明确,对一种问题可以有多种解决方式,而这些解决方式都是互不干扰,但他们又属于同一个家族. 2.生活实例 商场促销商品,然而促销商品的策略多种多样,比如买一送一.满100奖50.两件88折等,这些策略都是同属于商品的促销策略家族,但是他们之间的算法是互不干