00:00
行,那到目前为止呢,关于这个接口呢,咱们其实主要呢提了两个事情,第一个呢,就是这个接口呢,我们到底该怎么去用,就涉及到它内部这个结构的一个声明,我们这儿呢,就提到了它在JDK7和之前,咱们呢,只能够去定义叫全局常量,然后定义这个抽象方法,然后呢,具体使用的话呢,我们就需要去提供它具体的实现类,实现类的话呢,我们说还可以去多实现。哎,多实现,那这是我们说的这个,包括这个接口跟接口之间呢,是这种多技能的关系啊,这个大家都得清楚,然后第二个内容呢,就是咱们呢,来体会一下,在PPT当中,一开始呢,说提到了说这个接口呢,说定义了一种规范,我们怎么去理解这种规范,理解这种标准,那通过呢,咱们这两个例子,诶大家呢,先有这样的一个概念啊,这样的一个意识就可以了,这个不着急,大家说马上我必须要理解说这个接口为什么叫规范了,这个不着急,大家呢,就是先还是要落地会写代码,诶先还是会落地去写代码,就我上课讲课的话呢,呃,这个经常会说啊,因为这个,所以这个有时候会强调的比较重一些,这个呢,就是你要能够理解呢,那就更好了,那如果说一开始理解起来有点困难呢,那还是要回归到代码层面啊,就跟说这个教游泳一样,我现在就好比是游泳的一个教练,那我讲的可能会细致一点,告诉你这个手是什么姿势的,多少度角,呃,怎么这个这个这个弯怎么换气,说的很细致,那对于到你这块呢来讲。
01:24
啊,要时间很充裕了,那肯定是一点点把每个细节都整的很透,那如果说时间又没有这么充裕,那还是以这个实用性为主,就是能跳下去能游是吧,可能这个姿势呢,稍微有点不太标准,但是呢,淹姆死对吧,这个是更实用一些,就还是呢,下来以后还是多写代码,代码翻来覆去的去写,写着写着,其实你这个东西就熟了,现在跟见到个人一样,哎,我我我我我可能教你的是说这个人呢,你得叫叔叔,为什么叫叔叔呢?呃,他跟你爸呢是哥们儿啊,从哪一年开始是吧,就认识了,一直呢关系特别好,年龄差不多啊就成兄弟了,然后呢,你得叫他呢,叫叫叔叔,讲的很详细是吧,到你这儿了,然后你就别也这样说,因为呢,我爸呢,跟他什么时候就认识了是吧,你就不用整什么气事了,你就直接知道这叫叔叔,就这次见叫叔是吧,下次还是叔,你老是见这就记住了,你今天见完以后呢,光推了一堆推论,然后知道叫书了,然后两年不见,见了以后呢,照样不认识是吧,就是代码多写,写着写着你就熟了。
02:24
啊,熟了以后呢,再回来你看这个内容啊,你就会很清楚,还是以实用为主啊行,那么关于这个接口这块呢,咱们再来谈谈这个具体的应用,咱们讲这个抽象类的时候呢,提到过这个设计模式叫做模板方法的设计模式,那么在接口这块呢,咱们也可以呢,谈一谈具体的这个应用有两种设计模式,还是那意思,这个模板方法这儿呢,我们要讲的代理模式,以及呢,还有呢,叫这个工厂的设计模式,工厂这块其实有两个设计模式,就是这几个设计模式呢,大家都整体上来讲是作为一个这个这个了解性的,就是你主要关注呢,就是哦,这个代码里边用到接口了,这个里边呢用到抽象类了,你看下这个接口抽象类的这个特点是怎么在这个代码中体现的就可以了,不用呢现在去深究,说这个代理模式到底是要解决什么样的问题,这个呢不要去深究,这个大家呢建的代码还比较少,那你见的更多以后呢,你就理解了。
03:24
后边呢,我们像这些代理模式啊,或者其他的模板方法啊,在后续的开发中呢,我们都会见到,当时见到的时候呢,也是先基于咱们先去用代码,用着用着,然后突然告诉你说这其实就是某个设计模式,你看用还真是这是最深刻的啊,而不是你现在去研究这个理论说啊,这个叫代理模式,这个叫模板方法,怎么调的,怎么特点的,呃,研究这个呢,其实回头就忘了,还是先会写代码更务实一些啊,那么这呢,大家就当成是一个应用,应用的一个练习题,看一看这个接口怎么用的就可以了啊,但是咱们讲课的时候呢,顺便我说一说什什么叫代理模式了。
04:02
那首先说代理模式呢,是Java开发当中这个使用较多的一种设计模式了,说代理呢,设计就是为了其他对象提供一种代理,代理控制,呃,代理以控制对这个对象的一个访问,呃,可能稍微有点抽象哈,举个例子,下面呢,我画了一个简图,这个object的话呢,这个写成object啊,这其实是一个接口,就跟咱们说的那个object是两回事,这个接口的话呢,被下边这两个类呢实现了。一个呢叫object input呢就是implements啊,就是实现类,把这个呢,我们称作叫被代理类,嗯,对被代类,哎背带类,然后这个呢叫per,这个这叫代理类。说这这这有啥区别,怎么区分呢?或者我再形象点去说,比如说这个呢,大家是想,比如说你毕业以后呢,呃,不想在附近住了,你想租房子,租房子这个事儿,这个定义成一个接口了,那么实际上呢,是你自己想去找房子的,是你想去找房子,你呢就相当于是被债类,但是呢,你又不想自己去找,可能工作呢很忙,然后呢,996也没时间去找,或者说呢,你自己也对周围不熟悉,怎么办呢?找了个中介,哎,我爱我家或者链家或者等等这样一个中介,这中介呢,就好比是代理类,就是本来呢是你想做事儿,结果呢,你自己不想自己亲自去,然后呢,你通过这个中介,通过这个代理类帮你去做这个事儿,那就这个意思,那么这里呢,就要求这个中介或者叫代理类和被带类,你自己都得去实现这个接口,找房子这个接口,然后呢,只是这个接口当中的这个抽奖方法呢,大家重写的时候,或者要实现的时候呢,有所区别了。
05:39
那这里边儿呢,就他呢是帮你去做这个事儿,帮你去找,找了以后呢,你自己亲自去看,那里边呢,还得调一下你同样的这个方法,这呢我们就称作叫一种代理。啊就是就就跟他这个字一样,就是这种代理的这种模式,或者呢,又好比是大家这个这个你看这个现在这些明星,基本上每个明星呢,都有叫经纪人对吧,那么这个明星也好,经纪人也好,他们呢,可能都得需要一些相关的一些功能,那么有些功能呢,这个我们都定义成抽象啊,放在一个接口当中,然后这个明星就相当于是被代理类,这个他的经纪人呢,就相当于是代理类他们都去实现这个接口啊,然后呢,这个有一些方法的话呢,这个被带类就得重写了,这个呢他去重写,那相当于呢,这个本身呢,是这个明星要做这些事儿呢,都相当于通过这个代理类这个中这个这个经纪人帮他呢去完成。
06:32
啊,就是经纪人在做这个过程当中涉及到一些操作了,我们再去调你这个背带类,诶这样的一种模式啊行,大体上呢,有一个这样印象就可以了,下边呢,我们写一个例子,让大家去体会一下这个代理模式,这呢我就直接在这来写了,行,那这块呢,我写成一个叫network啊,Network的一个测试吧。
07:00
大家呢,就把这个看成是我们叫接口的一个应用就可以了,不要去深究了先啊代理模式就刚才呢,我讲的这个细节呢,你要能听得大概有一个印象诶就足够了,不用去深究了的,这里的话呢,我们刚才呢图当中提到一个object,这是一个接口了,我这呢也声明一个接口,这个接口呢,我就叫做network,就是网络,嗯,那只要呢能连上这个网的话呢,我们呢就都会具有一个方法,这个我们叫一个B叫浏览的方法。Browse,诶浏览这样的一个功能,浏览器browse是吧,这是浏览的功能,那接下来的话呢,我们要想能够这个去访问网络,咱们需要用到这个服务器,这呢我就定义的两个服务器,第一个呢叫做一个,嗯,直接就是一个server了。看让这个server呢,我们去咱们的这个network。
08:05
行,我让他呢去实现这个network这个接口,那实现完以后呢,我们这儿呢,就是写一个重写的这个方法。那这个呢,我们要真实的。这个服务器来访问网络。行,这呢我就写了这样的一个方法,这呢就相当于我们这个叫被代理类。这是一个背带类,然后下边呢,我们去提供一个代理类。代理类,然后class这个代理这个单词呢叫process,那我写一个叫process server,它呢也去employs,咱们的叫network。这么着这呢叫代理类,那自然而然的它也需要去实现我们这个方法啊,这是他这个情况啊,那么这个他实现这个方法的话呢,这叫代理类了,就是好比是你这个叫代理服务器一样,那他呢还多于有其他的方法,比如说呢,他在这个BS帮我们代理去访问网络的时候呢,他得先做一些校验的操作,我这呢就称作叫check,诶我们这写成呢叫联网之前的一些检查工作,好那么在这个BS这里边呢,我们这个要干什么事呢?这个一方面呢,我们回头呢想调的是这个BS,但调之前呢,我们得先去做一个校验,那校验以后咱们呢,就是可以去这个这个去联网,但是真正要联网呢,不是你能连,只是呢你做一个代理去操作,那真正连的是谁呢?我们还得在这里边呢,声明一个变量,这个变量我就称作一个,嗯,叫一个private也行啊,这个。
09:56
Private类型就叫做network,哎,我这呢就叫个好,然后呢,我们去提供当前代理类的一个构造期。
10:10
在这里边我们去对我们这个属性呢,进行一个初始化,哎,这次点work等于work就相当于对我们这个属性进行初始化了,然后呢,这个我们通过这个带类的对象呢,我去调这个B方法,相当于想去联网了,那你先调研一下环境,那真实啊真实这个操作呢,其实是我们还是用的这个work,让这个work呢去做了一个B的一个操作。诶,大家可能还会稍微有点抽象啊,这个呢,你不用去深究,你主要就是看这个代码,这个来回,这个逻辑能够捋清楚就可以了,那你要想这个代码能够捋的特别清楚,那就就得懂这个设计模式了啊,你只要能看懂这个逻辑就行,下边呢,我们做这个测试测试测试这块我们呢,怎么办呢?嗯,按说呢,我这时候呢,需要去new一个叫代理的一个对象了,叫proceed的一个server,但是我们要去new它的话呢,还需要去填充一个这个network这样的一个属性,那这个network是谁呢?都是是我们这个带类和带类被带类呢共同实现了个接口,那接口呢,肯定不能够去自己找对象了,那我们拗谁呢?我就给你去拗一个真实的一个这个服务器了。
11:24
哎,你有个它你这呢也可以先暂且就称为叫server,也可以行这个server我呢是不是就可以放进去啊,因为我呢是这个network的一个实现类的对象了,所以我就可以放进,这就多态嘛,那这样的话呢,我们相当于呢,就是这个这个一个屏幕上看幕前了。嗯,相当于呢,就是咱们把这个server呢,赋给了我们这个属性叫network了,就是相当于给这个属性赋值了,行,那这呢,咱们CTRL一生成咱们这个pro的这样啊一个对象,然后咱们通过这个叫process server,咱们去调这个叫browse的方法,从形式上来看呢,咱们是调的代理类对象的一个B方法,就让他呢去联网了。
12:15
但是实际上我们里边呢,这个包含了咱们真实这个服务器的一个访问访问了。这就算是一个代理模式,嗯,这就个代理模式,就是我们呢,需要关心的就是咱们回头呢去提供这个叫被代类,你你看你到底想干什么。啊,你到底想干什么,然后呢,你造完这个被代类这个对象以后呢,你直接就扔到人家提供好一个代类对象里边,你扔进去,然后呢,通过这个代理类对象去调方法,结果你发现,诶,我这个方法呢,也帮给也帮忙给调了,你看我们自己写这个是不是也帮忙给调了。在这个代码层面呢,我们其实没有看到咱们这个server是不是显示的掉这个browse。
13:00
嗯,这不显然没有吧,咱们这个server自己new的这个我我没有直接调查,咱们呢,是不是调的人家这个代理类的这个方法呀,但是你会发现我们new的这个对象里边这个方法体是不是也执行了,哎,就是因为呢,我们代理类对象调这个方法的时候呢,它里边包含了对你这里边这个重启的这个方法的一个调用了,这呢我们就叫做代理,就是按说来讲,是不是应该你直接自己去serve点去browser,但是现在说呢,不用啊,你用他,他去帮你做,他帮你做,为啥他让他帮我做呀,因为他不光做这个事儿,他可能还做点别的事,对他可能还做点别的事,所以说呢,我们把别的这个事儿的这个逻辑呢都写好了,你呢,只把你这个背带类你你重写着就OK了,你核心到底是要干的什么,你就放到这儿,稍微跟那个模板方法感觉有点像一样是吧。就是把这个不确定的部分,你是不是给暴露出去了,行,这个再深入的话呢,大家不用去深究了,就啊,就是只是把它当成一个代码,你看看这个逻辑怎么走的就可以了,那么这个代理模式在咱们开发当中怎么体现它的应用,我这呢简单的写了一下,像这个安全代理屏蔽呢,对真实角色的一个直接访问,就是咱们不让这个真实角色,就是这个被代类对象呢暴露出去,直接呢,你就是通过这个代理类这个对象呢,去调的这个功能啊,这叫安全代理了,还有远程代理,这个后边我们框架里边会提到一个远程方法调用啊这样一个情况,包括叫延迟加载,先加载这个轻量级的一些代理对象啊,这个真正需要加载的真实对象呢,我们看情况,有的时候你要不需要呢,我们就不再去加载啊,就比如说呢,我们去打开一个大的文件,这里边儿呢,这个图片特别大,这个图片的加载呢,其实是比较慢的,还得需要用到这个GPU。
14:51
啊,就像这个GPU,大家知道玩游戏的话呢,这个CPU不不管完全取决它了,你也得看这个GPU啊,图形处理这样,包括这个人工智能深度崛,现在之所以崛起大量的图片需要去计算,就像咱们说从图片当中你去找到一只猫,这时候不完全取决于CPU了,这个GPU呢,在里边起到很大的作用,诶人工智能崛起也依赖于这个硬件的提升,就GPU的一个性能提升啊,那么我们要加载这个图片的话呢,它比较大,怎么办呢?呃,我们先加载一些其他的东西。
15:19
然后呢,你要是需要这个在加载这个图片的时候呢,我再通过代理类帮你去打开。诶,这样的一种方式可能也是有点抽象啊,这个大家呢,先有个这个感觉就行,后边呢,咱们讲到框架的时候呢,会提到这个叫代理模式,呃,只不过到那时候代理呢,咱们更多的是这种叫动态代理。咱们刚才写的呢,是静态代理。什么叫静态代理,就是我这里边。我这里边呢,这是一个被代类,这是个代理类,这个代理类呢,是专门针对于咱们这一组实现这个这个接口的一个代理类了,那你这是你想买,你想这个租房子了,你可能还想是买菜,你买菜的话呢,你现在有个买菜的一个接口,然后呢,你是想买菜的,但是你不想自己去买了,你想找一个这个代理类帮你去买啊,这是不是又是另外一套了,就是每针对一套接口呢,咱们得专门定一个代理类,这呢又是个代理类,像这呢,都是专门针对某一个接口提供的这个代类,这都叫静态代理。
16:18
动态代理呢,就是我们写代码的时候,不显示的把这个代理类写出来,我在代码执行过程当中,动态的让他去生成一个代理类的对象。这就很抽象了,因为咱们还没有提反射,咱们讲到反射的时候就是张SSE高级的这个一个章节叫反射,到那个时候呢,咱们看一看这个怎么去给他造一个动态的代理,到时候呢再提一下这个事儿,所以关于代理模式这块呢,大家不用去深究啊,又说了一遍,你呢只需要看看这里边这个逻辑,哎,捋一捋就OK了,关于代理模式呢,稍微有个印象就行,然后的话呢,我这个课后这这又放了一个代理模式的一个例子,就让大家再来体会一下,CTRLC,我这样就不写了,直接粘过来。
17:05
CTRLDCTRLD,诶这呢就是我说的这个明星和他的经纪人的事儿,这呢说有一个接口叫star,叫明星,这个明星呢,需要去面谈啊,签合同啊,订票啊,唱歌啊,收钱啊这样这样的一些功能,然后的话呢,这是真实的这个明星,那它属于代理类还是被代类啊对被代理类,那被代类就是这个明星呢,他实现了这个大的接口,那他就把这个事儿呢都得整一下。啊,其实有些事呢,发现我这呢,没有距离去写了,没有写的话呢,就是我们可以让这个,哎,让大眼泪可以去做是吧,然后这个唱歌唱歌呢,他得自己唱。诶,然后呢,这个呢叫代理类,你可以理解呢,就是他的这个经纪人。然后让这个带类呢,也去实现这个star这个接口,哎,那么你看我这也是采用这样的一个方式,呃,这是star一个接口的声明,通过扩造器的方式呢,把这个属性呢进行一个初始化,然后下边的话就是涉及到这个面谈呀,签合同啊,订票啊等等等等等这样一些功能,行,然后然后呢,咱们这块去测试,我呢造一个代理类的对象,就这个经纪人,但是造这个经纪人的时候呢,我们得把这个你真实的这明星呢得传进去,传进去以后得到一个SGS,其实我们用的pro,其实你这个不就是一个pro吗。
18:29
就是这个代理类的对象,就是你这个经纪人,这个经纪人帮你把这个事都搞定了,就都是他去做的,形式上来看呢,根本就没有让我们这个real star去做任何事,都是这个带雷雷经纪人去做的事儿,哎,但是呢,呃,像这些功能。像这个这个这这些这些功能,呃,这些功能是不是都都他自己就帮你给你搞定了,但是有些功能他搞不定,比如唱歌这事,代理人代这个经纪人他唱不了,他掉了一个sing,他看着是他是唱歌的,但是实际上他里边呢又掉你了。
19:01
哎,就是相当于是我们不直接呢对外暴露这个叫realar,对外呢只暴露这个代理类的对象,然后代理对象它干什么事需要用到你了,它里边就会自动调你,所以我们这是运行,这呢都是经纪人干,然后到这个呢,他干不了了,它里边包装了对你的一个调用,这呢就叫做代理模式。哎,简单体会一下就OK了。
我来说两句