00:00
好,OK,那下面呢,咱们来看一下咱们的笔记,那咱们该做的事情咱们都已经做完了啊,下面大家来看咱们笔记里面带我们提出来的一些问题。首先第一个问题就是咱们现有的一些代码缺陷啊,针对在日志功能的实现类,我们发现了有如有如下缺陷,首先第一个对核心业务功能呢,有干了,因为咱们是把非核心业务代码跟咱们的核心业务代码是不是放到一块儿了,所以说导致程序员在开发核心业务功能的时候分散的精力,那我们是不是你看咱们现在实现的功能还简单,如果我们以后咱们实现的功能非常的复杂,对吧?我们既要来考虑我们的核心业务代码该怎么写,我们还要来考虑,哎,我什么时候要加日志,我的日志该怎么去写,对不对?所以说大家注意,这就是我们的核心业务代码和非核心业务代码它混在一块所造成的一个问题,OK吧,好,还有呢,就是什么?大家来看,附加功能分散在各个业务功能方法中,它不利于统一维护,大家说我们加入的这些日志功能一样不一样,我们在加减乘除这四个方法里面加。
01:11
的日志功能是一模一样的,我们都是在咱们的核心功能执行之前,然后来记录方法名,还有它的参数,在核心功能执行之后来记录方法名,以及它所输出的一个结果,大家说对不对,对吧?好,然后咱们明明看到这些代码它都是一样的,但是咱们能把它给抽取出来,然后进行封装吗?大家想一下,你能把它给抽象出来吗?不能对吧?好,然后以我们目前所学习的技术,咱们是完成不了的,那这个时候大家想,如果我现在我的日志信息要进行维护,比如说咱们写的这个日志的格式不标准,我们要将所有的日志格式统一化,对不对,那这个时候大家想一下,那我们既然你抽取不了,那所以我们是不是就要就要在我们每一个实现日志功能的地方全部都进行修改,对不对,对吧?好,这个大家注意啊,好,所以说这个问题就是说我们的日志功能代码它是一样的,然后呢,但是我们抽取不出来,咱们抽象不了,那所以说这个时候我们就不能统一的去维护它,能听懂吧,这样的啊好,下面呢,咱们再来看,那咱们要解决的思路,其实很简单,把它俩分开。
02:24
也就是我们当前咱们的实现类里面,我只实现核心功能的,我只有核心功能的代码,也就只有加减乘除的代码,而我把日志功能把它给抽取出来,这个大家一定要注意,所以说咱们的核心就是什么解耦,我们需要把附加功能从业务功能代码中给它抽取出来,抽取出来之后咱们再把它给套到我们当前咱们的加减乘除上,大家注意,这个时候大家想一下,首先这两个问题是不是都解决了。咱们当前的核心业务功能和非核心业务的功能就分开了,然后还有就是我们当前大家来看一下,在这个地方,那咱们能把它抽出来,那咱们是不是就能够统一的进行,就可以统一的进行维护,对不对,对吧?而且我们在修改非核心业务代码的时候,对你的核心业务代码有影响吗?没有,因为我们是抽取出来,再把它给套到我们当前的核心功能上的,对不对,这样的啊好,那咱们的困难是什么呢?
03:24
跟大家也说过了,对吧?解决问题的困难是要抽取,是要抽取的代码在方法的内部,然后靠以前咱们把子类中的重复代码抽取到父类的方式,没办法解决,或者说我们把一段代码把它给咱们把这个日志实现日志功能代码,你把它给抽取到一个方法中,封装到一个方法中,它也没有办法解决,为什么再跟大家说一遍啊,因为咱们的面向对象,它是纵向继承机制,你只能把一段连续执行的代码来进行封装,你能不能说,哎,我把我们当前咱们这些代码,我这抽一行,那抽一行来进行封装行不行?不行,大家想你调用一个方法是什么意思,那不就是把咱们当前所调用的这个方法中所有的内容。
04:14
放到我们当前调用的这个位置来执行嘛,对不对。是不是啊,对吧,所以说大家看好了啊,我们现在以我们学习的面向对象的方式,咱们是实现不了的,OK吧,那所以咱们就需要来引入新的技术,什么新的技术,比如说咱们的这个设计模式中的什么呀,代理模式,来咱们继续往下看啊,大家注意。然后我们可以通过代理模式来解决这个问题,那代理模式是什么呢?大家看好它的概念,然后23种设计模式中的一种,属于结构型模式,然后它的作用是干什么?看好这是代理模式的一个概念啊,大家一定要看好了,你一定要知道它是什么,咱们才可以去学习这个东西啊,是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过咱们的代理类间接的去调用我们的目标方法。
05:14
好,然后让不属于目标方法核心逻辑的代码从目标方法中剥离出来,那你剥离到哪呢?大家注意,是剥离到了我们的代理类中。OK吧,好,然后其实咱们完成的效果就是一个解耦的效果,然后咱们的调用目标方法时,先调用代理对象的方法,来减少对目标方法的调用和打扰,同时让附加功能能够集中在一起,也有利于统一维护。什么意思?大家看啊,比如说我们现在呢,我们是要直接去来调用我们的目标方法的,这就是咱们的目标方法对吧?但是我们原来咱们都是直接调用目标方法来实现功能的,那所以说我们是不是那你要实现的所有的功能都要写在目标方法对不对,对吧?但是我们现在咱们有了代理模式之后,大家来看啊,然后我们现在是要来创建我们当前目标对象,它所对应的代理类。
06:17
然后我们每一次去访问咱们的目标对象的时候,都通过谁来访问,通过咱们的代理对象来进行访问,我们就不再直接去访问目标对象了,知道吧,我们通过谁来访问呀,通过代理对象来进行来对它进行访问,那因为我们现在咱们找的代理对象他是干什么的,大家注意,他是间接来访问咱们的目标对象中的功能的,所以说我们的代理对象,然后他跟目标对象实现的功能一样。那这个时候咱们怎么来表示它实现功能一样的,大家看好啊,其实很简单,你的代理对象啊,大家注意,然后咱们直接在去实现目标对象功能的时候,直接在代理对象中来调用目标对象实现功能的方法就行了,比如说我们当前代理对象里面,咱们的目标对象是谁?Calculator I PL里面是不是有加减乘除的方法,对不对?大家看好啊,这是目标对象里面加的方法,然后呢,我们现在咱们要为我们的什么呢?目标对象来创建咱们的代理对象。
07:22
OK吧,好,然后这个时候我们有了目标对象,有了代理对象之后,那也就是说我们要用代理对象来代替咱们的目标对象实现这个功能,所以说这里面也有谁呀,Ad方法。然后呢,这里面的addd是怎么来实现功能的,也就是说我们再一次咱们去访问我们当前计算器的这个加法运算的时候,怎么访问,我们还会不会直接来访问这个计算器里面的addd了,不会,我们是来访问的咱们的代理对象里面的ADDDD,通过代理对象间接去访问它,怎么间接去访问看好啊很简单,在这里面在他的ADDDD方法里面,咱们直接来调用目标对象的ADDDD方法,那大家说这个时候咱们是不是就能够保证一个,保证一个前提条件,什么条件,就是说我不管我是用目标对象直接实现,还是用代理对象来实现,我最终我实现的结果是不变的,我不可能说我现在我的调用目标对象的加法运现结果呢,你用代理给我实现的时候,实现的是减法运算,可能不可能不可能,所以说咱们这样去写,你在代理对象里面啊,然后让他的AB方法直接去调用目。
08:35
标对象的,那大家说这个时候啊。我们是不是就可以通过代理对象来控制目标对象方法的执行了,因为咱们在这有一个什么什么叉叉叉,然后点ad,你在这个ADDDD中来调用的是咱们的目标对象的ADD方法,那咱们就说代理对象就可以控制目标对象方法的执行了,对不对?那我是不是就可以在这个方法执行之前给它加入一个日志功能,把咱们的方法名和参数输出,然后在这个方法执行之后加入一个日志功能,对不对?好,然后将咱们的方法名和结果输出,大家说是不是?
09:17
对吧,这个时候大家想我们要实现的最终的结果咱们实现了,而且我们也在不改变目标对象代码的基础上,然后是不是去额外的给他添加了一些日志的操作。能看懂吧,而且我们是不是也可以把咱们的日志功能从咱们的目标对象中给它剥离出来,剥离到咱们的代理对象中,那我们以后咱们再去对吧,咱们再去维护日志功能的时候,还跟代,还跟目标对象有关系吗?没有关系,我们只需要在代理对象中去维护它就行。OK吧?这个大家注意啊,所以说再说一遍,什么叫做代理模式。很简单,就是说我们对目标对象,然后呢,去创建一个它所对应的代理类代理对象,每一次咱们在访问目标对象的时候,咱们现在有了代理模式之后,还会直接去访问目标对象吗?不会,我们是通过代理对象,然后间接的去访问咱们的目标对象,然后在代理对象中,他会直接去调用目标对象实现功能的过程,然后那这个时候我们就可以在代理对象中来控制目标对象方法的执行,咱们就可以在目标对象方法执行的前后,或者说执行的过程中去加入一些额外的代码,也就是额外的操作,其实就是一个功能增强,就是在不改变目标对象方法的过方法的基础上,对吧,然后来给他来通过代理对象给他添加一些额外的操作。
10:50
就比如说我们刚才说的对吧,我们的代理对象中直接去调用目标对象实现功能的过程,也就是来调用目标对象的addd方法,那我们是不是就可以在这个ad方法之前,然后来记录我们当前调用的方法以及参数,在我们当前这个目标对象方法执行之后,然后来记录我们当前的方法名以及结果,大家想想是不是?
11:14
OK吧,好,大家注意,这是咱们的代理模式,一定要自己会描述啊,什么是代理模式对吧?就是为目标对象创建一个代理对象,然后我们每一次去访问目标对象都通过谁来访问代理对象来访问,对吧?然后在代理对象里面,他控制了目标对象执行实现功能的过程,然后我们就可以在代理对象,在代理对象中,然后这个在目标实现功能的过程中去加入一些额外的操作,那这个时候大家说咱们的核心业务代码和非核心业务代码就分开了,你的核心业务代码在哪呢?目标对象中你的非核心业务代码咱们是把它给抽到哪呢?抽到了我们的代理对象中。对不对,他这个时候就可以在不改变目标对象代码的基础上来进行一个功能的增强,来进行一个额外的来添加一个额外的操作,OK吧,这样的啊。
12:09
行。然后下面大家再来看看生活中的代理对吧?广告商,然后找大明星拍广告,然后需要去找谁呀?找经纪人,然后呢,合作伙伴,找大老板谈合作,然后要约见,要约见面时间对吧?然后需要经过谁呀?需要经过秘书对吧?然后房产中介呢,他是咱们买卖双方的代理。对不对,大家注意,这就是咱们生活中的一些代理嘛,对不对,然后我们要保证我们最终实现的功能不变,然后呢,我们需不需要这个时候需不需要咱们的目标对象去实现功能,不需要,咱们只要去找到这个代理对象就可以来实现这个功能,然后并且来添加一些额外的操作,OK吧,好啊,行,下面呢,有相关的一些术语,比如说咱们的代理对象,还有咱们的目标对象代理就是我们通过目标对象来创建的代理对象,知道吧,目标其实就是我们当前这个需要加入,需要进行功能增强,需要加入一些额外操作的一个对象,就比如说大家看好啊,这个代理咱们现在还没有,然后,但是咱们现在呢,以我们所模拟的这个场景来说,Calculator I PL,大家注意,它就是一个什么叫做目标。
13:27
能听懂吧,Calculator in PL就是一个目标,为什么?因为这里面有日志功能,我们现在咱们的核心是什么?叫做加减乘除,那我们是不是就需要干嘛呀,把咱们的非核心业务代码,也就是咱们的日志功能要把它给抽出来,抽到哪,抽到我们的代理对象,然后在代理对象里面再实在通在代理对象去控制目标对象实现功能的时候,然后给他把咱们的代理,把咱们的日志功能添加到代理对象中,然后呢,再不改变咱们目标对象代码的基础上,给他添加一个额外的操作,OK吧,这样的啊,行,那下面呢,咱们就把代理模式给大家来写一下呗,当然这个代理呢,分为静态代理和动态代理。
14:13
啊,咱们先写静态代理,静态代理呢,大家注意,他就是一对一的,我们的一个目标对象对应的就是一个代理对象,OK吧,好,咱们先把这个静态代理来实现一下啊。
我来说两句