00:00
下一个代理模式呢?我们称之为动态代理,先来看一下动态代理的这么一个图解。那同学们在学反射的时候,Java反射的时候呢,老师应该提到过动态代理对吧,可能有些老师还把静态代理也讲了,那么动态代理呢,是我们呃开发中还经常用到的一种代理模式,它是什么意思呢?大家看这个图。大家看这个图说我现在有一个对象叫real subject是个真正的对象。那么这个对象呢,因为种种原因,我要去实现对这个对象操作的一种控制。什么控制呢?我并不希望别人直接来调用。而是针对不同的人,我给予不同的调用权限,那说老师你这什么意思,有点听不懂,好,我们先画一个示意图,然后我们再看这个图啊,说有这么一个场景,说有这么一个场景,这个地方呢,是我们的一个类。
01:09
注意听,这是我们的一个类,这个是什么类呢?是被代理的类,或者是说被代理的被代理的对象,那么传统的调用方法是怎么样的呢?各位,传统的调用方法一般是这样子的,就是我们这里直接去实例化我们的。这个类的,呃,就是这传统的药方,这方式我们这调用。啊,第二种方法不不就是这样的吗?很简单,就是六什么什么什么的,然后六一个对象出来,比如说object,六一个object啊等于一个啊这个这个跟哎这写错了啊。这样子VL。对象,然后六了一个类。啊,六类,一个类类对应的实例,然后用object点什么什么什么方法,一般传统是这样写的。
02:06
但是呢,在某些情况我们不不允许这样做,什么情况呢?比如现在有这么一个需求,大家想想怎么做,说现在呢,有一个类。啊,假设现在呢,我们有一个类。这个是被代理的,他有这样几个方法,比如说他有set叉叉叉方法。啊,比如说还有get什么什么。这个叉叉叉的方法,然后呢,还有site,比如说还有一个set score这个方法,现在我有这么一个需求。注意听我有这么一个需求,什么需求呢。我现在有两种人。有两种应用场景,哪两种应用场景呢?第一种。好,假如这个是。A类A类人A类用户吧,A类用户,我们希望A类用户呢,他能够调用我们的这个,它能够实例化我们这个类,比如说这个类我就随便取个名字吧,啊,假如这个类叫做。
03:13
Person。早教person。那么这个A类用户呢,我们希望他只能调用他的set。扣,但是不能掉site其他假如我这写清楚啊,比如set。Name,比如说啊,现在我有这么一个需求,说A类用户呢,实例可以干什么呢?可以调用这个person的site name方法,但是其他的方法不能调用,但是不能调用其他方法。掉。调其他方法。调其他,而我们的B类用户呢,又来了。诶,你们想想有没有这种可能性啊,现在呢,这个B类用户呢,他的需求是这样子的,他干什么呢?哎,他说你这个B类用户呢,可以去调用site这个啊,调用person site score。
04:17
但是和什么呢?和这个get方法。和get什么什么,但是不能调用其他的,好同学们看这个需求很有意思,他的意思就是说你这个A和B类两种用户呢,对我们这个person对象的方法的调用权限是不一样的。假设这么一个应用场景,你想你怎么控制啊?周老师,我有办法,我你不让它调用,我把它做成私有的不就完了吗?是你要把它做成私有的,那它也调不了。是不是你说你这个不能叫,因为你你这个私有的是不针对这个用户种类的呀。你在这个类里面怎么去实现这个权限的控制呀。
05:02
对吧,没有办法,没有办法,那这个时候怎么办呢?各位同学好,收回你的这个小箭头,中间搞了一个所谓的代理,这个哥们就粉墨登场了。什么意思呢?他说我来帮你吧,你们先不要这么干,我中间来帮你做一个什么呢?动态代理。啊,这个叫做代理模式,就出现了,代理模式他干什么呢?他在这里创建一个代理对象,代理对象它用来替代。啊,它用来替代什么呢?替代这个。被调用的对象替代了一个被调用的对象,被调用的这个对象使用反射机制啊,使用反射。他是用反射机制干什么呢?反射机制实现实现实现这个,呃,对他这个操作权限的控制,实现这个什么呢?操作权限的或者调用权限啊,或者调用调用权限的控制。
06:14
诶,这个就是他动态代理的一个核心问题,说我在这儿。创建一个代理对象,由这里帮助我们去完成他的一个调用。但是呢,你不能直接吊他。你要通过代理模式,我针对A用户返回一种代理对象,我针对B用户返回一种代理对象,然后呢,你在这动手,你就。不能在我就实现这个效果了。这种我A类的用户给你返回一个代理对象,这个代理对象呢,能实现你只能调赛的内容,其他调不了,我给你B用户返回一个代理对象,你只能调用set,其他你调用不了,就有这么厉害。啊,动态代理呢,他这个很有意思啊,这种机制,将来同学们遇到这种类似的这种需求呢,同学们就可以去玩。
07:07
同学们,你们以前可能学过这个代理,但是可能老师并没有说这个代理它的价值在什么地方,对吧?啊,所以说这个呢,就是我们代理的一个。原因啊,动态代理的原因,那么同学们原理说完了,再来看这个怎么实现的,就很清晰了,就很清晰了,所以说我们学东西呢,就是说你首先要搞清楚,为什么大家看这里,将来我怎么实现呢。我怎么实现呢?我这样实现的,这是我的UR。就是刚才大家说的A用户或者是B用户。OK,你呢,不要去直接实地化,他不要这么干,我也不让你这么干了,那怎么办呢?我搞一个这个subject的一个接口。我让这个代理实现这个接口,我让这个真正被调用对象也实现这个接口,然后干什么呢?由这个代理加上这个invocation handler共同构成的一个动态代理。
08:06
他帮我们返回代理对象,然后真正调用呢,在这里用这个反射的invocation来判断你到底应该调用他的哪些方法。哎,也就是这两者啊,这是proxy proxy加invocation handle共同构成代理。明白啊,以前老师应该也说过这个事情吧?好,那针对这个图呢,我说几句话啊,动态代理是指运行时动态的创建代理对象。也就是谁的代理对象呢?是他的代理对象,因为我真正要用的其实是他。并将访问调用转发到指定的对象。就在这里,Invocation我转发调用。那当然,既然我这有个缓冲,我就可以在这里用反射来实现,你哪些能调,哪些不能掉。
09:00
好,那我说总几句啊,PCCY和invocation handle组合充当了代理的角色,那么real subject就这个是一个实际对象,它实现接口就是这个时我们真正要调用的。那么在使用时我们不希望直接访问real subject的对象,比如我们对这个对象的访问是有控制的,比如说有些方法可调,有些方法不能调,那么我们使用动态代理呢?在程序通过动态的创建re subject完成动态代理可以根据需要创建多种组合。比如说这种组合,那种组合,就这有A类,有B类,没准你还有C类用户,还有D类用户不知道。好的,那么呃,这个proc呢,也会实现subject接口,因为proc加invocation才可以完成对动态的,对这个真对象,对最后啊,但通过这个project调用real subject方法是否成功。他能不能调成功,我要在哪里控制呢?在这个地方大家看你能不能调成功,我的动态动态权限控制在invocation里面,同学们都知道,我们在写反思的时候呢,会去实现一个抽象方法。
10:10
啊,会实现一个方法,重写一个方法,里面就有evovo这个方法,那么我们怎么理解呢?可以这样理解这样一句话,所谓动态代理就是创建。啊,就是什么呢?你可以这样理解,就是创建一个代理对象,对象替代。啊,替代这个真正替代这个被调用的啊,这个真实对象。真实,真实对象实现实用什么呢?实用反射,使用反射实现什么呢?实现控制。好了,原理我就讲完了,原理我就讲完了,那下面呢,自然到了一个啊,这个这个应用案例的一个讲解啊,那么这样子哈,嗯,原理讲完过后呢,我们再说一下保护代理,其实这个代理模式,刚才讲的这个动态代理呢,已然包含了保护代理的概念,也就说比有些面试官呢,他可能会这样说,他这样说,诶你学SC的,或者你学Java的,那你说动态代理。
11:20
呃,它是怎么实现的机制,你就把刚才那个图拿出来。简单的描述一下,然后呢,别人可能会会有些面试官说,诶,那保护代理是怎么回事呢?你就跟他说保护代理是什么呢?就是从刚才讲这个动态代理来看,你没看出来,大家看出动态代理其实就体现出保护代理了,因保护代理呢,他没有一个专业的一种模式,它实际上是在代理模式里面,在一个具体的一个判断里面进行这个控制的,比如说及代理时,被代理对象的哪些方法可用,哪些方法不能用呢?我们在invocation handle里面进行控制,即。这个地方。待会大家马上会看到代码啊,我们不是简简单单的讲一个概念,我们会实际写代码,让大家体验一下这个东西的好,这就是坚持动态代理。
12:10
里面如果你加了相应的判断,就实现了保护代理效果,那同学们包这个动态代理和保护代理的概念和原理呢,我就讲完了。
我来说两句