00:02
使用解释器模式来实现四则运算。那首先这个需求刚才大家已经看到了,我就不再多说,比如说我们输入A加B减C,然后呢,输进去过后,紧接着输入ABC它们的值,最后把这个结果拿到,那首先呢,我们说一下把,如果我们用解释器模式来解决这个问题,我们这个类图是什么样子的,那同学们我们画一下这个图好吧。OK。那我在这就新建一个类图,对,那这个地方我们取个名字叫做运算expression。啊,表达式ex re expression。好的。那我们怎么来画这个图呢?根据前面的分析,首先同学们看啊,我们一步步画,首先应该有一个什么呀,抽象类,这个类呢,我们就叫P。这个里面是不是前面讲过有个重要的方法叫做interpreter。
01:03
Interpreter好,解释器,那我写一个类好。OK。呃,这个就是我们的这里面要使用interpreter,那下面呢。我们有两个类,一个呢是针对这个变量的解释器,比如说叫。V。好,这个expression呢,好的,他需要干什么呢?他需要去当然是要去继承了,继承我们的expression,紧接着我们还有一个类。还有一个类呢,就是symbol,我们一个是变量,另外一个就是符号了,Symbol。Symbol什么呢?没问题啊,这是我们的符号。符号的一个表达式,同样我也让他去继承它,那哪一个是终结,哪非终结呢?各位同学,这个就是。那也就是说这个simple expression呢,有点类似于我们前面的这个non terminal expression,那也就是说在这里呢,我们这个expression需要什么呀,去聚合,聚合到我们这个symbol expression里面去,那我们来看一下。
02:18
同样我们在这儿呢,把它。稍微的是逆向。好这个关系啊,大家可以看到是这样一个关系。好,那有了这样一个东西过后呢,我们这两个核心那就有了,大家再看symbol expression里面是不是它是非中结的,那它如果是非中介的话,就意味着它有可能下面还有子类,那针对我们这一个计算式来说,我们有我们要去处理加法和减法,因此呢,我会在下面再创建两个子类,一个呢我要sub expression。Sub expression就是做减法的对减法的表达式,那现在呢,我们让他继续去实现。那同样我们还有一个做加法的,如果有乘法的话,我们继续加,所以你看这个,你看这个。
03:06
解释器模式,它的思路还是很清晰的,对不对。爱的expression。同样,他也去继承这个。那么这一块就是我们的表达式的一块的处理,紧接着我们还需要什么呢?同学们,各位不要忘了,我们还需要一个calculator。就是我们的计算器,把它综合起来开later。Calculator OK,就他那显然这两者之间是expression会去聚集,聚合到我们这个calculator里面去,因此呢,他们之间的关系是这样子的。好,紧接着我们还有。还有client就是我们的客户端,那客户端调用的时候呢,我们去创建一个calculator就OK。当然表达式也会通过这个expression里面传进,传给我们C,好,同学们看这个简单的一个类图我们就画完了,我们数一数这边一共有几个类呢?一共有12345677个类。
04:10
七个类,那这段代码说实话啊,如果说我们要去实现呢,它这里面更多的是要涉及到对一个表达式的解析。所以这里面会用到一个什么呢?用到赞,也也就说在这个里面呢,我们会使用到站star。因此这段这个程序里面可能有一部分它的难点是什么呢?它的难点一部分是设计模式。怎么去设计?第二个呢,就是这个程序的逻辑。程序本身的逻辑比较复杂。大家想本身的逻辑比较复杂,所以说我在讲这个案例的时候呢,我可能会这样做,我把这个代码拿出来给你们分析一遍,如果说我们去把代码一步步敲下来,这也没问题,但是呢,如果那样敲的话,就会把我们的重点放在讲程序本身逻辑上面去,这就相当于没有没有去把重点放在设计模式了,所以我这个代码呢,我们拿过来看,看完了过后,我们分析出它各个角色,把它再用,再用一个debug的形式。
05:14
再追踪一下源码,大家就一目了然了,好吧,我们待会儿呢来追一下这个源码。我们待会讲解的形式,先把这个程序程序本身的代码搞清楚。就是搞清楚。搞清。搞清楚程序设计模式怎么用的,设计模式怎么使用,再加上呢,我们来debug一下源码。思路就会变得很清晰哈,思路变得很清晰,好同学们,那关于这个类图我们就聊到这儿,下面呢,我们开始把这个代码拿过来看一下,代码呢,我这里已经准备的准备好了。啊,这这因为这段代码呢,他更多的地方是放在什么呀,放在它的这个程序逻辑上,如果那样去讲的话,我们更多讲的是程序本身设计模式就忽略了,所以说我们把这个代码拿过来,我们分析一下它设计模式是怎么设计的来还是老规矩,我们这建一个包包。
06:12
OK啊,诶诶不不是建内建一个包,这个包呢,诶干脆就不建了,直接把它粘过来吧。好,那粘过来过后呢,因为我们的包不一样,所以我把这个包呢,把它切一下就可以了。啊,重新嵌积一下,把这些东嵌嵌积一下,这些里面的类,就是我刚才分析的好。这个client就是client test就是我刚才写的client,这个expression是个抽象类啊,待会呢我们再一个个的分析,不着急sub。OK。这是symbol expression。把包切一下,这个是变量的,变量的一个expression,我们保存。好保存,这样代码就没问题了。那么现在我们来一步步的看他到底是怎么实现的哈,首先我们看expression,那我们做一个小小的分析。
07:06
那么同学们可以看到这个expression,它代表什么含义呢?我们来看一下它呀,我们做一个说明,它是抽象类,抽类表达式。对,那么他通过这个map,大家可以看到我们这会有个哈希map。不着急通过这个哈希迈普的建词段。建直对。他干什么呢?诶,他通过这个键值对。呃,可以去获取到各个变量的值。可以获取到,可以获取到。变量变量的值,也也就是说同学们看到待会在这个哈希map里面我们放的是什么呢?我做一个注释。OK,这个地方它的核心是解释。它是解释什么呢?它是解释这个公式和什么呀,和数值的一个关系。
08:04
他是这样子的K。同学们,K呢,就是我们这个公式,也就是我们所说的表达式。中的什么呢?中的这个参数啊,中的这个参数。如果说的再明白一点,就是A呀B呀,C呀这些东西。因为你待会再输这个表达式的时候,你是这样说的,A加B减C啊。OK,那有时候这个K呢,就是类似于ABC这种字母。哦,那么这个值呢,K就是它返回来了哈希map里面这个value呢,OK,不着急啊,Value。就是具体的值。就是具体值。好,那我们说的再明白一点,就是将来你这个哈希map里面放的是什么东西呢?将来放的是这样一个东西,同学们。
09:00
如果说的再明白,就这样子的,比如说待会儿呢,我们这个A放了个A。A比如说是十,这方程就A等于十,B假设是20,方程就20。明白吧,就哈希map里面,它最后拿到的就是你各个这个表达式里面的各个变量对应的值,就这个意思,所以为什么呃是通过interpreter来获取的,因为这里面是哈希map。好,这个咱们就大致的明白了,下面我们看它下面的这个VR expression,我们先把这个说完。那么VR这个它到底是用来充当怎样的一个角色呢?OK啊,来,我们仍然做一个翻译,我说了这段代码本身呢,我们可以敲,但是敲的话呢,有有些时候会涉及到太太多的程序,程序的逻辑,这样就不值当了,我就给他分析一遍就行了,这个叫做变量的。变量的解析器,那听这个名字大家就应该知道是干什么的了,OK,大家看它将来这个K啊,这个K就是我们这个A呀,B呀,C呀,这些东西就将来这个K呢,理解成就是K等于这个A。
10:17
等于BK等于C。大家明白什么意思吧,就是他在创建的时候,你会把这个K给到他,那下面同学们再看这个。呃,这个interpreter在干什么呢?好,同学们看到这个VR,就是我们前面分析到的,你会拿到的这个哈,Map。好,他会拿到这样一个东西。那显然同学们可以看到,他拿到这个东西过后呢,通过这个K来获取,那意思就是说这个interpreters它的作用是干什么呢?它会根据。根据什么呢?就是你的变量,变量的名称,OK,变量的名称返回什么呀,对应的值。
11:04
对应的就这么简单,好,这个咱们就说完了啊,那紧接着我们再来看下一个表达式,就是symbol expression,那symbol。申,Express就是我们的符号了,比如加减乘除的这么一个表达式,它是变量,这边是符号,OK,有加和符号,具体来说就就有减和加,明白的意思,好,我们来看看symbol expression来看一下,这已经做了一些说明,抽象的。运算符号解析器。这里每个运算符。每每个预算符啊,符号啊。符号都只都只和自己的左右两个数字有关系,大家看到这个left和一个right。Left是左表达式,Right是右表达式,有了左和右,是不是我们就可以进行运算了?OK,但注意听这句话,但左右两个数字也可能是一个解析的结果。
12:00
OK,无论是何种类型,都是expression之类。它可能是个,呃,就说这有可能是个数字,也可能是个是个解析的结果,那这个symbol expression构造器我们就不说了,关键是来看这,它是一个抽象的收缩,它本身并不实现这个方法,注意听。因为symbol expression呢。他是让是让其子类。是让他的子类。子类来实现的。来实现的,因此,因此这个interpreter这个方法呢,它是一个空实现,基本上是个空实现,它是一个默认实现,是一个默认实现。那意味着它下面的子类,它下面子类一个从这看,一个是减,一个是加,要来实现,OK,那到时间减和加呢,在interpreter里面会诶诶找错了。
13:01
加减和加会在interpret里面具体实现,也就它会去解析,我们不是在说解析器吗?你这个symbol你怎么知道它是加还是减呢?不知道,所以它只能在这一个空实现,或者叫默认实现,来,我们再来看加法这个表达式,来,我们写到这来。不着急啊,同学们慢慢听就行了,因为现在呢,我们讲的这个解析器模式是稍微有点绕的,我们叫加法解析,这叫加法解解释器。或者叫减吸气都行。那大家有没有发现?当你创建一个加法解析器的时候呢,其实你也是调用它symbol expression的。构造器把它的左和右表达式先构建起来,那同学们看这里。这帮很关键,这帮就是处理相加。处理行为什么呢?大家可以看到它这个地方很有意思,同学们。因为你在做加法的时候呢,你其实是往这个sta里面。
14:04
装载的是一个爱的expression。所以说他在这个地方去获取的时候呢,是通过这个K,大家有没有发现啊,你你没有发现,他把这个value VR,注意听这个VAR仍然是。仍然是前面我们所说的,像这个A10B320这样的。一个集合。那么大家有没有发现他super?Na。这个这个这这个,那么这个地方,它往往这个na的是什么呢?往往是一个VAR表达式。也就是说他在这个地方interpreter的时候,往往是调的是VAR expression里面方法他。返回这个VR,这个K对应的值。啊,这个有点绕哈,待会儿我们要追源码,不然这个有点说不清楚。好好,我们这儿先做一个解释,那这个地方它是功能是什么呢?它是跟它是返回。
15:04
好,写到下面吧。写到下面。也就是说,大家可以看到的这句话。这句话是他返回。返回什么呢?返回他是返回这个left。表达式。表达式OK的,呃,这个ne的表达式对应的。啊,对应的这个值,比如说A,它返回的就是一个十。好。然后呢,当然这边当然就返回的是右表达式对应的值。OK,返回的是。发挥right。表达式。对应的值。比如说你是A加B,那这边返回的就是根据你这个B,因为它的左表达式就变成B了,对啊,右表达式又变成B了,那这个B对应的是什么呢?哎,对应的就是20。
16:05
然后将其相加。然后进行,也就是说同学们可以看到它这个地方用到了什么呢?用到了VR的表达式,然后呢,把它的左表达式的值返回来,把它右表达式的值返回来,当然这个值呢,它会不停的往这个站里面压,好说这个这个地方呢,呃,我刚才不是讲过吗?难点有时候并不在于设计模式本身有多难,而是在于程序本身的逻辑比较复杂,所以说我们在这讲呢,大家不用特别纠结这个是怎么算出来的,你只要把这个程序的逻辑搞清楚就可以了,好吧,待会我们在debug一下,大家不要着急啊,一会。一会儿呢。我们我们debug一下源码,Debug一下源码就一切明白了,一下一切明白debug源码就OK,就很容易搞懂啊,就OK好减法加法有了减法我就不多说了,减法是一样的,你看这只把这个变成了减,因此我这写一句话叫相减。
17:06
求出什么呢?求出left和right这两个表达式。表达式相减的。相减后的啊减。相近。没有这个相减后的结果。好了,那到此为止,同学们可以看到,我们现在已经把expression。VR symbol。Expression sub expression和ADD expression讲完了,那现在最后留了一个calculator,这个类呢,代码相对有点复杂,大家看一下。所以说为什么说我这个代码没有给他敲一遍,因为敲的话一边讲就就变讲的不是业设计模式了,讲的是程序本身,这样不值当,好大家简单看一看。这个地方呢,它会有一个表达式,同学们可以看到。它这边会有一个表达式。
18:02
啊,这边呢,还有一个,呃,我们来一步这个造器并解析哈,它会拿到一个表达式。安排运算表达式的一个先后顺序,这边是什么呢?这边是呃,对表达式表达式。拆分成数组。拆分。拆分成什么呢?字符数组。那为什么我要拆分成字符数组呢?你可以这样理解。你可以这样理解,就是这个呢。这个expression其实你可以理解成他传进的这个expression是长这个样子的。EXPR,我我这样一说大家就明白了,它其实就是这个A加B减C这样的一种形式的表达式,就是你输进去的这个表达式的外观。明白了吧,好,比如说我们到时A加B这个表达式就A加B,然后这边一拆分过后呢,同学们可以看到它就拆分这样一个速度就A加。
19:02
B,那为什么他拆呢?因为他拆完了过后才能取出这个字符对应的值,才能取出你是一个加法还是一个减法,明白了吧。好,你看下面他先将左右之空,于是他在这里面便利什么呢?便利我们的这个字符数组。要处理了吗?便利这个字符数组。遍历这个字符数组及便利哪个呢?你可以理解成便利这个家伙。然后呢,针对哦,注意听哈,针对。针对不同的情况做相应处理。做处理,你比如说吧,如果说他发现是个加号。他发现是个加号,他就。把这个你第一个,你肯定你第一看的肯定不是加号是吧,所以说我们先跳过,因为因为实际上的它在遍历的时候,它第一个遍历的应该是个字母。
20:00
如果是一个字母怎么办呢?大家可以看到它会这样做,它会把这个字母转转成一个字符串,然后呢,构建成一个VAR,就变量表达式,然后把它push进去,所以说我这里说一下如果如果是一个。呃一呃是一个VR是个变量,那么AAB就是变量嘛,干什么呢,就OK就创建,注意听啊,创建一个VR。的对象。并并并压入到push到。Push到哪里去呢?Push到我们这个sta中。OK啊,那如果是加号怎么办呢?你看当我们发现这个加号的时候,它也也很有意思啊,这样子的,那你组合是不是就变成一个加的表达式了呀。嗯,他这个特别有意思,他发现这个加号呢,他就把这个先弹出来啊,左表达式先弹出来,因为左右一一合并,不就得到了一个我们的加的表达式吗?于是他发现这个加号他先弹出一个从注意听从站里面,注意听啊,从这个sta里面。
21:10
啊,取出取出这个left。那么这个left就是左表达式了,相当于就是我们这个加表加号,呃,表达式的一个左边的部分,然后这边是个right right是不是就往后面取一个呀,Right是不是往后面取这个B就是它的right的一个表达式是不是,然后这边又取出。取出右边的表达式右。右。表达。那说的再直接一点,如果针对A加B的话,这个取出就是个A,这边取出的就是一个什么呢?就取出一个B,看到没有,那为什么是B呢?因为它加加I了呀。那原先在这个位置,原先在便利的时候,它的指针是怎样A的,那加加A加加啊,它这样子的啊。哦,他这边处理了,处理了以后,他在他这边已经加了一次,看到没有,他已经他他他这个时候已经到这来了,他才发现是个加号,在这个加的位置再往后面挪,不就找到B了吗。
22:11
于是他把这个A和B就说,说明在进行加的时候,进进行加的时候,它右左边的这个表达式对应的这个字母是A,右边这个表达式对应的字母是BOK,然后你看看他为什么知道是加呀,因为你这是加呀,所以说他把这两个一组合生成一个爱的expression加到我们这个站里面去了,明白这意思了吧。其他我就不一个讲了啊,然后。诶,然后根据得到的left和right。构建。构建什么呢?构建一个a expression对象。加入到哪里呢?OK,最后经过他一系列扫描,他会干什么呢?把这个表达式就生成了,就最终根据他这个实实际情况拿到表达式就拿到了,然后就一层一层递归的进行处理。
23:05
啊,最后它返回的是什么呢?它整个这个for循环扫描完了过后,这个表达式就全部。生成装到我们这个,呃,这个站里面去了,最后啊,当。当便利完。整个。编临完整个什么呀,整个这个2RRA啊CHAR2这个数组后。你理解吧,数组后叫。这个站里面呢,就是这个占中,就是我们这个站中。当中就得到了最后的一个CC。当然这个expression呢,它是它可是一层一层的了啊,他可能加了好几次的,就最后的这个整体的,最后这个拿到了,但这个这个expression呢,他肯定是有又呃,由这个爱的,由这个爱的expression。还有这个,还有这个我们这个sub expression共同组成的。
24:04
好,所以说这个X呢,如果待会我们去看的话,它是比较复杂的。它是比较复杂的,最后呢run一下,这个run是干什么呢,大家看它。这个表达式不是你后面生成了吗?然后他调用这个expression的interpreter进行一个解析,当然他在调的时候,到底这个地方取出来的是sub还是艾,它会自己去分解到自己的子类的解析器去处理好,最后我就说一句啊,最后。最后将这个表达式。表达式和什么呢?和VR绑定。绑定这个VR大家还记不记得,就是假如这个表达是这样子的啊,A加B,那么VR呢,其实就是可以理解成是A10B。30啊20,比如这个你输的这个A呢,你输的是十,B是20,那么这个VVR呢,其实就相当于是这个玩意。
25:05
OK,这个玩意,那最后呃,通过这个呃,然后传给什么呢?注意听,然后传递给。传递给我们的这个这个expression的。Expression的这个interpreter。进行一个什么呀,进行一个处理,或者叫解释执行。解释执行。好,这个就是,那么他在这个解释执行的时候,到底他应该调哪个,那就根据他的流程来走就可以了。根据他的流程来走就可以了,好,同学们,大体这个流程我们就明白了,那现在呢,最后还差一个什么呀,还差一个调用,这个调用也很麻烦,好调用呢,为什么我没有去写代码,就是这里面很多事。逻辑的问题,不是我们设计模式的问题,来看一下c test,这个就很简单了,大家看这里面我们会拿到一个表达式,比如说这样一个表达式。
26:04
待会我们注源码哈,比如说AA加B啊,那这边呢,这个地方它是让你干什么呀,去输值给A和B数值,所以说这个地方我们拿到这个VR呢,你可以理解成假如我,假如我输的是A,假如我给的是A加B,那么我A给的是十,B给的是20那。我你你会看到VR其实就这个值好,然后传给开,然后这个开run一下,就开始去run里面是不是调用把这个VR和那个解释器绑定,然后就开始执行了呀。好,同学们,我们追一下源码啊,这个代码稍微有点绕,追,嗯,不着急啊,稍微有点绕,一会就让大家看懂了,来,我们追一下源代码。用debug的形式,看看老师刚才分析是否正确,来,我们看一下。好,现在我先说一个最简单表示,A加B。回车输入一个十。
27:00
啊,再输入一个20回车,好,这个时候呢,它会开始debug。同学们先来看一下,首先我们看这个表达式,这个表达式你们watch一下。好,往这儿看啊。往这看。再看。AA,这个地方是不是已已经拿到了。这个表达式,嗯,我们看看。这个为什么看不到啊。好,往下看啊。Expression。好,我那我们先往下面先追着啊,先追着我们再来看这个VR。为什么这张他不让我看呢?这个很奇怪啊。我们在这儿往里面。呃,往这看,这边来看一下。好,看这边变量吧。哦,这边可以看到,这边可以看到啊来VR。
28:00
呃,大家可以看到VVR呢,是一个哈希map,对不对,哈希map,那这个哈希map里面到底是什么东西呢?我们来看一下。同学们看这。看。为什么这边看不到啊,哎,我往下看。往下看啊下看。AB他应该拿到才对呀。Value。往上往上追一下哈,往上追一下。嗯,这个地方很怪啊,为什么看不到了。Watch。你讨厌这个?Expression。嗯,那那先往里面追一追吧,那么追到这里面再去看,也是一样的,来,我们往里面追一下,追到这个开开这里面去看。代码是不是还没停到这儿了。诶,代码为什么没追到这儿来呢?
29:00
为什么没停到这儿呢?往里面去一下。好,不好意思,那重来。不知道为什么,这地方出了小问题了啊,我们重新来一下。重新来一下来还是把代码定到我们。刚才的,嗯,这个位置。我们定到哪个位置呢?定到这儿。我们再来追一把,不着急,好,同学们。Calculator。呃,这个地方应该是可以往里面追了,对吧,应该是可以的,来走一下来debug。Debug。好,我现在。现在数值。A加B。十。20走一个。好,走到这里,我看代码应该是停到这了,现在是正确的啊呃,现在就对了,你看现在就对了,刚才不知道出了什么问题了。好,大家看expression。你看现在是不是看可以看到。是A加B啊。对的,刚才不知道为什么,我我们就不去管它了,A加B,嗯,大家再看这个VR,这个VR里面是不是就是十和A等于十,BB等于20,因为它把它根据你船的A和B呢,把它构建起来了,好现在我们追到这里面去来走追进去。
30:15
那追进去过后呢,它应该是先做一个类的加载,我们弹回来。弹回来后再往里面追。好,就追到我们开,大家看表达式给你了,是不是A加B。好给给到我们过后呢,现在大家往下面追,他先建立一个空站,空的站。好数组,看这里数组是不是A加B分开了,就是我这写的。那么接着它构建了两个空的expression,这个没什么问题,往下走走。好,开始便利,第一个便利到的应该是A是不是好,所以所以说我们可以看到呢,现在这一个,呃,这个我我他先第一个取出来是A。这个时候我们看是不是取出来第一个是AA,既不是加也不是减,是不是他马上会进到这个default去,是这样子吧,同学们是不是来到这儿了,然后他发现这是一个变量,所以说它会怎么办呢?把这个A转成一个字符串,然后构建起来,那我们往下走一下,你会发现sta就是你们看到这个站里边啊。
31:14
就是同学们看到这个站。这个站里面呢,就应该放的有一个,至少放的有一个了。好看,这里是不是有一个VR expression?因为你构建起来就是VR VR person的一个一个值嘛,而且大家可以看到确实是进来了,好,紧接着我们继续往下走啊,继续往下走,下一个扫描的是什么呢?同学们下一个就扫描到加号了,于是它进到加,进到加,它会先把这个left弹出来,这个left再弹出来是什么呢?就是这个A,是不是我这说的是弹出来这个A啊,弹出来这个A,这个A就是相当于它的呃左表达式,然后呢,再把这个B取出来,因为它要在这个句中再加加。再加加OK啊往下走,这个时候right就应该是B。
32:01
啊,果然是B,然后把这个right和na,通过这个na和right再构建一个爱的expression,再压到我们这里面去,看清楚没有。好,也就是说这个sta里面现在应该有一个元素是什么呢。就是我们爱的expression,刚开始VR expression,现在变成他了。是不是这样子的。OK啊,那你同学们往里面看到这里面应该有个左有个右,你左边这个是就是那个B,右边是那个呃呃左左边是A,右边是B是吧,也就这个I的expression呢,它是有两有有两个VR expression构成的。那这样子再去扫描,同学们就就再再追好,下次再扫的时候没有了,因为全部扫完了,我这就一个A加B好再往下面走。好,回到这儿。那走到这里,走到这个地方过后,这这个cul呢,它这个。呃,就是那个站已经形成了,再往下走,再往下面走呢,他就开始去让,让的话呢,我们也往里面追。
33:06
好,第一次我们是对字符串的构建,先弹出来。再往里面追。还是字符串的,不管它接再往再弹出来。然后再往里面追好,这次就应该追到run方法里面去了,哎,还还得出来一次再追一下才进去啊,因为他这边有两个加号。OK,现在我们应该知道这个他的这个run run里面不是有个。Run方法里面不是它就执行到interpreter了吗?好,这个interpreter我就不继续不具具体的往里面追了,追一次吧,大家看,让大家看一下。觉到这里面是不是他去取得他左就是那个左边那个表达式的值从哪取的呢?从这个VR里面取的,那换言之就是当他执行完了过后,这边就应该取到A。在这个VR里面的值是几呢?是十,我们来看现在现在有没有渠道啊,来我们往里面追一下。
34:04
好取是不是取到了,那我们弹回来。弹过来过,如果我们用watch看这个的话,你会看到这个值就应该是十。是不是十呢?往下看。好,不着急,我们看一下,没错,没关系,看是不是10SUPER LA的点interpreter VR是不是取出十了,就是那个A,对A在这个VR哈,这VR这个哈希map里面的那个位置取出来了,紧接着。还要取一个。好,我先往下执行,这个执行它就返回去了。对吧,我们可以把它。再往里面追一下。再往里面追一下。又追到第二个,这个时候这个K呢是B啊,果然是B,然后再呃,再返回去,再返回去,我们我们就知道这个值应该是几了呢,这个值就应该是。就是B对应的。对应的值,那应该是二次。
35:00
我们。Watch一下。大家可以看到,是不是又多了一个。20好一个十,一个20相加,相加完了过后往下走是不是返回去了。这个就返回,再往下面走,返回去,返回到哪去呢?返回到这来,返回到这,再往下面一执行,这个结果就应该是20,所以说他他把这个表达式输出来,应该是A加B等于20,这个结果就出来了,往下再走一一步就可以了。大家看A哦,嗨,什么20啊,一刚一个是十,一个是20,加起来等于30,说错了啊,就是嗯,你A对应的是十嘛,刚才大家看到了,从这可以看到的确是这样子的。对不对,那现在这个就看不到了,第一次我们取出来这个left是十,第二个是20,十加20等于30,正确的。好,同学们,那关于这个源码的一个类图,还有它代码的一个。第八个我们就聊到这,不知道大家理解没有,其实大家不用去特别的纠结说,诶说老师,那你这个是怎么一步步,嗯实现的就怎么去,呃,这个站是怎么工作的,这个你可以不用去了解,你你重点听的是什么呢?你重点听的是他这种设计的一种结构,它是怎么样,他把这个左右就左表达式左边的一个expression,右边expression,还有VR symbol,它把它做成一个什么呢?
36:22
那我们再看一下这个类图哈。也就是说他这个解析器啊。大家不能理解成。呃,就是说这个解释器模式呢,不不能理解成好像我们就一个解释,好像我们就一个解释器,一个类就搞定了,它不是这样子的,它是根据你的业务逻辑把这个表达式分成了。Inter。呃,那个terminal expression和non terminal expression,然后呢,再根据你的这个实际的业务逻辑把它分开,可能下面还有指类,然后呢,我生成了以后,我到底调用VR expression还是symbol expression,下面的子类就要根据业务逻辑来处理了。
37:02
所以说显视器设计模式其实相对来说难度是比较大的。而且呢,在我们实际开发中用的可能并不是那么的容易,就是它使用的难度比较大,因为他一般跟什么呢,跟这个语法。或者跟我们一个。或者是跟一个表达式的解析有关,这些呢相对比较难一点,好,但是这个模式呢,结构还是比较清晰的,因为这样做呢,比较容易扩展,你比如说我们将来要做一个乘法的一个表达式,或者除法的一个表达式的处理,是不是我在这加一个子类,然后对相应的业务逻辑进行一个处理就可以了。还是有它的优越性的好吗?好,同学们,那关于显视器模式来解决一个四则运算的。嗯,案例呢,就给同学们聊到这里。
我来说两句