00:00
好,那下面呢,咱们就来看一下这个静态代理该如何实现,首先呢,大家要注意静态代理的特点就是一对一,我们当前的一个代理类,然后对应的是一个目标类,然后也就是说当前这个代理类只能来作为当前这个目标类的一个代理。好,那这个东西该如何实现?大家注意,我们还是先从这个代理模式的概念说起。首先呢,代理模式是为我们的目标对象来创建一个它所对应的代理对象,每一次我们去访问代目标对象中的功能的时候,咱们都是通过代理对象间接的来进行访问。好,然后呢,所以说咱们从这一方面,咱们是不是可以得出来一个结论,就是说我的目标对象他能做什么,我的代理对象是不是也能做什么,换句话来说,我的目标对象所实现的功能,也就是说咱们从代码层面来说,目标对象中它所实现的方法,它有的方法,那我们的代理对象是不是也要有这些方法,对不对,因为我们每一次访问目标对象都是通过代理对象间接来访问的嘛,是不是这样的啊,好,然后再往下就是然后我们可以通过咱们的代理对象去控制目标对象执行的过程,然后从而去加入一些额外的操作,来进行一个代码增强的效果,对不对,也就是在我们当前目标对象代码不改变的情况下,然后通过代理对象,然后间接的去访问我们的目标对象中的功能,并且在它实现功能的过程中来加入一些额外的操作,OK吧,好,那下面呢,咱们就从代码层面,然后咱们。
01:38
把它来给写一下啊,大家首先你要知道什么是代理模式,好,然后下面咱们把这个类呢给创建一下。它叫做calculator stay。是我们这个计算器的静态代理类,好,然后我们创建完之后呢,下面咱们应该怎么写呢?大家想一下,我们首先咱们要来保证第一点啊,就是说我的目标类能实现什么功能,我的代理类也能实现什么功能,因为我们说了,每一次咱们访问代理对象的时候,都是通过目标对象间接的来访问,对吧?那所以说我的目标类能实现什么,代理类也能实现什么,那咱们从代码层面该怎么做?
02:17
大家想想你的目标类中的方法从哪儿来的?是它实现了calculator接口之后继承而来的,那所以说我们要想让你的代理类跟目标类实现功能一致,很简单,咱们呢目代理类一定要跟目标类实现相同的接口,大家注意啊,在这儿implementment,然后calculator就可以了。然后我们下面咱们把这些方法呢,给重写一下对吧?好,然后下面咱们第二个要保证的事情就是说什么我们的目标对象,然后咱们来每一有了代理模式之后,我们每一次访问目标对象是通过代理对象间接的来访问他。那所以说大家想想,那我们在代理对象里面,你怎么去实现这个功能,那我们是不是应该是要访问我们目标对象实现功能的过程,大家想想对不对,因为我们现在呢,你要保证结果一致呀,不管是我通过目标对象直接来实现,还是我通过代理对象间接来实现,我当前传进来了一个一,一个二,我加法运算之后的结果,它肯定都是三,不管是我通过目标对象来实现的,还是通过代理对象来实现的,它最终的结果都是三。
03:33
没问题吧,好,那所以说那我们现在该怎么来表示,大家注意你看啊,为什么我们说这个静态代理里面是一对一的,因为我们当前咱们的这一个类,咱们从名字上就能看出来,它只针对于我们的什么来进行代理啊,咱们的计算器进行代理,所以说在我们的代理类里面,你一定要知道目标类是谁呀,所以说我们在这儿可以把咱们的目标类给声明出来。对吧,大家看,你可以声明calculator接口,你也可以声明calculator I'm PL这个实现类的对象,它都是可以的,OK,行,那咱们把它创建完之后,那我们要给它赋值,那咱们来给一个成员变量赋值,那就set方法和有参构造呗,比如说我们在这咱们直接来给它设置一个有参构造,OK啊,行,那我们在创建它的对象的时候,咱们是不是就可以直接来为这个目标对象进行赋值了,或者说咱们在这直接把他的名字给改了,大家注意,这东西它就叫什么,就叫做target,这就是咱们的目标对象。
04:36
OK吧,好,然后来生成一个有参构造,然后下面呢,我们再来看,大家说下面我们要干什么。对吧,然后我们要保证他们两个执行的结果是一样的,那换句话来说,那不就是目标对象他怎么实现的过程,我的代理对象也怎么实现吗?对不对,那所以说咱们在这是不是应该直接来调用我们的什么呢?叫做他给的目标对象实现功能的过程,大家注意这样就可以了。
05:05
然后这个时候我们是不是就可以保证来,咱们把它的返回值获取到,然后我们在这儿,咱们再把。这个轨道的返回,大家说你看咱们写这是什么意思,大家想一下,我每一次都要通过代理对象去间接的访问目标对象的功能,大家看你看我在这儿是不是就访问,直接访问了目标对象实现功能的过程。OK吧,好,那既然我们现在可以通过这一句话来控制目标对象功能的实现,那我们是不是也可以在这个功能实现之前给他加入一些额外的操作,比如说咱们在这来写个叫做日志,然后咱们的方法,然后是ad方法,然后我们当前的参数,然后在这咱们加上一个A,然后再加上一个逗号。然后再把我们当前咱们的勾也给加上,OK,大家看熟悉不熟悉熟悉吧,然后在这个地方我们怎么做,咱们是不是直接把这个结果给输出,然后来加上咱们这个result就可以,这大家能看懂吧,那所以我们每一次通过代理对象,然后来间接的去访问咱们的目标对象的时候,我们是不是就可以干什么,把我们当前的日志功能对吧,和我们当前的核心业务代码给它分开。
06:23
对吧,然后我们就可以在不改变咱们的目标对象中代码的这个前提下,然后去给他加入一些额外的操作,进行一个功能的增强,那这个时候大家说我们还需要把咱们的核心业务代码跟非核心业务代码混在一块去写吗?不需要啊,这些东西咱们就都可以把它给干掉了啊,大家注意。对吧,为什么?因为我们现在咱们是不是在另外一个代理类里面来控制了目标类中咱们各个方法的执行,那我们就可以在这个方法执行前后去给他加入一些额外的操作了,OK吧,这个大家注意,那下面呢,咱们该怎么写一样的操作,大家看这个时候咱们的日志代码跟咱们的核心业务代码就分开了,啊好,这是sub b sub b,这也是subb OK,再复制,然后这个应该是乘法,叫ull,然后这个也是ul,然后这个大家注意也是UK。
07:25
行,然后还有最后呢,咱们的这一个除法运算,然后咱们在这呢,把这个方法名给改一下就可以啊。行,那咱们的静态代理类咱们就创建完了,大家一定要看好什么是代理模式,也就是说我们现在呢,咱们要通过一个代理对象去访问咱们的目标对象,然后呢,每一次咱们去访问他的时候,都通过代理对象,然后间接的去访问他,那大家看这不是咱们目标对象实现功能的过程吗?那我是不是就可以在它实现功能前后对吧?然后来加入一些额外的操作,然后这个时候我们是不是就可以把咱们的核心业务代码和非核心业务代码分开,然后我们当前的目标对象你就专门来实现核心功能,而在我们的代理对象里面,咱们把额外的一些功能给它加上来,进行一个代码的增强就可以。
08:17
好,下面呢,咱们就可以来测试一下了呀,比如说咱们在这,然后来创建一个类,然后叫做com.at的硅谷,然后点spring,好,或者说就不叫spring,咱们就叫做点proxy proxy,然后点叫做proxy test OK,行,然后我们把几unit方法给它创建出来,然后这个咱们来测试的就是咱们的代理模式,好下面大家来看怎么写呀。那我现在我能直接创建calculator I PL吗?不行,为啥?因为咱们说代理模式里面你一定不能直接通过目标对象来访问,咱们一定是通过我们的代理对象来进行访问的,对吧?所以说在这儿首先咱们需要创建一个calculator static proxy对象,OK,然后等于另一个calculator static proxy,然后我们现在咱们因为咱们有一个有参构造,我们要通过有参构造来为当前咱们的目标对象进行扶持,所以说在这咱们直接弄一个calculator m PL就可以,下面大家再来看proy,然后点ADD看啊一,然后逗号二。
09:32
好,下面咱们直接来调用这个方法,大家看啊。这是咱们的目标对象,目标对象里面咱们有没有添加任何关于日志的代码,没有,但是我们现在咱们来执行来实现我们当前的加法运算的时候,大家来看一下。然后这个里面是不是既有我们当前咱们方法内部,方法内部是不是就是咱们的核心业务代码,然后是不是还有我们当前咱们所添加的日志功能,对不对?好,那我们现在咱们要实现的功能就已经完成了。
10:03
在不改变咱们源代码的基础上来进行一个功能的增强,然后把咱们当前的这个日志功能是不是动态的去添啊,这个现在还不能叫做动态啊,把这个日志功能添加到了咱们的目标对象实现功能的过程中,OK吧,行啊。好,这个是咱们的静态代理,但是大家也要知道,咱们当前这个静态代理啊,咱们的代理模式,它能够控制的这个位置,它不仅仅是我们当前方法执行之前,还有方法执行之后,其实我们还有一些位置,就比如说我们出现异常的时候,咱们要加入什么额外操作,或者说我们在finally里面,然后加入要加入一些额外的什么操作,咱们都可以,这个通过我们的代理模式来实现,OK吧,就比如说。我们现在呢,咱们把这些代码给它加上一个catch啊,加上一个try catch finally。然后呢,大家想这是不是应该就是我们的目标对象方法执行之前要执行的内容,这是我们当前目标对象方法执行之后要执行的内容,那这个地方的话,是不是应该就是有异常的时候要执行的,而这个地方是不是应该就是我们不管有没有异常的最后都要执行的。
11:17
OK吧,所以说我们在通过咱们的代理模式来进行功能增强的时候,我们不仅仅只有目标对象方法执行前后,我们还有catch中,还有finally里面,咱们都是可以加入一些额外的操作的,这个大家要注意,那这个其实对应的就是我们在LP里面,咱们要讲的四种通知,分别叫做前置通知,后置通知,返回通知,还有异常通知,OK吧,那其实咱们说的还有两个位置,但是其实大家想想,我们能够操作的其实也就这四个位置。你说我能不能在目标对象对吧,他一共十行代码,我们在第五行代码后边对吧,然后给他额外添加一行,给他额外添加一个功能行不行不行,大家注意啊,咱们的代理模式,虽然说我们能够在目标对象功能实现的过程中加入一些额外的操作,但是我们也只能在这四个位置去操作,一个是风核心功能执行之前。
12:19
也就是咱们的目标对象。方法执行之前。方法执行之后,还有咱们的catch中还有这个finally里面OK吧,行啊好,那这个呢。咱们等到在讲动态代理的时候,再继续去给大家演示啊,但是大家要知道它有这四个位置。好像这是咱们的静态代理啊。
我来说两句