00:00
Java设计模式之模板方法模式,我们来看一下。模板方式方法模式呢?我们先提出一个豆浆制作的问题。那么现在呢,要求大家编写一个程序去制作豆浆,大家都知道我们豆浆的制作呢,大体的流程都是这样子的,先选原材料。在添加我们的配料再浸泡,浸泡过后呢,放到这个豆浆机去打碎,最后呢,我们就。得到了这个豆浆大致的流程,这样子好OK,那么现在最大的问题是我们添加不同的配料,就会制作出不同口味的豆浆,比如说黑豆,黑豆豆浆,或者是红豆豆浆,或者是花生豆浆,对不对?反正就是你这个,这里面选材肯定都是黄豆嘛。豆浆肯定是黄豆,那么浸泡的过程一样,把这个豆浆放到豆浆机里面打碎,这个呢也差不多,主要是。
01:02
这个添加配料不一样。所以说我们从这个地方可以分析出来,选材,浸泡和放到豆浆,放到豆浆机打碎这几个步骤呢,对于制作每一种口味的豆浆都一样。因此。像这种情况,我们就可以使用模板方法模式来完成。还有一个经典的场景就是我们希望,呃,以前有些同学可能听过,就是如果我们要去统计一段代码。统计一段代码,它执行的效率,其实也可以用模板方法。其实也可以用模板方法,所以说我们可以称它,因为模板方法模式呢比较简单,所以说这个地方呢,我们就很容易想到这个办法,所以说我们就不再用传统方法来过渡了,他们直接就说。模板方法怎么去解决这个问题就完事了。好,同学们,我们来看一下模板方法的基本介绍。那么模板方法呢?它是template method pattern,又叫模板模式,就简称模板模式方法,模板模式也行,又叫模板方法。模式和模板模式是一个意思,那么它是怎么样做呢?他在一个抽象类中公开定义了它执行的方法的模板。
02:13
然后它的子类可以需要去重新编写这些方法。但调用的时候以抽象方法中定义的方法方式来进行。可以简单这样说,模板方法、模式是定义了一个操作中的一个算法的骨架,或者是一个流程的股价,而将这些步骤具体的步骤推迟到子类中,使子类可以不改变一个算法的结构。就可以重新定义算法的某些特定的步骤。而且呢,从这个前面分析,我们可以看到模板方法模式,它其实是属于什么呀,它是属于这个行为型的。行为型的模式,大家还记不记得我们这一个设计模式呢?有创建型的,还有结构型的,那么模板方法模式从这开始呢?就进入到行为型的这种。
03:02
这种模式了,好,那现在我们为了加深印象,我们来画一个模板方法模式的原理类图,来,同学们我们一起画一下,然后再对模板方法模式的角色做一个分析就可以了,来吧,同学们。还打开我们的eclipse。我们新建。一个包。我们新建一个包包,取个名字叫template。Complete。没问题哈,那现在呢,我们画一个类图,各位同学跟上我的思路,我们画一个类图来分析一把。好的,那么根据刚才分析,它会有一个抽象类,OK,那么就写到这里来比较A,呃,Abstract abstract AB。Abstract class。这个呢是一个抽象类,抽象类里面呢,肯定会有一些方法来吧,假如说我们第一个方法呢,是这样子的,就是一个模板方法。假设叫template。好的,那么在这里面我们会有一些其他的方法,比如说这样几个方法,我简写哈。
04:04
三个方法嘛,咱们写三个方法。那这个时候我们在这个这个模板里边,大家可以看到,在这个模板里面呢,我们可以按照这个顺序把这几个方法写进去,就说什么意思呢,就是说我们这里面有。有这些方法。Temp呢是一个模板。他定义了一个大概执行的一个算法的股价。而下面这个OPERATOR234都是抽象的方法。那么这234这个方法呢,我们可以把它整合一下,放到我们这个模板里面去,当然顺序还有具体的一些这个流程,可以你在模板方法里面去进行一个定义,或者是进行一个呃,实际的一个调整。也就是说temp里面定义了我们这个模板,而234呢,有子类具体来实现,到了子类里面,我们要调的时候呢,我们就调这个模板。
05:00
方法就可以把它的这个算法,把它这个算法骨架调起来。好,这是大致的一个说法,来吧,同学们,现在呢,我在这简单说一下。好,我在这简单说一下,同学们啊,就说这个template。Complete就是我们的模板方法。OK,那么这个方法里面看什么呢?它定义了啊,定义了或者规定了吧,规定了我们这个方法的调用方式,就是我们这个算法的大体结构。大体的。大致的,大致的。大致。的一个流程。对吧,比如说你可能是这样写的啊,我打个比方,比如可能大致这样写,说我们这个流程呢,是这样写的,就是operator先执行我们operation。第二个方法。在执行我们这个operation第四个方法,假如哈。
06:01
在执行我们这个operation第三个方法。就这样子,一个意思明白。那当然了,你这个OPERATION234呢,一般来讲都是抽象的方法,就是,当然这个到底是不是抽象的,也根据实际情况来看。就说这些方法呢,可以就是我们所说的operation。二三是可以是什么呢?可以是抽象的方法。抽象方法。当然也有可能是实现的,也有可能是实现的啊,比如说他们就是234,其中有一个步骤就是相同的,所以说也有可也可以是我写到这来。也。也可以是什么呢?实现的方法。OK,那么抽象的方法是一定要放在纸内去实现的,这个没什么说的。如果是抽象的方法。抽象的方法就放到哪里呢?放到它的子类去实现即可。OK啊,同学们,那大体呢,就是这么一个说法,大体就是这么一个说法,我先把它勾上。
07:07
他的关系连起来。那下面我们就有此类了,各位同学。那子类我们这边就写一个concrete。Concrete什么呀,这个class,那这个子类里边呢,我们会去继承。各位同学啊,这个是抽象类,是不是我们就去继承它?那继承的过程中,显然你这里面就会把你这个抽象方法实现,但是哪些是抽象方法我就不好说了啊,假如我们234都是抽象方法,那我就要把这三个方法都写上来,写一下。二。对2OK,对吧,同学们再来。这个第二个方法咱有了,然后第三个方法是不是同学们第三个方法再来第四个方法,你就把它具体的实现就可以了。那实现以后我们调的时候怎么调呢?各位朋友来整一个,那么我们就对这个端。兰端。
08:01
我们在这个可能端里面肯定会去调用它,那调的时候就非常简单,我们去创建一个这样的实例。是不是也就是说你在调的时候呢,你根据你的实际情况来使用就可以了,那嗯,这个时候就看你的需求,看你的需求,因为你这些模板方法也继承下来,你可以去依赖他。对吧,你来他,然后呢,把这个做完了以后,我们去,因为这个template也被你继承下来了嘛,那这个方法肯定就被实现了,所以你直接调template就可以把你的234方法调调完了,那显然你不同的子类可能就不一样了,比如说我这还有另外一个方法,还有一个类是吧concrete。Concrete class,比如是B,那这个B方法里面呢,他也会去。斜塔。但是这里面对OPERATOR234的实现肯定就不一样了。那显然你不一样了后,我还要去掉这个tempate,肯定结果就不一样,实验吧,同学们好,大体就是这样一个分析明白,好,各位朋友,那关于这个示意图我们就聊到这里。那下面呢,我们。
09:06
呃,这个关于这个模板方法的一个原理就说到这,我们把它的这个角色再做一个简单的简单的一个分析和他的一个说明来整理一下。第一点我们可以看到abri。Abstract。呃,这样写abstract。Class,它是一个什么呢?是一个。他是一个。抽象类,从这可以看是个抽象类。对吧,抽象类,那么他提供一个什么呢?它在这在这个类中,这个类中它是实现了这个模板方法的,这个模板方法它肯定是实现了,对然后呢,定义了算法的一个什么呀,大体的一个骨架。大体这个股价它是定下来了,然后具体的子类呢,同学们具体的子类需要去干什么呀,需要去重新定义。
10:05
重新重写吧,我要实现吧,具体的是去实现其他的一些抽象方法。那具体哪些使用方法根据你的这个流程来走好,这样子呢就完成了,那concrete。那么class是什么呢?它这个就是实现了,比如说这个抽象方法,我们写到这啊,比如说operate。OPERATION234,那这个。Concrete class呢,它就是实现了抽象方法234。比如说234都需要我们实现,对不对,那么以完成什么呢?完成完成这个算法中,算法中就是因为你这个。这个temp的方法呢,已经被你实现了,那就完成这个算法中的什么呢?这个特定特定子类。的相关步骤啊。具体的这个业务或者步骤步骤。
11:01
OK,那这个模板方法刚才在我们那写的就是template。好,大体这个意思就说到这里,好吧,那我把这个图呢,给他截过来。应该这个图还是说的比较清晰的。各位同学,我把这个图放到我们的笔记中就可以了。好,各位同学关于我们模板模式的一个基本介绍就到这里,下面呢,我们用模板模式模板,呃,模板方法啊,模板方法模式,用这个模板方法模式呢,把前面的这个案例给他实现一把就可以了。
我来说两句