1.定义
模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。是类行为型模式。【继承+代码复用】
2.模式结构
模板方法模式包含如下两个角色:
(1) AbstractClass(抽象类):在抽象类中定义了一系列基本操作,这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法,用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。
(2) ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。
3.模式实现
3.1.模板方法
由于模板方法需要组合算法的操作步骤,因此定义为抽象类。
public abstract class TemplateAbstractClass {
/**
* 模板方法
*/
public void execute() {
preDoSomething();
abstractMethod();
hookMethod();
afterDoSomething();
}
private void preDoSomething() {
System.out.println("before do some thing in abstract class");
}
private void afterDoSomething() {
System.out.println("after do some thing in abstract class");
}
/**
* 抽象方法
*/
public abstract void abstractMethod();
/**
* 钩子方法
*/
public void hookMethod() {
}
}
3.2.具体方法
具体方法实现模板方法,重写其中的抽象方法。
public class SubClass extends TemplateAbstractClass {
/**
* 抽象方法
*/
@Override
public void abstractMethod() {
System.out.println("do another thing by subClassOne");
}
}
4.优缺点
4.1 优点
提高代码复用性: 将相同部分的代码放在抽象的父类中 提高了拓展性: 将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为 实现了反向控制: 通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制,符合“开闭原则”
4.2 缺点
引入了抽象类,每一个不同的实现都需要一个子类来实现,导致类的个数增加,从而增加了系统实现的复杂度。
4.3 应用场景
对一些复杂的算法进行分割,将其算法中固定不变的部分设计为模板方法和父类具体方法,而一些可以改变的细节由其子类来实现
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。