00:01
模板方法模式,我们讲了哪些内容。我们把。这个讲解的这这个部分进行一个梳理,我们看一下我们怎么讲模板模板模板方法模式的呢?首先我们先提出了一个关于豆浆制作的问题,引起大家思考,大家还记得吧?来,我们把这个笔记跟大家补一下。来,左手。首先我们讲这块讲的是模板、方法、模式。有点卡顿,稍等。模板方法模式。模板。副本方法方法模式对不对。我们先提出的是豆浆制作问题。那么制作豆浆制作问题呢?我们首先给大家先提出了豆浆制作的一个流程。这是我们规定的一个流程,大致是选材。添加配料,然后浸泡,然后。
01:01
打,放到豆浆机去打。那提出这样一个需求以后呢,我们下一步做了什么事呢?下一步我们就对模板方法模式做了基本的介绍,就是告诉大家模板方法模式它是一个怎样的内容。做了一个介绍。引出了我们要讲解的。模板方法模式是这样子吧,同学们。那么我们把模板方法模式基本介绍说完了以后呢,我们就来开始往下走,我们给大家讲了一下模板方法模式的它的一个基本原理类图。就是从类图的角度跟大家分析一下模板方法模式,它是怎么去使用的。好的,而且呢,我们也对这个类图做了一个角色和纸质的说明,我们把这块呢给大家拿过来。这是我们讲的内图,是不是内图好。
02:00
那具体来说这个类图这边呢,我们有了一个对角色的说明。然后这有个类图,给大家拿过来。那图在哪里?在我们这个幻灯片里边拿过来就可以了。稍微把代码整理一下。好。那这个类图说完了以后呢,我们紧接着给大家提出怎么去解决,用模板方法模式解决我们这个豆浆制作的问题,是这样子吧,同学们,所以说我们就来开始解决这个问题了。怎么解决的呢?首先。我们。对,这一个解决的时候,我们先画出了想解决的这种思路,用类图的形式把这个思路给大家分析了一下,然后我们用代码实现的是这样一种方式来玩的。这边呢,我把。这个地方稍微的整理一下笔记好。诶,这个就不要了哈,这些不要。对吧,这些我们就不要了。
03:01
OK。然后类图在哪里,类图在我们的eclipse里面我们画了的,打开我们的这一个代码在哪里呢?在这里我们画了一个类图。是不是针对他先画的画了这样一个类图。我们说我们准备这么去实现。OK,放到这了。然后我们针对这个类图呢,我们用代码给大家实现了一把,那具体来说代码就在这里。是不是这是后面那个是个改进版对吧,我们就直接把它放在一起了,改进的时候是加了一个钩子,加了一个字啊,这个是里面这一层,所以说我先把外面这个代码呢给他拿下。里面这个improve我先把它删掉。对不对,因为里面那个improve improve里面呢,它包含什么呀,包含一个模板,模板方法模式里面去使用钩子的这么一个东西。好的,把代码给它放这紧接着我们又提出,在模板方法,模式里面呢,我们可能会用到钩子方法,于是我们对钩子方法做了一个介绍。
04:09
好的,我们把钩子方法做了一个介绍,看一下。具体来说,我们提出给大家说了三点。高职方法呢,是指的在模板方法模式的负类中,我们可以定义一个方法,它默认不做任何事情,就是定义了一个方法。那这个方法呢,它不做任何事,子类是情况,要不要覆盖。OK,如果你不覆盖,那么他就采用他的默认的一个行为,如果你覆盖了,就按你的思路来走。于是我们就提出了,我们比如说想制作纯豆浆,而纯豆浆呢,是不需要添加任何。任何配料的,请问你怎么实现,我们就用的模板方法模式来做的,好,这就是我们的代码。好,那么具体来说我们是怎么改进的呢?OK,就是这段代码是不是。我把这些代码呢给他拿过来就可以了,Improve。
05:02
这是我们使用模板方法,模式中的钩子方法来对新的一个需求进行的一个。改进。就是这么一个改进,把钩子方法说完了以后,为了加深大家的印象,我们给大家说了一下在的一个框架,在spring框架里面呢,IOC容器的初始化,我们用到了什么呀,我们用到了模板方法模式来解决。那么我们把这个代码整理一下。那具体来说,我们分析了一下它的代码,同时呢,也把它的一个类图给分析出来了,我们把代码先放到这里来。这里代码呢,我们就直接把这个图截过来哈,因为内容太多了,咱们就要一个一个的把代码一步一一步一部分的拷过来,太累啊,所以说把这个图截过来。截过来过后呢,这边还有一个内图。我们再把这个加进去哪里啊,就是针对。针对源代码。
06:01
源码的一个角色分就是那个类图,类图在这个类图里面呢,它说明了说明了一个层次关系。OK,层次关系我们在这里描述清楚了。那这个类图在哪?就在我们的这个位置,是在SP这个项目里边呢,我们在这画了一个示意图,好,这个图呢,我们把它拿过来哈,给他看一下。这边也有相应的说明。好,放这就可以了,大家应该一目了然。最后呢,我们又给他说了一下我们这个模板方法模式呢,还有细节,我们来聊两句。那模板方法模式它的一个注意事项,首先第一个呢,它的基本核心事项是算法只存在一个地方,就在我们负类中容易修改,需要修改算法的时候,只需要修改父类的模板方法,或者是已经实现了某些步骤,子类就会继承这些并修改,那么它这个方式呢,实现了最大代码的复用性。
07:08
附类的模板方法和已经实现的某些步骤会被子类继承或直接使用。有些呢,你可以覆盖。所以说这样子的话呢,它既统一了算法,又提供了很大的灵活性,什么叫统一的算法呢?分类的模板方法保证了算法结构基本不变。而可以让我们子类去。由于此类提供的部分部部分步骤的实现,同时呢有此类去提供部分。这个步骤的事情,你比如说。某一个方法是抽象的。有指的去实现就可以了,或者说一个钩子方法。你也可以在这个钩子方法里面呢,写上你自己的业务逻辑,也可以不写。说,既统一的算法,又提供了很大的灵活性。但是呢,任何一个模式都有不足的地方,我这里分析了一下,不足的地方是它需要每一个,每一个不同的实现,都需要有一个此类大家有没有发现?
08:05
所以说这样子呢,类就个数可能会增加一点多一些,所以说会让系统变得比较庞大。这点希望大家注意,就是说如果我们的情况很多,那你这个纸类很多的情况下呢,大家要小心对不对,还有一点,一般来说模板方法呢,我们会加一个final。为什么加一个B呢?防止此类重写模板方法。就是我们希望这个模板方法不要再重写了。明白,所以说一般来讲呢,我们会加banner,大家还记不记得我在写豆浆制作的时候那个make方法。那个make方法,我就加了一个final。然后呢,还有第六点模板方法模式,它主要使用的场景是什么地方呢?就是当要完成,要完成某个过程。该过程要执行一系列的步骤,就是它有一个流程,或者说一个算法,这些步骤呢基本相同。
09:02
而大部分是相同的,只是在个别步骤的实现时有可能不同。你比如说我们制作豆浆,制作豆浆一共四步,其中第一步选料,第三步浸泡,第四步打浆都相同,只是第二一步我们加入的原材料不一样,好这个时候呢,我们就可以用模板模式。你再比如说。我们想去统计某一段代码执行的时间,也可以用模板方法,为什么呢?它前面要打印出。这个程序这段代码执行前的时间,然后呢,在后面还要打印出执行后的时间,而中间这段代码就是你要执行的,诶这也是可以的。对吧,因为它基本步骤相同,它前面输出当前时间和输出执行后的时间,这个步骤一样,只是里面执行的代码不同而已,这个时候就让这个方法让哲去实现也是可以的,所以说我们这要求呢,就是它这个模板方法呢,它是要求这个模板方法他基本步骤是一样的。
10:04
只是个别不同我们才使用。模板方法模式,那如果说你的步骤完全不一样,比如说你去做一件事情,A这件事情跟B这件事情它的步骤完全不一样,没有任何相同的地方,那你再用具模板方法模式就不合理了。那你相当于说你要定多少个模板,定两个模板,如果三个内容定三个模板,那还不如自己去写就完了,是不是这样的道理?好,同学们,所以说我们模板方法模式呢,大家要记住,就是在一系列的步骤中,基本相同的时候,只是个别不同,我们用模板方法模式,如果它大部分都不相同,就不要用了。而且大家知道算法呢,咱们只放在父类中,子类主要去使用这个算法,而他要修改呢,去通过继承父类的方法去重写它的。一些方法,或者是去实现它的一些抽象方法来完成对这个算法的一个灵活的控制。好,同学们,那关于模板方法模式的细节,我们就聊到这里,我写到这里哈,来板书一下。
11:04
模板、方法、模式,咱们就聊到这儿。给他来一个编号。同学们,那关于模板方法模式内容梳理,还有它的一个注意事项的说明,我们就到这里。
我来说两句