1.1 简介
1.1.1 概述
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,允许子类在不修改结构的情况下重写算法的特定步骤。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。
1.1.2 优缺点
优点:
① 封装了不变部分,扩展可变部分。把不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类扩展。
② 它在父类中提取了公共的部分代码,便于代码复用。
③ 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
① 对每个不同的实现都需要定义一个子类,导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。
② 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
③ 由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。
1.2 案例
我们在毕业时都写过论文,一般都是学校规定论文格式给出一个模板,我们按照格式往里面填充内容,有一些内容是已经写好的不需要我们去更改它,例如 原创声明,也有一些只提供了大标题内容是需要我们自己去写的,例如 绪论,按照模板顺序完成之后就是一篇完整的论文了。其中顺序已经定好了是不能变更的,绪论总不能写在结束语后面吧。如下图所示,在 AbstractClass 中声明步骤的 step 方法以及规定步骤执行顺序的 templateMethod 方法,根据不同的需求我们需要实现 AbstractClass 并重写相关方法。但是规定顺序的模板方法不能被重写。