00:00
接下来的话呢,我们说一下这个关于这个抽象的一些具体的应用了,这里呢,就提到了一个这个设计模式,这个设计模式呢,叫做模板方法的设计模式,这个设计模式对大家对大家的要求呢,不会像单立那么高了,说单立呢,大家必须呢,一方面你得懂什么是单立,相当于为什么要造单例,就是为了保证整个软件系统当中啊,就只有一个实例了,然后第二呢,就是大家得会会去手写单例,懒汉式和汉式都要会手写,这是单例对大大家的要求,那这里呢,模板方法的设计模式对大家的要求呢比较低,大家呢,只需要知道呢,我们在这里边呢,用到了这个抽象了,就当成是我们的课后一道题就行,只不过呢,这道题比较特别呢,它恰好是某一种设计模式了,所以呢在这给大家讲了讲,至于说这个设计模式要解决什么样的问题,大家呢也听一听,我这呢说一下,呃,听完以后呢,你肯定有不理解的,或者说很难体会的很清楚的,这个也没有关系,后边呢等见到相关的一些。
01:00
这个比如我们看到一些源码,或者我们后边讲,比如web讲框架的时候呢,用到一些结构的时候,你就知道,哦,原来这呢是一个模板方法的设计模式就可以了,暂时呢,咱们讲的东西还比较少,大家呢不需要对他呢,对他呢体会的太深,行,那我呢先说一下什么叫模板方法的设计模式,他想解决的是什么问题,那其实从他这个名字上来看呢,已经暴露出来他想做的事儿了,模板方法的设计模式,他想造的可以说是个方法,一个功能,这个功能呢体现的就是个模板,模板这个词大家应该不陌生,高考的时候呢,可能还好,这个老师不会让你写特特别多的模板,但是你要考研的时候呢。尤其是英语,尤其是英语的作文,是不是就有好多的这个模板了,说遇到这样呢,你就开头啊,这样啊,这个这个写一些这个套路性的东西,包括你去背一些这个一些谚语,什么条条大路同罗马呀等等是吧,All road to Rome是吧,啊类似的就背好多这个模板,然后到时候呢,就咔咔,不管是什么什么这个文你就直接往上怼就行啊,这叫模板,就是有个套路。嗯,其实一说到这个英语作文呢,我就比较伤心了,因为我考研的时候呢,就扯到这个英语作文上,对,我考研的时候呢,这个我考的是复旦大学,其实是啊,对,我考复旦大学的金融工程就分也非常高,当然其实我考的分也非常高,嗯,他们的管理线是340,我呃,就是这个管理学科的线340,这个专业的线是360,我考了377啊,就比较高了,我数学基本上是满分哈,数一啊,然后英呃政治也70多分专。
02:46
这课呢,他们就考六道题,专业课呢,那那我都把这个北大的这个研究生的微观经济学课都看了,考的分也不低,就设到英语上了,英语呢时间没安排好,考作文就是写作文的时候呢,就剩15分钟了,前面还没涂卡,然后那老师一说说这个还有15分钟哇,这时候完了手就开始抖了,对特别紧张那会儿,然后就赶紧肯定得先涂前面的卡呢,万一要最后交卷的时候前面没涂卡,那肯定废废的是吧,先涂卡,涂完卡还剩十分钟哇,这时候这因为时间安排不合理嘛,啊就前面呢,遇那个新题型就非得要把它做出来,然后耽误了好多时间,还剩十分钟的时候呢,这时候心态已经完全崩了,就就是那个手写的时候已经开始抖了,就对正常来讲,你写作文最好那一面先别说好坏,先写满得是吧,这不都是这样要求嘛,结果我那一面呢,就写了一半啊,就写了一半,所以考研的话呢,那个我这个英语就考了48分啊。
03:43
但是你别说,哎,这好低啊是吧,考研的应该知道啊,这个分其实也不低了,这也不低了,对,只不过呢,复旦呢,因为它自主命题,所以他要求呢是55分啊,所以这个差七分是吧,但是因为我总分又比较高,他们系主任呢,我说你能不能给我破格啊,他说我跟你讨论讨论结果,讨论结果说说不行,为啥呢,说五分之内可以给你破啊,因为规则五分之内可以破,说你这差两分啊非成惜是吧,所以就遗憾呢,就调节到北航了,就啊对,就是就就考虑这个模板的事啊,就按说呢,应该最好得分的题,结果呢,就试到这个了,试到这块了是吧,就人生呢,总会得有一些遗憾是吧?嗯,这个这个不是重要说这个事了啊,再回过来说这个模板啊,这个模板呢,再举个例子,就是像这个,呃,以前农村的时候呢,比如说八月15的话呢,这个打月饼,打月饼呢,它会有个膜,然后呢,你里边你想装什么馅呢,你你装好,装好以后呢,拿那个膜一样,哎,然后呢一烧,哎这个呢就月饼就出来了。
04:43
啊,那么你装的这个线呢,其实体现出来的就可以理解为是一个呃,被重启的一个抽样方法了,那你这个膜呢,就是相当于是大家所有的都按这个套路来,上面是什么花样啊,都提前写好的啊,这叫一个模板,就包括你说这个活字印刷术等等,它体现的都是一种模板,那么在我们这个代码层面说,怎么叫模板呢?诶你看下边呢,它解决这个问题,我们去理解一下,说呢,当功能内部的一部分实现是确定的,呃,一部分的实现呢,是不确定的时候呢,我们就可以把这个不确定的部分呢给他暴露出去,让子类呢去实现。
05:21
嗯,那你这个确定的部分,就好比是咱们说的那个英语作文这个模板一样,你把那个框架先是确定的,先把这个框呢先搭出来,框先搭出来,然后不确定部分呢,就里边你看给你模板的时候都会有一些这个空格,然后你针对你这个是什么问题,你里边去填。哎,填的时候呢,其实就相当于是我们说你正常来讲不确定的部分呢,你去填,这就是相当于你具体去实现了,实现的时候,你把这个不确定部分呢,你给大家确定了,就好比是把一个所谓的抽象的方法呢,你现在呢,需要去重写这个抽象方法,哎就这样,那在换句话说去理解,看这写的说在软件开发当中呢,我们去实现一个算法的时候,如果呢,整体步骤呢,很固定,很通用。
06:05
哎,整理步骤很固定,很通用,那这些步骤呢,我们就在副类当中啊,就写好了,里边有好多逻辑呢,都已经写现成了,但是里边呢,又有一些代码呢,是不太确定的,是不固定的,是异变的,那我们就把这个异变的部分呢,既然你现在确定不了,我们就给你抽象化。唯一抽象化以后,负类呢,也就是个抽象类,那我们就去提供抽象类的子类,在子类当中,我们把这个异变的部分呢,就是所谓的抽象方法,这个部分呢,你去实现一下。实现完以后回头呢,我们调的时候还调你负类那个它固定的那个方法,在那个方法当中呢,它有动态的去调你这个异变的,那就是你自己重写这个覆盖了,那就调离子类这个,这体现为呢,就是一个模板。行,还是有点抽象,但是稍微有点感觉了,下面呢,咱们写一个例子啊,就是把这个模板方法的设计模式呢写一下,这个模板呢叫做template啊,它的一个测试,这呢,大家就把这个模板方法的设计模式呢,看作咱们这个抽象类的一个应用就可以了,不用去深究太多钱啊。
07:12
这个应用呢,我们叫做模板方法的设计模式,好这里呢就提到首先呢,你会有一个稍微固定的一个结构,我们把它呢称作一个副类,这呢我就叫做template行,这个里边呢,它有一些是固定的,比如说咱们现在想写一个方法,这个方法呢就是来计算某段代码执行所花费的时间,我就写的叫spend time花费的时间,咱们在前面讲这个质数输出的时候呢,说过这个事儿。咱们直接system.current minutes是吧,CTRL1CTRL1移不出来呀,No suggest,没有任何可建议的,算了,自己写一个吧,叫start,这呢就是获取咱们当前这个代码呢,执行到这的时候呢,一个1970年那个时间到现在的毫秒数啊,然后呢,我们想测试某段代码,它执行花了多少时间,但是你想测试哪段代码啊,不确定不确定是吧,那不确定的部分呢,我们就给它写成一个啊不structure。
08:27
抽象的,我叫一个word的一个code,就是你这段代码呗。那你这是个抽象方法了,这个类呢,你就别犹豫了,抽象类,嗯,然后呢,我们这个方法里边,我去调这个扣,调完那个扣的以后,我再看一下,调完以后的这个时间,我叫一个摁的。那问完了以后,我们再接着就做一个相减呗,说这个啊,花费的时间为二者相减一下,N的减去start,这就OK了,哎,相减一下就可以了,那么至于说这个code,这个代码,就是我们所谓的不确定的部分。
09:16
或者你叫做异变的部分。异变。那么对于整个我们这个spend time来讲,它的整体这个流程呢,它是确定的,就是我们说的这个事儿,整体这个步骤呢,很固定通用,就是我们STEM1变呢,就是我们的这个code的代码,Code的这个方法行这呢我们就写完了,整个这个方法的功能非常确定,就是用来。我们叫计算这个某段代码,某段代码执行所需要花费的这个时间。计算某端代码这个执行所需要花费的时间,某端代码什么代码不知道,所以我就抽象了,那接下来我们去提供具体的一个例子啦,我这呢,不妨就叫做sub,哎,Template对,我让他呢去继承咱们的这个template,那继承以后的话呢,你要想实例化,那你就得去重写这个抽样方法了,就是你想计算计算哪段代码花费的这个时间,这个呢,咱们写一个1000以内的质数吧。
10:26
还记不记得for in一个I从二开始,I小于等于1000I加加,然后for循环,那in的一个接从二开始接小于等于nice,点开方,哎,当然有同学还不太理解,说为什么要开方是吧?哎,你这会儿你再去看可能就更好理解一些了哈,嗯,在这里边的话呢,我们去判断一下,说如果I呢,取模这个阶呢,等等于零,就相当于除尽了,咱们呢,是定义了一个波尔形的变量is flag,先让它是个处,那如果你要除尽了,除尽了那这个变量的成量改一下,改成false,说明呢就是你给除尽了,那么当我们这个,呃,这时候还break一下,一旦除尽了你就别往下再接着算了,当你这个false循环结束以后,判断一下,说这个is flag,看你变没变过,如果没有变过,说明呢,你有没有进去过if,说明呢,你就是个质数,我就s out一下我们的,哎。
11:30
啊,这就完事了,然后这个flag呢,我写到这个外层的for里边了,每次进来呢,又重新再加载,所以就用不着我下边再去重置了,是不是就这样写完了啊,写完以后咱们呢,上面写一个测试,这个测试,那这个时候呢,你看我这呢是叫template,这个写个T吧,拗一个,这时候我们拗的就是这个子类了。啊,叫sub template造了一个此类对象,哎,我付给父类引用,至于说你是个负类的,不是个负类的,这都无所谓了,你要是个子类的话呢,反正我也有这个,诶是不是叫spend time这个方法了,因为我们子类继承了呀,我通过这个子类的,你这个对象我去调spend time这个方法,我调它的时候呢,就会上来有这个有这个A,但是执行到这个的时候呢,这个方法当然前面省略的肯定还是this了啊,那么这个Z呢,是不是就是咱们这个T对象。
12:28
对,我替对象的扣的方法,那不可能是你这个抽象方法了,因为我们这是不是重写了,那重写了,咱们说你这个子类呢,重写父类的方法了,那掉了肯定就是子类的方法了,所以说这块呢,你用的还是父类的功能,但是呢,到这个位置的时候呢,就换成你子类的这块了,哎,这块就执行完了,咱们跑一下。OK,你看这就出来了,这呢就是我们这演示的这道问题,诶后续的话呢,咱们开发中,呃,确实有很多位置还都是用这个模板方法的,呃,为啥要用呢?就是咱们呢,有些结构呢,有些这个功能呢,都是非常确定的了,我都写好了,里边呢,只是有其中的部分代码是不确定的,咱们这呢,只是说用来计算花费时间了,那这只是其中的一种情况,你可以有很多种情况,那你要是有一些不确定部分呢,就有抽象一下,回头呢,呃,你把这个抽象的方法呢,去重写一下,当我们造对象的时候呢,你还是造你此类对象,然后还去调这个固定的方法,在这个方法里边呢,用到这个异变的抽象的部分呢,就替换为你已经重新好的这个,这就是非趁好的一种设计模式,哎,那这个呢,我就讲了,那大家呢,也可以再去看一下这个我们第六章,我这又写了一个,就是这个模板方法呢,可不是说。
13:52
这一种体现了太多了,CTRLV一下,这呢我又写了个例子,这个我就不去这个这个亲自去写了,咱们就看一下就可以啊,你看这呢是个什么情况。
14:02
这呢我也是一个抽象类,这是关于银行的一个操作了,比如说你写个银行系统关于这个排号啊,取号啊操作的这样一个功能,这呢是一个副类,这个副类里边呢,我定义过叫取号排队,具体呢你办一些业务,然后呢你再去反馈评分,这是正常的一些操作了。嗯,下边呢,有一个整体的一个流程,在这个流程当中,你看我还加了一个final,就是你不要对这个方法进行重写,哎,那么大家过来以后呢,就都去执行,这个叫process,就按照这个流程来,一上来呢,你先去取个号,接着的话呢,你就办具体的业务了,然后接下来呢,你再给我做个评分,就这样个情况,那在这里边的话呢,大家不同的人办的业务不一样,那不一样的话呢,这个我们就给它抽象化了。然后接下来我们去提供具体的这个子类,这个子类呢,集承一这个负类,它呢是要取钱的,所以你就指明说你重写方法是要取钱的业务,然后还有人呢,是要这个理财的,那就把这个呃理财的你对应的这个业务的这个功能呢就写上。
15:03
写上以后,这上这就算是完成了,然后我们在这个测试类当中,咱们去new这个此类的对象,另外以后呢,这个也是另外的一个例子了,我通过这个对象呢,去调这个process,调它的时候呢,一上来大家都得去取号,然后到这个业务这块了,大家不一样了,那你就看你造的是哪个对象,你就去看你是什么业务,那这个业务你整完以后,你该评分还得给评分,哎,这也是一个模板,哎非常典型的一个模板,那在这呢,我写了一个操作叫像个钩子一样。这个transaction它就像个钩子一样,本身呢,这是一个负类的方法,到这呢,不确定的时候呢,我们看你到底执行的是哪个子类,那我这块就就形象点就去勾勾钩子一样啊,有好几个子类,我勾住哪个子类呢,我就调哪个子类的功能,所以有的时候形象的把这个方法叫做钩子方法啊,那要是稍微这个这个呃,代码化一下的话呢,这个我们把这个方法有时候叫做回调方法,回调方法这个操作呢,在后边咱们讲外部也好,讲框架也好,这个事儿呢,大家会常见的。
16:10
现在呢,可能去描述这个事儿呢,你可能觉得有点抽象啊,你像后边典型的咱们到外边呢,会讲一个sol,当然so本身是一个接口了啊呃,当然我们具体用的时候呢,其实里边体现的都是这种模板方法的一个调用。我把好多大部分功能都写好了,这种不确定部分的暴露给你,你去那继承或者要有接口,我们回头还是实现啊,这个下午我们去说接口的事儿啊,你自己呢,实现好以后,你就调这个流程化的这个功能,在这里边呢,遇到呢,这个不确定的部分呢,你把你重写这个方法呢,自动的调一下了,这种呢是自动调的,我们把它呢叫做就是咱们写这方法,可没有显示的去调它啊,你看咱这里边写的,我调的这也是叫process,你重写的是重写的一个方法了,但是这个方法你看咱们没有显示的去调它。但是你在这个执行过程当中,你发现他还执行了。
17:00
就是因为呢,你调的这个process,这个方法里边呢,把它给用了,而你显示写的是process,就是我们重写的这种回调方法呢,不用你显示的去调,因为它是个模板的,你去调那个方法那个里边呢会调它的。后边呢,大家学web学框架会见到这样的情况啊,都是用的叫模板方法,好这个大家体会一下,这个就OK了。
我来说两句