1. 基本概念
模板方法模式(Template Method Pattern)是一种行为型设计模式, 它定义了一个算法的骨架,将一些步骤的实现延迟到子类。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。【引用自大话设计第10章】
举个简单的例子,做一道菜通常都需要包含至少三步:
- 准备食材
- 亨饪过程
- 上菜
不同菜品的亨饪过程是不一样的,但是我们可以先定义一个”骨架”,包含这三个步骤,亨饪过程的过程放到具体的炒菜类中去实现,这样,无论炒什么菜,都可以沿用相同的炒菜算法,只需在子类中实现具体的炒菜步骤,从而提高了代码的复用性。
2. 基本结构
模板方法模式的基本结构包含以下两个角色:
- 模板类
AbstractClass
:由一个模板方法和若干个基本方法构成,模板方法定义了逻辑的骨架,按照顺序调用包含的基本方法,基本方法通常是一些抽象方法,这些方法由子类去实现。基本方法还包含一些具体方法,它们是算法的一部分但已经有默认实现,在具体子类中可以继承或者重写。 - 具体类
ConcreteClass
:继承自模板类,实现了在模板类中定义的抽象方法,以完成算法中特定步骤的具体实现。
3. 简易实现
模板方法模式的简单示例如下:
- 定义模板类,包含模板方法,定义了算法的骨架, 一般都加上
final
关键字,避免子类重写。
1 | // 模板类 |
- 定义具体类, 实现模板类中的抽象方法
1 | // 具体类 |
- 客户端实现
1 | public class Main { |
4. 应用场景
模板方法模式将算法的不变部分被封装在模板方法中,而可变部分算法由子类继承实现,这样做可以很好的提高代码的复用性,但是当算法的框架发生变化时,可能需要修改模板类,这也会影响到所有的子类。
总体来说,当算法的整体步骤很固定,但是个别步骤在更详细的层次上的实现可能不同时,通常考虑模板方法模式来处理。在已有的工具和库中, Spring框架中的JdbcTemplate
类使用了模板方法模式,其中定义了一些执行数据库操作的模板方法,具体的数据库操作由回调函数提供。而在Java的JDK源码中,AbstractList
类也使用了模板方法模式,它提供了一些通用的方法,其中包括一些模板方法。具体的列表操作由子类实现。