00:02
解释器设计模式在spring框架中的应用,我们找了一下。在spring spring框架里面呢,有个pill expression puzzle,这个呢,它就用到了我们的解释器模式,那么我们来分析一下它它的代码,好,这是一段代码,我们来来用一下哈,首先呢,我把这段代码放在。我们这个spring这个项目里边去,那我新建一个类叫interpreter OK。把主方法勾上。呃,那么同学们来看一下这个代码,它做了一件什么事情,来看一下,首先我把相关的包引一下。好代码就OK了,大家可以看到,呃,我们写简单一点,这有一个。这有一个表达式,是个字符串形式的哈,比如说我这边改成十,写一个我们容易看懂的吧。一哦,我们看一下这个结果应该是多少。这个结果是不是十乘以三等于30 30再乘以一个一。
01:05
那那还是30 30加上66。等于96。我们先运行下。那运行这个结果呢,发现的确等于96对吧,是正确的。那么我们来分析一下这个代码,它到底是怎么玩起来的,怎么玩起来的?首先我们先看这个表达式,因为它的核心方法肯定是get value。是不是,所以说我们先看这个expression,我们往里面追,我们发现这个家伙是个接口。看到没有,它是个接口,而这个接口里面如果同学们认真观察的话呢,它这边有一系列的get value。Get value get object class等等一堆。看到没有,那我们来看看这个接口,它下面有哪些子类呢?也就说这个expression呢,你可以等价的看看我们前面画的那个类图,是不是我们我们画的那个类图里面也有expression呢,只是我们是抽象类,它这里是个接口。
02:04
那它下面的子类有哪些呢?我们来看一下person下面的子类,我们看了一下大概有三个是吧?首先三个,Composite string expression。Literal expression,还有pill expression这些类呢,大家发现都实现了这个接口,那这样实现这个接口就把相关的方法给实现了。好,这点我们分析出来了啊,也就是说它下面有很多子类,这些子类呢,都是具体的expression的实现,那么回到这边我们继续来看。那么这个expression它是怎么使用的呢?它是怎么得到的呢?OK,注意听,它是通过一个叫做。Puzzle。这样的对象来获取到的,也就是说他先创建,大家看他先创建。一个puzzle。Puzzle这样的。
03:00
对象实例。OK,然后再通过这个puzzle对象。再通过这个puzzle对象来获取一个表达式对象。获取到一个expression对象。是这样子的吧,所以说我们来看。PI expression到底是怎么获取到的?那我们看一下这个pill expression呢?它继承了temple well。Expression puzzle,那么我们再往下面看。我们发现这个呢,他继承了。Expression puzzle,这个expression puzzle呢,我们发现它也是个接口,所以说这个关系就比较明确了,也就是说。这个temple while expression呢,是spill的。一个。一个负类,那么这个spill expression里面有没有这个这个方法呢?我们来看它不是调用自己的pass expression方法吗?我们看看有没有啊。
04:07
我们看看这边有没有,我们发现这里面病。并没有,哎,并没有,你发现并没有。就是SPA expression趴并没有这个方法,那只能是它的负类里面有,我们来看看负类有没有,我们发现它的父类里面的确是有这个方法的,看到没有趴着不是,那么我看他怎么拿到的,诶这里有点意思,大家有没有发现?这个power expression,它根据不同的情况返回不同看返回不同的expression。诶有点意思,那就说在这个地方,它依赖到我们的这个expression。对象,那我们看如果他用的是趴着。Template,他得到的是什么?Expression的对象呢?哦,大家可以发现它得到的是这个。我们再回头看这个。他这还有个do part expression,这个它得到的是什么,这个expression对象呢?我们发现这是个抽象方法,既然它是个抽象方法,好,应该是它的子类要实现,也就是说。
05:09
这个。也就是哪个方法呢,同学们看到的这个方法。一定被他的子类实现了。它的子类是谁呢?它的子类当然就是这个spell。Person puzzle,好,我们看看这里面有没有这个方法,我们发现的确是有的do PU,诶,你发现这里面你你们有发现这里面有个do PU person,而这个方法里面六了一个inter。嗯,Pill person,然后里面它调用了do part,好,我们看这个方法它是怎么来的得到的啊,诶,往下一追,我们发现的确这个方法才返回了pill person。那换言之,就是说。我们什么呢?我们这个关系就很明确了,他的关系是这样子的。诶,就是说他先拿到一个PA对象,再从这个PA对象去调PA per这里面呢,它会根据你这个对象的不同,返回不同的expression。
06:09
大家听懂了吗?哦,我再说一遍就是,呃。就是通过会。根据不同的。不同的这个趴对象。返回。返回,返回不同的expression对象。是不是也就说同学们看到这个方法。这个方法人家是在这里面掉了的。这里面是不是根据不同的情况来返回的。如果你是某某个情况返是,如果你满足这个条件啊,它返回的是通过这个方法返回一个exp立项,如果否则的话就用do趴ZZ,而刚才大家可以看到这个返回的是composite expression那种对象,而这个返回的perll对象。
07:01
那这个地方大家看是不是已经听蒙圈了,你们。所以说这个时候就需要画一个图了。把这个图画大家明白了,大家看他的关系,其实老师已经说清楚了,看。他在这个地方呢,是这样子的。它首先有一个expression puzzle,而这个呢是个接口,所以说它在这个地方的关系是由它的一个抽象子类。就是同学们刚才看到的templeate well expression实现了它。我把这几个实心。那我标成一个红字哈,实现了它。把这个字体呢,咱们放小1.ok。实现。而它下面呢,又有两个不同的这个puzzle,那也就是说你看我们这创建的是不是这个这个parle呀。是不是?同学们看到的是spill puzzle。
08:02
那也就是说,它下面还有两个具体的子类是继承的关系。这个大家看能理解吗?就是这边呢,他继承了他。不着急啊,同学们,听东西不要那么着急,因为有些东西它相对有点难度。而下面这个呢,还有一个叫interpe expression呢,又也继承了这个。所以他们之间的关系应该,诶怎我把这个。挪下来了,实现。是不是时间的关系?那其实我们可以看到,在这个地方并没有体现出我们的解释器模式。因为这边前是趴着,解析趴着,而我们表达式是在这边。那么它怎么去引来到这个表达式,大家看我们刚才不是讲到它会返回per对象吗?这个per是个接口,我们前面讲的是一个抽象类,所以说它下面呢,会有几个具体的子类来实现这个expression。
09:00
其中就有一个pire expression,就是我们这边返回的就是这个就是PI,还有像这个composite,呃,Composite string expression,还有这个little expression,也就是说。这个接口就是这个G表达式接口呢,被下面的。多个子类,多个expression子类实现。那大家有没有发现这两者没有关系,好像从目前来看感觉没有关系,他的关系是在哪发生的呢?同学们是在这发生的,是不是当我们创建了一个。是创建了一个pale对象过后,我不管是这个还是这个,是不是我调用了一个叫做pale expression这个方法呀。而这个方法是不是就在这儿?大家有没有发现这个方法会返回一个对象,那换言之,就是说我们这两者的关系实际上是在这发生的一个依赖。
10:02
大家有没有发现依赖关系是在这儿产生的?思路就很清晰了。这个时候我再总结几句话,大家就一目了然,看这个地方发生了一个依赖。言,言外之意就是说,如果你创建的是这样一个趴的对象,你在调用他的一个趴expression,那么它就返回的是这个pill expression。进行解析和处理,因为它这里有个get value嘛,那如果你是另外一种PA对象,好,他可能就是得到的这个puzzle,或者是这个pass,而这个expression,或者上面这个expression是不是,所以说他们是在这个方法中建立了一个联系,那么我们可以认为我们的表达式是在这边,真正干活的在这儿,而它呢,又根据不同的pass对象来给你返回不同的表达式对象进行一个解析。好思路就这样子的,大家看懂了没有,所以这个地方你要是认真看才才能看懂哦,原来他的表它的这个解释器模式在这个地方使用到了。
11:08
然后呢,通过不同的pass对象来获取不同的对象进行一个解析,其实这个核心方法应该是在这里。对吧,Get value。Get value啊,这里面肯定就会有点像我们类似的那种方式,一步一步的通过某种方式把我们这个结果返回这样子来的。好,同学们,那这样子听了可能还是有点不明白,我总我整理几句话让大家。更加清晰我们这个流程是怎么样子的。好,我来。我来给大家聊一下这个话题,聊一下这个话题。呃。我们看一下它应该是这样几个关系,首先我们看到expression。它是一个接口。它是一个接口,呃,也就是我们所说的表达式。表达式接口看到没有,我们前面是用的抽象类。
12:02
对吧,然后呢,大家看下面有。有不同的。不同的。这个实现内。比如说呃,那比如我们已经用到的SP,呃,Pill。要写的spell,呃,Expression。或者是或者是像刚才看到的comp这个单词太太太长了,我就记不住。一个是这个。那我把这个名字删过来吧。太长了哈。呃,我们。我我我们这样子查查一下。一个是这个spell别写错了,还有一个。嗯,我们现在怎么去查呢,这样子啊找到。先还找到这个类吧。要找到这个接口好,找到这个接口往下面搂,它下面不是有三个吗。三个expression,一个是刚才写的spell expression,还有一个这个还有另外的,我就不写那么多了哈,大家知道这个意思。
13:08
或者这个哎呀,这个还有其他的等等。这个就是expression的。这个接口的具体的实现之类,那同学我们可以看到呢,它根据什么,这个地方是根据啊这个。三。三这个是说明。说明好,这样子就好了。好嗯,然后呢,我们用的使用的时候,实际上是使用的时候时候是根据根据你创建的不同的什么呀,趴着对象。Per puzzle对象。Puzzle对象。对象。返回返回不同的或者对应的不同或者对应的吧,返回对应的一个这个。
14:09
Expression。呃,就是表达式对象。返回。不同的。返回不同的什么呀,就是expression对象。嗯,对象那这段代码呢,同学们可以通过这个地方能够看到,就是在哪看到的呢。在哪看到的呢?就在这个位置,是不是我们这个趴expression呢。是不是在这在这个地方,这个方法里面看是不是这个方法返回不同的东西。把这个代码呢粘一下,我把它放小一点。好,这样大家就很清晰了,那同学们可以看到这个地方,它返回的就是。返回的就是什么呢?他最终这方返回的就是这个expression。对,而下面这个返回的是什么呀。
15:02
看你的不同情况了,好,返回的就是我们的pill expression。好,然后当这边处理完了过后呢,再根据。再根据得呃得到再使用啊,使用得到的这个expression对象。PR expression对象干什么?调用get value。Value得到什么呢?就得到了,就得到了,呃,这个value它会去解析的解释的解释。解释就说嗯,得到这个exp,调用它的get value对象去解释执行解释执行这个表达式。最终得到结果,最后得到结果。得到。得到结果。同学们,这就是我们在spring框架里面这个SPLL,呃,在spring框架里面这个pill expression趴里面就用到了一个经典的。
16:12
解释器模式有点绕,有点绕,但是通过这个解释呢,我相信同学们就是能够更加灵活的理解我们这个,这个就是解释器模式了,对不对,就说我可以根据我的需求来选择。对,所以说我们说解释器模式呢,并不是说只有一个解释器,它是一组,根据你的情况选用不同的就可以了。好,这就是我们的这个按这个源代码的一个分析和他的说明,我们就聊到这里。
我来说两句