1.模板方法模式的定义
模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
我的理解:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。此时可以用一个抽象类将这些步骤写出,具体实现由子类完成。对于模板方法和一些不变的方法,直接在抽象类内实现。
这时需要考虑一个问题,如果对于不同的模板,有些具体实现要执行某步骤,还有具体实现不需要执行该步骤。
解决方法一:在子类重写,但默认不进行任何操作。
解决方法二:在父类中为某个不确定是否要执行的方法加上一个钩子方法。
钩子方法:在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。钩子方法的默认返回值为true,表示钩子方法所关联的步骤需要执行;如果某个模板中该步骤不需要执行,则子类重写该方法,将该方法的返回值改为false。其实就是给某个步骤加一个标记,根据这个标记来判断某个方法要不要执行。
2.模板方法模式的结构
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型。
- 抽象方法:在抽象类中申明,由具体子类实现。
- 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
- 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
模板方法模式包含以下主要角色:
(1) 抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。
(2) 具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
参考:
尚硅谷-图解Java设计模式(韩顺平)
模板方法模式(模板方法设计模式)详解
如有错误,欢迎指正