00:02
命令模式在spring框架中的使用,我们看了一下,在spring框架里面呢,有个JD bc template。在这里面呢,他用到了我们的。命令模式。OK,我们来看一下在哪里呢?来,我们先做一段代码分析。通过这个代码分析,我们找到它这个命令模式的使用,呃,我这里先给大家讲一下,就是命令模式呢,它在这个spring框架里面使用的时候,跟我们标准的模式是有一点区别的。记不记得我在以前给大家讲过,我们讲的这个设计模式是一种标准的理想的一种模式,但实际上在开发中呢,我曾经讲过,就说别人在写框架的时候,他会潜移默化的不知不觉的使用了这种模式,但是他并没有有意的说,诶你你是这样规定的,你韩你韩老师,或者说你这个。这个四人帮是这么去讲的,那人家就按这个写,人家主要是体现出这种精神,所以说待会我们在分析这个JD jdp template,用这个命令模式的时候呢,跟我们讲的标准模式略有差别,但是核心思想不变,来吧,我们来看一下,首先呢,我们找到。
01:18
就是命令模式里面核心的几个角色来打开,这边我们来写一段代码来看一下。嗯,怎么写呢?我们先把这些不要的先关闭一下,好吧,我们现在都关闭。那关闭过后呢,我们新建一个文件。还是在spring里面我们新建一个文件。那这个文件我们取个名字就叫command。把这个主方法呢,咱们勾上。好,我们来看一下吧,同学们。哦,我们就从这个JD bc template去找看到的源码,我们首先看JD bc template。
02:01
这个源码呢?往上看啊,这个JDBC。Template里面有一个方法,他的方法很多,我们不可能一个一个给他看,我直接剪紧要的方法看,就是这个。Query这个方法,在这个方法里面大家有看到,大家注意观察,在这里面呢,它调用调用了一个query,看到没有,这个query里面呢,会接收参数,这个我们就呃,我们待会往里面追,我找到这个query。大家有没有发现这个query,你们有没有发现,诶这个里面呢。他有这么一段代码,其中里面有一个特别有意思的东西,大家有没有发现他在这里面写了一个,累不累?诶,也就是说在query这个方法里面,我们把它打开一点。大家看query方法,这内部呢,它定了定义了一个类叫query statement call back。那么这个query statement com back这个内部类呢?它实现了一个接口叫statement call back,我们追下这个接口。
03:07
大家追到这个接口,你会发现这个接口里面呢,它定义了一个方法叫做do in statement,可以看出来这个方法呢,在这里是个抽象的,看到没有,OK。那么这个这个do statement其实就有点类似于我们。我们这个命令接口,也就是说STEM call back,有点类似于我们前面讲的命令接口。这个命令接口里面呢,有一个方法。大家回忆一下。我们在前面讲。这个命令模式的是不是,我们是不是讲了command,那个command呢?Command,那那里面是不是有他的。那个抽象方法是需要去备子类实现的。这里面同学们看到的statement call back就有点类似于命令接口,那么我们来看看他下面哪一个类。
04:02
去实现了这个接口呢。我们往这儿一看,我们发现诶还有好些呢。那其中有一个就是刚才我们看到的,这看有四个啊,我们就看其中一个叫query。点进去。点进去又回到了刚才我们这个块方法。大家看到query方法是在JDBC。看到没有,在这里面呢,有一个静态类,就是同学们刚才看到的,它实现了这个接口。而且我们有发现这个类的的确确去实现了do in。诶,大家有没有发现这个query就有点类似于我们这个前面讲的实现了接口的那一个具体的指类。同时呢,在这你们有没有发现它直接调用了SQ里面有一个query statement call back实例,也就是说相当于什么呢?相当于在这个地方,我们这个就是具体的实现命令接口的那个词类。同时它。
05:11
又充当了什么呢?又充当了这个士兵的角色。就视频这个类呢,就没有单独的写了。那么我们再来看这一个跨越方法是在哪里被调用的。同学们有没发现query这个方法呢?实际上是在d bc template调用的,所以说我们认为JD bc template就是我们的invoker以及我们的命令调用者。大家再来看我们这个示意图,同学们看到流程大概是这样子的。就是说在JD bc template里面呢,有一个query方法,这个query方法大家看到。到这来了,这个query方法里面呢,它有一在这个框方法里边,它有一个内部。内部类,这个内部类它实现了statement这个接口,所以说我们认为这个就有点类似于我们的命令接口。
06:08
命令接口。不着急啊,待会儿我们还要整理。那下面这个呢。就是我们具体的子类。是不是这个就有点类似我们。这一个子类,那这个子类呢,它实现了命令接口。是吧?同时呢,他在这里也充当了士兵的角色。士兵的角色。那同学们可以看到在这个地方,它掉的时候,它掉的时候它会创建它在这个SQ的里面执行一个方法,这个SQ的是在哪里实现的呢?是在JD bc temp里面实现的。所以说JD bc temp呢,就分析出来这个角色有点类似我们的invoker。因。Invoker就是我们的这个命令的调用者,大家还记得吧?
07:01
就是我们命令的调用者。那么这个既然是命令的调用者,同学们可以看到他在这里面一定会去调一个方法,大家看这边是不是有个action。这个action就是你这传进来的query comba的一个实例,而这个实例里面大家可能看到。他调用了do。In STEM,诶,大家还记不记得这个方法是从哪来的?这个方法是不是我们这个query STEM的这个内部类去实现这个命令接口里面的一个方法?对,这样关系大家大致看出来没有,所以说我们分析出来这个是命令接口,而在这个子类这个地方呢,它就是我们的一个具体的一个命令接口的之类,同时它充当了士兵的角色,也就是充当了receiver的角色,同时呢,在这个jdp template呢,它里面又有一个SQ的方法,所以说他就是我们的命令调用者。那我们还要分析出来,就是实现这个statement call back这个接口呢,不仅仅只有这一个query statement back,它还有另外一些。
08:09
是不是又有点类似于我们前面讲的就是我们有我们命令接口里面是不是有前面讲的是net电灯的电灯。D电灯这个命令我们是不是还有什么呀?是不是还有这个TV。TV打开和关闭的这个命令,明白这意思吧,所以说我们可以看到从这个地方的追踪,我们可以再看一下来再看一下这个接口。往下看。来,我们再追一个。我们这次呢,找一个SQ的STEM的call back点进去大家发现没有,它在这个地方也有一个SQ的里面呢,也在这里面有一个SQ的statement,在这里面它也实现了do in statement,同时大家看在这面调用SQ的传入了SQ的STEM com back实力,那么我们来看SQ的在哪里,他仍然在JD bc template,大家有没有发现在这只是他这里面接收的这一个命令呢?Action,这个action。
09:13
这个action就是实现了刚才我们那就是那个对象的实力,同时我们看这个action里面一定会调用,调用我们那个接口的do in statement有没有往下看是不是在这。OK,所以说通过这样一个分析呢,我们发现。大致我们就从这个流程里面可以看到,它的确是使用了我们的命令模式,只是呢,它是以内部类的形式来实现我们这个命令接口的,所以说下面呢,我对他做一点对他的角色。模式的角色就是我们这个模式的角色,分析做几点说明,我们先来整理一下其中同学们看到的statement。STEM的这个call back还记得吧,Call back这个接口,这个接口就可类似什么呢?类似这样写啊类似。
10:05
命令接口,命令接口,这个命令接口就是前面我们讲的command。对吧,我们在来看,我们刚才是不是还看到了,就是累不累,就这个东西。我们在这里面,我们找的这个累不累好吧。诶把它找一下,诶往这儿打。不着急,我们找到query,就是这个累不累?同学们看到这个东西。OK,我把它拿过来好吧。这个呢?这个同学们看到的这个。就是query。我把它标另外一个颜色。它是什么呢?诶,这个它是一个匿名的,匿名的类不类。累不累?那他是在我们这个,呃,命令模式里面,它充当什么角色呢?OK,该命令他实现了,他实现了,实现了我们的命令接口。
11:04
命令接口,所以说他同时同时又也充当了,他同时充当了什么呢?这个我们叫做接收者的角色,就是命令接收者。接收,接收者角色。啊,命令接收角角色,它是两个,他同时他一次实现了这个接口,同时也也充当了命令接收者。好,我们再来看,呃,那么当然这里面呢,它会。他会去实现这个方法啊,就是往下再看一个。命令调用者。命令的调用者是哪一个呢?就是命令调用者,从这里面我们可以看出来,就是是哪一个呢?就是从这分析的是JDBC。Complete是不是这个东西啊。其中其中他有一个方法叫SQ的,大家还有没有印象在这里。
12:00
我们找到它的这个SQ的。是这儿吧。我们往里面看一下好吧。这个SQ的大家有发现。那么这个SQ的它接收的就是一个实现了命令接口的一个对象实例。发现没有?其中我们把这个写写全啊,他干什么呢?这个方法,其中这样一个方法,他干什么呀。它实际上这里在这个方法中。调用了,调用了什么呢?Action的读音。什么呀,Statement?读音,Statement statement这个方法。也就是说我们这个调用者呢,他接收到一个实现接口的对象实例,再去调用,所以说我们认为他其实也也就是说实现了这个statement的,就相当于充当了一个命令的接受者,大家就这么来的,为什么?因为你是调的他的方法吗?我们前面是不是。
13:03
那个receiver的方法on of也是调用接收者的方法。是吧,他在这边调用这个方法。好,这个地方我们可以分析到到位。好,那么这里要注意哈,就是不同的不同的这个实现之类,不同的实现,这个statement call back的。注意这样写不同的实现statement call back接口的接口的对象。对象对应对应不同的这个do in statement的实现。这个我就不用多说了吧。对应不同的do statement的实那个实现实现方法。就是你这个方法实际上,但是具体这个逻辑不一样,叫实现逻辑吧。对不对,还有一点我们要看,呃,说明一下,就是另外另外什么呢,实现这个statement的这个接口呢,不仅还有其他的三个,我们也把它列出来。
14:11
另外实现这个接口的命令接口的,命令接口的。命令接口的什么呀,类子类还有。还有哪几个呢?我们把它列一下。从我们这儿看到的,第一个就是,诶,我们找到这里哈。一个是query。是不是除此之外还有什么?还有什么?我们再来看一下。找到这个接口,好吧,我这样子,干脆这次我们省点事,直接把这个图截过来就可以了。这几个类其实你们去追发现都是累不累。都是类不累,匿名的类累不累,那么这个时候他在这个类里面去实现了我们这个接口,它是这种方式的哈,还有另外几个,我就写到这就可以了。
15:03
好,同学们通,通过这样一个分析呢,我们就可以领会到。这种命令模式在实际的开源框架里面中使用到的,但是有一点我再重复一下,多说一句,就是我反复在强调,我们讲的这种模式呢,是一种标准的写法,但是在实际的应用中,只要有这种,只要有有这种核心思想在里边,都可以称之为这种模式,所以你不能说,诶说韩老师那这个不对啊,你这个地方实现STEM call back的,它不是一个独立的类啊,它是一个匿名,它是一个内部类,也也算是命令模式吗?当然也算。因为他这个逻辑是他整个核心思想是一样的,你不能因为这个类写在内部的,你就认为不是了,是不是同学们。而且我已经讲过了,设计模式这个学科,它并没有一个非常非常标准的说我必须怎么样。因为它是一种思想。
16:01
OK,只要他满足这个思想就可以。好的,同学们,那关于命令模式在我们这个spring源码里面的使用分析,我们就到这里。
我来说两句