00:00
各位同学大家好,刚才呢,我们说明了a op中的场景模拟,咱们写了一个计算器的类,包括进行实现,然后在里边呢加上了带日志功能实验类,最终咱们发现了问题,然后咱提出了解决方式,最终提到了一种新的技术叫代理模式,那下面呢,咱们具体说一下什么是代理模式,然后用代理模式把我们的核心代码和日功能进行分离,比如咱们通俗说的解操作。那下面看一下什么是代理模式,首先我们做一个说明,代理呢是一种设计模式,它的作用是什么呢?大家可以这么理解,我们提供一个代理类,让咱们调用目标方法的时候,不是直接调用,而是通过代理类间接调用,这个过程就叫做代理模式。那具体怎么理解,大家看我这张图里面画的,我这里边有两个图,第一个图没有使用代理模式,咱怎么做,咱直接调方法,比如我现在我想做一个加的操作,直接调A的方法,想做减操作,想做乘,想做除,那就直接调理方法,这是我们普通方式,但是有了代理模式之后,咱们怎么来做,大家看这过程啊,我们调的时候并不是直接调你的具体方法,调什么,调你的代理对象,通过代理对象或者代理类去间接调用咱们的目标方法,最终得到。
01:32
和结果,大家看这张图里边啊。咱们调用目标方法,比如说调那个加减乘除这个方法,那怎么做?先去经过你的代理,然后由代理给咱返回,而内部由代理去调用他的目标方法,这个过程就叫代理模式,这是我们提到的,我再说一遍啊,咱们没有代理的时候,那我就是直接去调我们的加减乘除方法,有代理之后咱怎么做,我直接调代理,由代理帮我去调里面的具体目标方法,然后由代理给我们最终返回,这过程就叫代理模式。
02:12
而这个呢,咱们类比来看啊。给大家举几个生活中的例子。我们来做个说明,比如说大家想一下啊,各位都知道这个明星嘛,一般都有一个叫经纪人,而这经纪人是干什么的呢?大家应该能理解啊,经纪人并不是真正那个演出,那个拍戏的那个人,而他负责明星是不是各种这种活动的安排。比如你现在啊,你想找这个明星,那肯定找不到明星的本人,找谁是不找他经纪人,由他经纪人跟明星联系,明星把意见给经纪人反馈,由经纪人把最终的结果告诉你,别人现在想请明星做什么事情,告诉他的经纪人,经纪人跟明星商量,明星把最终的结论告诉他,然后由经纪人给你返回,这过程就叫代理。
03:04
咱生活中有很多类似的例子啊,这叫代理模式,然后各位明确啊,我们用它的目的是什么呢?就是调用目标方法的时候,先调用代理对应方法,减少目标方法的调用和打扰,让咱的核心代码从里边分离出来,就咱们说这个解耦的过程,这就是代理模式的最大作用。然后这里边两个术语,第一个是代理,就是把那个非核心部分给他分离出来,另外有一个目标被代理套用了非核心代码的类或者对象,比如现在啊,我这个。我要调里面的方法,那咱先调代理,然后最终再调里边的具体方法。这是咱们说的一个基本过程。那下面呢,我们通过具体代码给大家演示一下,代理模式呢,有这么两种模式,一个叫静态代理,一个叫动态代理,大家看这词应该能理解,静你可以理解为啊,他把里面部分都是写固定了,而动态它能动态创建出你的代理对象,那咱们先简单写一个静态代理给大家做个演示,那咱看怎么来做,注意我的过程啊,首先我在这里边呢,就是我这里边是不是一个接口,那咱们再创建一个实现类。
04:25
我在里边做一个创建。实现这个计算器这个接口,咱们再建一个实验类,然后计完实验类之后让他做一个代理类,然后代理类之中要怎么做呢?咱刚才提到了啊,因为我代理类最终要调咱到目标方法,所以咱们把就是被代理的目标对象给他要传入进来,我这里写一下啊,就是我们要把被。代理的这个目标的对象。给它要传递过来,那怎么传递呢?咱这么来做,生成它的构造,然后通过构造把它进行传递,那我在里边写一下,我们来一个private加上计算器这个类型,然后生成它这个构造,通过构造把它直接传进来。
05:20
我在里边生成一下它这个构造。然后现在啊,这就是我们的第一部分,把代理的目标对象给它传递进来,然后之后呢,下面在里边我们可以写这个具体过程,我们就以添加为例,在添加中怎么做,比如我现在啊,我要加上我的日志,那咱们来做个实现,这个日志呢,就是我们那个非核心功能,那我写一下,比如说我在之前输出。这个日志啊,包括之后也输出我这个日志。做这个,然后这个输出呢,我就从课件中复制了啊,咱之前写过,比如这是我们之前这个输出。
06:02
这是一个输出,然后里边有一个之后的输出,也就是这个部分。把这个都输出,然后在过程中咱们就是中间部分是咱们的核心的业务,那核心业务怎么做呢?咱们要调用我们的目标对象中的方法,实现咱们的核心的业务,也就是实现我们那个具体的相加操作,那大家看到啊,我的目标对象刚才咱是不是都进来了,那我就直接调用这里边的方法,咱们。做到核心业务的实现,那我来调一下啊,这个A的,比如我现在传入I,还有一个G,最终返回我们的结果,结果就叫a result。所以现在啊,这就是我们用静态代理方式做到一个实现,我再重复一遍啊,它的做法就是咱们再建个实验类所这个代理类,然后在里边呢,把咱的目标对象通过构造给它传进来,在里边我们写它的非核心部分,就是日输出,包括调用目标方法,把它的核心业务进行调用,这就是静态代理。
07:17
这个咱们快速的实现,然后不管你是减还是乘还是除,都是类似的过程,咱以这个相加为例啊,这是我们写到的。然后写完之后呢,大家看啊,这个代码呢,虽然说咱们写完了,针对于我们这个目标对象,确实做到了解偶操作就是这里边,你看核心业务中没有什么干扰代码,咱们把干扰代码都放到咱这个代理类中进行实现,但然它有一些致命的缺,第一个大家看啊,我这代码是不是写固定了,或者说写死了,就拿日来讲,这个日志呢,比如说咱后面在其他的里边也要用到,那咱是不是需要再建个代理类再经行实现,也就是说我这个日志功能呢,其实并没有给它抽取出来,只是在里边,而是在里边依次来写到,然后后面如果再有新闻功能,那还要写这一类进行实现啊,所以这方式它并不好,它里边就是。
08:16
并没有做到一个真正的灵活性。那咱们需要怎么来做呢?所以这里边呢,我们就进一步提出需求,什么需求,我现在啊,先把这个日功能给它统一在代类中进行管理,咱目前其实没有管理,比如说你看我这添加,当我再写一个减,再写一个乘,再写个除的时候,那我日志是不是还要写重复的代码,只是加里面这么写,减乘除都需要这么来做,所以咱们想统一管理,另外我还要实现我别的地方如果再用到这个功能,咱们就不需要再建个代理类,那怎么做呢?这个时候就需要用到一个技术叫动态代理,通过动态代理就能把这问题最终解决,而我们说的此文里面的A,它的底层用到就是动态代理。
09:08
啊,咱们现在先演示一个竞赛代理。
我来说两句