一 基本介绍
- 模板方法模式(
Template Method Pattern
),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行 它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 - 简单说,模板方法模式 定义一个操作中的
算法的骨架
,而将一些步骤延迟到子类
中,使得子类可以不改变
一 个算法的结构
,就可以重定义该算法的某些特定步骤 - 这种类型的设计模式属于行为型模式。
这个感觉还是经常用到的,和前端vue里面的钩子生命周期函数是一样的
二 uml类图
**对原理类图的说明-即(模板方法模式的角色及职责) **
- AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象 方法 operationr2,3,4
- ConcreteClass 实现抽象方法 operationr2,3,4, 以完成算法中特点子类的步骤
2.1 代码演示
抽象模板角色类,abstractMethod()、hookMethod()等基本方法是顶级逻辑的组成步骤,这个顶级逻辑由templateMethod()方法代表。
public abstract class AbstractTemplate {
/**
* 模板方法
*/
public void templateMethod(){
//调用基本方法
abstractMethod();
hookMethod();
concreteMethod();
}
/**
* 基本方法的声明(由子类实现)
*/
protected abstract void abstractMethod();
/**
* 基本方法(空方法)
*/
protected void hookMethod(){}
/**
* 基本方法(已经实现)
*/
private final void concreteMethod(){
//业务相关的代码
}
}
具体模板角色类,实现了父类所声明的基本方法,abstractMethod()方法所代表的就是强制子类实现的剩余逻辑,而hookMethod()方法是可选择实现的逻辑,不是必须实现的。
public class ConcreteTemplate extends AbstractTemplate{
//基本方法的实现
@Override
public void abstractMethod() {
//业务相关的代码
}
//重写父类的方法
@Override
public void hookMethod() {
//业务相关的代码
}
}
模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。
三 模板方法模式中的方法
模板方法中的方法可以分为两大类:模板方法和基本方法
3.1 模板方法
- 一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
- 一个抽象类可以有
任意多个模板方法
,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
3.2 基本方法
基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
● 抽象方法:一个抽象方法由抽象类声明,由具体子类实现
。在Java语言里抽象方法以abstract关键字标示。
● 具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换
。
● 钩子方法:一个钩子方法由抽象类声明并实现(这里不是抽象方法)
,而子类会加以扩展
。通常抽象类给出的实现是一个空实现
,作为方法的默认实现。
3.3 默认钩子方法
一个钩子方法常常由抽象类给出一个空实现作为此方法的默认实现。这种空的钩子方法叫做·“Do Nothing Hook”·。显然,这种默认钩子方法在·缺省适配模式·里面已经见过了,一个缺省适配模式讲的是一个类为一个接口提供一个默认的空实现,从而使得缺省适配类的子类不必像实现接口那样必须给出所有方法的实现,因为通常一个具体类并不需要所有的方法。
3.4 命名规则
钩子方法的名字应当以do
开始,这是熟悉设计模式的Java开发人员的标准做法。在上面的例子中,钩子方法hookMethod()应当以do开头;在HttpServlet类中,也遵从这一命名规则,如doGet()、doPost()等方法。
四 注意事项和细节
- 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方 法或者已经实现的某些步骤,子类就会继承这些修改
- 实现了最大化
代码复用
。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。 - 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了
算法的结构保持不变
,同时由子类提供部分步 骤的实现。 - 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
- 一般模板方法都加上
final 关键字
, 防止子类重写模板方法. - 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这
一系列的步骤基本相同
,但其个别步骤在实现时
可能不同,通常考虑用模板方法模式来处理