00:00
解释器模式的基本介绍,我们这里总结了四句话,我们来看一下。那么解释器模式呢,从它的基本的概念来说呢,理解起来不是特别的容易,大家先听一下,待会呢,我们用具体的案例来讲解,会轻松一点哈。我们先来看一下显示器模式呢,是这样子的,它在编译原理里边呢,一个算术表达式,通过词法分析,词法分析器形成一个词法单元,这是解释它的一个原始的概念。而而后这些词法单元再通过语法分析器构建我们的语法分析树,最终它会生成一颗抽象的语法分析树,那么这里的词法分析器还有语法分析器都可以看成是解释器。那换言之就是说什么意思呢?它是这样子的,就是解释器模式叫interpreter pattern,它是指给定一个语言,但是给的这个语言呢,它肯定是一种表达式的形式来体现出来的,比如说他给给你一个表达式,然后需要我们干什么呢?需要我们编程人员定义他的文法。
01:10
啊,定义它的文化的一种表示,并且呢,定义一个解释器,使用这个解释器来解释这种语言写的句子,也就是说用这用来解释这个表达式。那说白了,解释器就好像说你这里有一个。呃,有一段代码或者是一个表达式,通过我们的解释器,通过我们这个解释器得到了一个什么呢?得到了一个结果,好,这这个地方就是我们解释器,当然解释器呢,它可能不是像我们简单的理解成就一个类或者一个方法,不是的,它这里面可能会根据你的这一个业务逻辑不同,它会生成好些个解释器,明白吧。就是说大家不能认为说,诶好像做做一个简单的翻译,因为这里面他会构建一个体系,就是我们的解释的一个体系,待会儿呢,大家看这个类图能够看出来的。
02:00
那么应用场景有哪些呢?它应用场景一般是这样子的,将一个需要解释执行的语句中的一个句子表示成一颗抽象的语法树。这是一种,还有呢,就是一些重复出现的语句,可以用一个简单的语言来表达。还有就是一个简单的语法,语法需要解释的场景,你比如说像编译器运算表达,运算表达式的计算,正则表达式。还有机器人等等。那大家可能很多人是用过正则表达式的,你比如说我们写一个正则表达式是吧,写杠一个问号或者心,那表示什么含义,那么我们如果说每次都写一段代码来来分析的话,肯定就很复杂,因为你这边还涉及到一些。一些一些比较他们之间的一种关系的问题。所以说他会用解释器模式来处理。呃,那么这样子讲的过程中大家比较抽象,我们这样子我们画一个。解释器模式的原理类图对画一个原理类图呢,我们在对它的角色就是解释器模式里面。
03:06
他拥有的角色以及他各个角色的职责做一个分析,然后再走一个应用案例,对,再看一个源码,大家就会清晰很多。好,我们首先要明白显示器。它的模式的英文是interpreter,好,这个单词大家要注意好,现在呢,我们就在这边来玩一把,来同学们,现在我们在这里呢,新建一个包,OK。我们新建一个包。叫interpreter。Interpreter OK interpreter解释器的意思。那这里呢,我们就建一个类图好吧,我们创建类图。那这个类图里面有哪些相关的类或者说属性呢?首先我们看到它会有一个抽象类abstract。Up,它这个抽象类呢,一般是抽象的一个表达式,这个地方呢,呃,它不是一,它是一个抽象类。
04:05
呃,它是一个表达式的图像类,这里面呢,会有一个非常重要的方法,就是这个inter interpreter。写到这里,Interpreter。啊,Interpreter就这个东西。那这个interpret啊,不是了,那就是特。因为他是个解释嘛。Interpret,这样子写好吧,解释。那么这个地方具体解释是由谁来实现呢?有两种类,有两种类,一种类呢叫terminal,我们写到这termin。A terminal expression。好,待会我们再解释这是什么意思,这个terminal expression表示为这个称之为终结符表达式,待会我再解释他会干什么呢?OK,他会去继承他。
05:01
他会去继承它,还有一个,还有一种类呢,啊,还有一种表达式叫非终结表达式,这个呢叫做none。Terminal。Terminal how。那他也会干什么呢?他也会去继承我们这一个abstract abstract expression OK,他会,他也会去继承这个。那同学们还要看到这边有个比较重要的细节,就是呃,这个abstract abstract expression呢,它会聚合到我们这个no terminal expression,那也就是说我们需要再画一条线,这条线呢,就这个聚合这条线。好,聚合这条线呢,我把它稍微的整理一下。好拉一下,这样好看哈。好把这个往这边,诶耶耶耶,这个好朋友拉完了过后又变成这个德行了,好就这样子吧,大家明白什么意思就是了,就说abstraction expression呢,它这个会聚合到,对,它会聚合到我们这个一个no。
06:08
Terminal expression,或者是terminal expression。就是它有个聚合的一个概念,待会儿呢,大家可以看到这样一种特点。好,那有了这样一个东西过后,还有一个什么东西呢?同学看到还有一个叫contact类。待会我们再做解释好吧,Context类上下文的这里面会拿到一些全局的东西,比如说你在使用这个解释器的时候,会得到一些输入,或者是表示一些全局的变量呢,会放在这个contact上下文这这个类里面,然后我们还差一个什么呢?还差一个就调用方。那调用调用这个类它会怎么去使用呢?它会依赖context或者是object。好,他会,诶这个是乙来,那么用这条线来表示OK。大体就是这么一个图形,那针对这个这个类图呢,我们来做一些说明,好吧,针对这个类图,我们把它的这个角色,它的含义和他要完成的事情呢,给他做一个简短的说明来放到这里来。
07:11
这是我们的类图,我们来描述一下。跟上我的思路,首先我们看,呃,我们看这个context。这个contextt是个什么?它是一个环境角色。OK,环境角色听起来有点绕,好不着急,它包含什么呢?它还有吧,还有。它含有什么东西呢?它含有解释器之外的一些全局信息,就是解释器。解释器之外的。之外的全局信息。OK,全局信息。那至于呃,全局信息是什么,待会我们走案例的时候,再给大家具体的进行一个介绍,这里先有一个概念。那么我们再来看下一个,下一个要该说的就是abstract。
08:01
什么expression ex PR,这个是什么呢?这是一个抽象表达式。抽象表达式,它的这个职能是什么呢?我们来看一下,他是声明。OK,注意听他是声明一个抽象的解释操作。解释操作,这个解释操作同学们已经看到了,叫。Interpret,那么这个解释,这个抽象的解释操作,也也就是说这个接口,这个接口为抽象语法数中所有节点共享的。这句话有点绕对吧,就是这个方这个接口。或者叫这个方法吧,这个方法这个抽象的方法,为什么呢为抽象。抽象语法数。语法数这个。往上面提提好吧,为抽象语法数中所有的所有中所有的节点所共享。
09:05
节点所共享。那有些同学同学们说,什么叫做节点呢?你可以简单的理解成是它的子类。啊,可以这样简单的理解,好,我们再来看第三一个同学们看到terminal termmy terminal什么呢?Terminal expression。这个是一个什么呢?这个为终叫终结符,表达式叫终结终结符。表达式,看看有没有啊,大家没有终结符。终结符表达式。OK,那作为终结不表达式,它是干什么呢?它是实现,它的作用是实现与我们这个文法。啊,这听起来都有点儿绕,和这个文把终的什么呀,终结符相关的解释,操作终结符。
10:02
对终结符相关的解释操作。说的再明白一点,就是说这个terminal expression呢,它需要去实现我们这个interpret方法,那当然要根据具体的业务逻辑来做了,还有一个就是none。诺米。Terminal expression。那这个是什么东西呢?OK,我们来说一下这个为就是为非终结啊,除以啊为非终结。非终结表达式。为非中它为什么呢?为为啊,应该说为他为什么呢?为这个文法中的文法中的非终结。非终结佛啊对为非终结符实现操作,实现这个解释操作。OK,解释操作。
11:02
这么一个逻辑,OK,嗯,那这样子大家可以看到,也就是说它这个表达式呢,分成两种啊,一种呢,我们称之为terminal expression,还有叫非终结,那就是说我们这个表达式。哪一个是中介,哪一个非中介,这个呢要跟他的业务逻辑相关,跟他的业务逻辑相关,待会呢,我们走案例的时候才能把这个说清楚,好吧,大家现在脑海里面有这个概念就行了。那紧接着我们再说明一下,大家可以看到就是context的obstra,你会发现呢,这里没有什么关联,他这个没有关联是为什么呢?是这样子的说明,呃,就是。这个输入输入context。Context里面不是有些全局的信息吗?输入context和terminal,就是大家看到terminal。Terminal expression to me。Terminal。Expression。
12:01
CC。这些这些信息是可以什么呢?通过我们这个client输入即可。即可,那也就说在这个里面呢,我会去创建context,同时呢,干什么,我会去创建这个terminal。啊,以此类推,好大概的这个角色呢,我们就说到这儿,可能大家听到这呢,应该是一脸茫然的,就也不知道老师在说什么,因为我们说检视器模式啊,它往往跟我们的编译原理,就是它对这个语法,它是呃,一般是现在对一些比较抽象的或者难于理解的一些。一些模式进行解释的,所以这个概念呢,比较抽象。那这样子没有关系,下面呢,我们就在这个解释器模式的原理类图的基础上,我们来完成前面提出的怎么样这个需求,哪个需求呢?就是我输入一个,呃,输入一个表达式,然后再输入这个表达式里面的每一个变量的值,然后让他把这个结构算出来。
13:05
通过这个呢,我相信大家可能理解会上一个就是更清晰一点,好具体下一个,呃,具体的应用实例呢,我们放在下个视频为大家讲解。
我来说两句