00:02
我们看一下静态代理。相对静态代理做一个比较基本的介绍,静态代理在使用中他需要定义接口或者是类。被代理对象及及我们这个目标对象呢,与代理对象一起实现共同的接口或者继承相同的互联,也就是说这个静态代理一定要去通过通过这个接口或者继承的方式来完成。那这样子讲呢,大家可能还是不太明白,这样子我们直接组案例,直接看应用实例,我们这有这样一个实例,说有一个老师teacher,我简单写啊teacher,这个teacher呢,有一天生病了,他。不能上课,我们找一个代理教师去帮我们去上课。具体要求这样子的定义一个接口叫IDAO,然后目标对象呢,Teach DA,实现这个IDA,也就是这个是我们的目标对象,这是我们的一个接口。OK,那么使用静态代理方法干什么呢?就需要在代理对象及这个代理对象,就是我们待会要写的teach do proxy中也实现这个接口。
01:11
然后调用的时候呢,通过调用代理对象的方法来调用我们目标对象。特别提醒一下,代理对象和目标对象要实现相同的接口,这样才可以,然后通过调用相同的方法来调用目标对象,好,这个具体的实例这样讲呢,大家可能是不太清晰的,这样子我们画一个图,然后再走代码,大家就明白我要做什么事了。来,还是按照刚才思路来走,现在我们先讲的是一个静态代理,因此我先占一个包。啊,这一个包tie a static static静态pro,好吧,简单要写到这。那现在呢,我们先把刚才这个示意图画一下啊,就类图,我们以类图来展示。待会儿要做一件什么事情呢?大致的意思是这样子,首先呢,我会有一个teach。
02:03
Teacher,我们看是teacher还是teacher,根据他啊,Teacher teacher DA。有个teacher teacher do。好,Teacher do,坏,重新改一下teacher。DAO,那么这个teacher DA里面呢,有一个方法来,同学们有一个方法,我们改一下名字,就叫teacher,就是它有个。教书的方法,上课的方法提取。好的,那现在呢,我有一个客户端看清楚了,我有一个客户端。现在客户端呢,我们不直接去调teach DAO,我怎么做呢?看我的代码啊,我先写一个接口,这个接口我取个名字叫I。Teacher DAO,好的,这个DAO里面呢,有一个有一个接口里面也有个方法,什么方法呢,就是teacher。就是提。T,大家有没有看到在我这个画的类图里面,这个接口里面有个提,而这个DAO里面,DAO里面也有个提,那他们之间的关系就是我DAO去实现。
03:11
我们的I teacher do。OK,也就是我实现了它,那这里面我我们还有一个什么呢,被代理对象看清楚了,呃,就代理对象刚才说错了,叫什么呢?刚才已经说到的叫teacher。T teacher d。DAO。大家看这个就是我们的代理对象,代理对象怎么用呢,大家看。代理对象。代理对象里边他会去聚合,呃,聚合一个接口。啊聚合,诶这个划错了是吧,应该是这个聚,呃不不不说错了啊,说错了实现。对于这个接口,它是实现。也就是说我的代理,代理对象呢,或者代理类呢,也要去实现这个提,大家有没有发现,也就是说你这里面一个提取方法,我这里面接口有个地方,那就意味着我这个代理对象里面应该也有一个提取方法。
04:12
啊,不着急啊,我们慢慢讲就行了,诶这个地方这个图怎么。好,把这个换了T。OK teacher teacher teacher,那么我在里面实验这个方法,我怎么调呢?我显然要调他的。也就是说我这个代理对象其实要调这个被代理的。方被代理对象的方法。那我怎么样才能实现呢?显然我这个地方要聚合它。或者要使用它。看到没有,当然我在进行这个聚合的时候,实际上是通过这个接口来聚合的,因为你这个teacher do实现了这个接口,那意味着我去以这个接口的形式跟你发生一个聚合,这是可以的。
05:00
是这样子吗?同学们好,那我这个connect怎么调呢?各位朋友这一边我们去创建或或者叫是去拿到一个teacher DA这个代理对象。代理对象,然后呢,再去用这个teacher。Teacher do就完成了,我把这方做一个注释。准确来说这个看怎么做这个事啊,他第一步呢,他要创建。创建一个teacher。Teacher DAO这个代理对象,这个是肯定有的。他第一步要创建一个这个东西,第二步我们往这放大一点,第二步在创建一个什么呢?Teacher。DAO。这个对象第三步。他干什么呢?将这个teacher。Teacher teacher DAO这个对象干什么交给。啊,交给交给谁呀,交给我们这个teacher。
06:00
道。Proxy这个对象。然后呢,干什么呢,执行相关方法。执行方法,也就是也就是说我们这方是相当于干什么呢?我们这创建了这个对象,再创建这个对象,再把再把这个对象聚合到我们这个代理对象里面去,让他去完成调,因为他这有提提方法吗。他这有提取方法吗?我在这个方法里面去调查的方法就完成了。所以说这个家伙就充当了一个代理作用,代理的作用也就是说我们这个teacher teacher,呃,这个兰并不直接调用这个teacher do方法的teacher,而是通过他的这个提方法调用被。代理这个对象的提取方法。大家大致明白了吗?好,不明白没关系,我马上走下代码,同样道理,把它怎么样?抱起来,好,现在我们把代码写一下,大家一目而了然,来走一个,我们按顺序来写,先写接口。静态代理是最简单的,同学们一听就明白哦,DAO没问题。
07:02
好的,我们在这里呢,写上这个接口对不对,那这个接口的方法,同学们跟上老师思路,我们在这里面写一个什么呢?走一个这个是接口。好的,那现在呢,我们。写一个方法吧,最简单VO teach。好,这个就是我们一个授课的方法。没问题啊,同学们,没问题,好,紧接着我们来分析,在这地方有一个teacher teacher d,先把这个写上来,跟上我的思路。写个。Teacher DAO他要干什么呢?这个DAO要去。实现我们的接口。实验哪个接口刚才写的I teacher do,显然这个方法呢,我们要做一下。是吧?诶小事,那我这边就十个亿吧,我就直接写一句话就可以了,叫什么呢,叫做老师正在授课。
08:03
对吧,我们叫做老师授课中。很简单,写完了。好,那现在这个方法,因为我们不直接调,不直接调我让什么呢?我让我的代理对象帮我调他代理对他,那现在我们写上这个teacher。DAO。名字很清晰,就是我要代理的是这个对象。Teacher do这个对象。好的,那同样我要代理他呢,我们要去同样实现这个接口,因为它是基于接口的实现来完成这个代理的。同样这个方法我们写的出来。OK啊,那同学们想一想,刚才我讲了在这个teacher。Do里面呢,它会聚合一个teacher do,但是呢是通过这个接口来聚合的,所以说我在这地方应该写个什么,大家明白我要写什么吧,其实非常的简单。我们只要写这样一个属性,看到在这写一句话。
09:02
这个我先做一个注释,这是代理对象,OK,他现在用的是静态代理。静泰代理。啊,代理写错了,代理。好,那么写写。Private I。Teacher zo。Do是接接口的,对不对?所以我就写个target。目标,那么先对他做一个简单的解释,就是这是我们的一个,呃,这这个地方我们要干什么,这个就是我们的目标。目标对象。啊,通过什么呢?通过接口来关联或者叫依赖。通过接口来聚合,这样写聚合。因为你的这个实际的下面的这个这个teacher do是实现这个接口的嘛,所以我通过这个接口来聚合是没问题的,你给我一个实现这个接口的对象,我就可以把它放进去,好的,那现在我们在构建。
10:03
我们这边肯定会有个构造,构造器把它传进来。所以这是接口吧,就传进来了,说这地方我们写一句话,这是构造器,这个构造器呢,我在构建一个teacher do proxy对象的时候,你给我传一个接口进来,而这个接口肯定是。实现了这个接口的一个。具体的子类对象好,拿到了,这个super不要了。那这里面调是不是就很简单了,怎么调啊?写一句话,先写一句话,开始就是我们叫代理对象。开始代理。啊,就代理开始吧,好吧,代理开始。OK,那这边我们再写一句话,叫代理结束。是不是代理结束叫做代理?代理结束,代理结束。当然更多的地方呢,可能是这边可能是个提交,相当于说这边我们要这边要开始了,这边结束呃结束呃呃叫提,我们改成叫提交吧,叫提交。
11:07
提交,提交什么什么什么什么。那中间呢,我们可以写写上我们真正要做事,哪一个呢,就是我们target。是不是target,这个target就是我们代理的对象,他去执行的提取方法。往往呢,有些有些时候可能是基于事物的,比如说我们事物刚开始,有些事物的一些开始,然后呢,执行,执行完了把它提交,往往是这样一种操作,也就是说我在这个这个代理的时候呢,我可以写些额外的代码。刚才还记不记得我们代理的代理的这个目,代理的这个目的是什么呀?是不是就是为了增强或者叫增强他一些额外的功能,比如说我我们我们可以代理多个嘛,你下面有很多这个实现ITD方法,我前面都要做一些事情,后面也都要做一些事情,干什么呢?我把最核心的代码都让子去实现,那么这些额外的共同的方法,我就写在这个代理对象里面去,不就很方便吗?
12:06
大家能理会这个意思吧,就这这这些对吧,可以这样子去做。啊,也就是说说的再直接一点,就是假如我们这个地方还有别的要代理的。对不对,还有别的要代理的可以,假如很多,那这些方法呢,核心代码他有,但是他们执行这些方法的时候,都会有一些呃共同的方法,我就可以把它放在teacher do到呃,Park里面去,比如说我要检查他们的安全性。或者检查他们的一些这个这个合合合法性,验证他们的数据是否合理,然后有没有错误的输入等等,是不是这样就比较方便了好。大大应该大致明白这个意思吧,好的同学们,那现在呢,我们基本上就把这个写写完了,带你开始完成一些共同事情啊,完成某些。某些事,呃,那个操作。操作。
13:03
好的,那这边就提交了,那现在有了这样的方法过后,我们是不是还差最后一个了。还差哪一个这块写了,这块写了,这块也写了,现在差一个C,我们来调用它一下。转。有扣单的调用。刚才我们已经分析过这个流程了。你客户端调用的时候呢,还是要创建两个对象实例,一个是代理对象,一个是被代理对象,是这样子吧,所以说我在这个地方呢,我先来这样做,我先创建。创建这个目标。目标对象,这个目标对象六一个对不对,Teacher DAO。这是我们的目标对象。也就是也是我们的被代理对象。背带。代理对象,OK?那这边做完了以后呢,我们在创建代理对象。代理对象没问题吧,代理对象就是我们的teacher。
14:01
到。Box,这个时候我们要把被代理对象放到代理对象里面去,这点很重要,同学们,这点很重要,好,这边我们干什么呢?产生了一个teacher do party这句话,创建一个代理者。同时。同时将被代理对象干什么?同时把将被代理对象传给。传递给代理对象。是不是要把它传进去了,传进去以后好第三一步执行。就是说呃,干什么呢,就是说通过代理对象,代理对象调用啊,调用到调用到哪里呢,被带。已对象的方法。也就是说这个时候我们只需要这样调就可以了,点什么呀。点T。这个地方大家一定要明白哈,就是说我们这里面是执从这里面执行的是通过执行的是代理代理对象的方法,但是这个代理对象再去调用我们目标对象的方法,也就是说这方可以这样理解,即。
15:16
急什么呢?执行的是代理对象的方法。代理对象的嘛,那么呃,代理对象,代理对象再去。在。再去调用目标对象,目标对象的方法。其实大家一看就明白是什么意思了,你看在这边我直接是T方法,但在这里面呢,诶,我我应该是这样追的啊,刚才这样追追错了,应该怎样追这个地方。这个地方它。这个。哦哦,我这调错了,不好意思到这teacher do touch,我们再往里面追一下,大家看一下,大家看是不是在这来了。
16:01
他在这呢,看着看起来好像用的是我们的代理对象的方法,但实际上本质还是用的我们的什么呀,被代理或者叫目标对象的方法,明白好,我们执行一下,大家就一目了然来走一个运行值,我们预习呢,我们可以看到。开始。代理完成了某些操作。老师授课中提交。好的同学们,这个代码呢,我们就先聊到这。其实也不是很难,对不对,我们来简单分析一下他的优点和他的缺点。那么代理对象的优缺点,优点是在不修改目标对象的功能前提下。通过代理。目标对。这个功能进行扩展了,为什么呢?大家看这你原先这个。这个地方就是职业授课,比如说你这个到就是职业授课中,那可能这个老师授课之前有一些准备资料什么的过程是吧,我们就可以,我们就可以干什么呢?可以在老师授课之前,或者授课过后,我们可以干什么呀,做一些工作,比如说我通过这个地方来调一些其他方法。
17:09
给他准备一些。其他的工作,我这只是输出一句话嘛,但这边也可以调用其他方法嘛,也可以是方法嘛,也可以是其他的方法嘛,对不对,诶大家应该理解啊,就说你相当于说你这个核心方法我还是用,但是呢,在他之前或者之后我可以写一些额外的方法,比如说验证你的权限够不够啊,加个衣服判断啊等等,这都是可以的。所以说他在地方提的是这样的一个特点,缺点是因为代理对象需要与目标对象实现同样的接口。你看这个地方怎么说的呢?同学们看这里还是看我们这个图,一目而了然,你看你的代理对象要去实现it圈do,我的哦,你的被代理对象要去实现I teacher,你的代理对象也要实现这个I teacher do,是不是他们都要实现同样的这个接口。
18:01
所以会有很多的代理类。那代理人优惠很多了,那么一旦接口增加方法,目标对象与代理对象都要维护,假如说我们这个接口增加了一个方法。那你想一想,如果你这个地方增加了一个方法,我这个就是。这块和这块都要做相应的改变,因为你都实现了,我加了一个方法,你能不去实现吗?肯定都要实现,所以说这样的维护起来呢,相对来说要麻烦一点。OK,好,那这个呢,就是我们静态代理的一个案例,以及他的一个分析,我们就到这儿,下面呢,我们接着讲动态代理。
我来说两句