概念
模板方法设计模式(Template Method Design Pattern)是一种行为型设计模式,它定义了一个算法的步骤骨架,将这些步骤的具体实现延迟到子类中。模板方法模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
组成角色:
- 抽象类(Abstract Class):定义了一套算法骨架,包括具体方法、抽象方法和模板方法。模板方法定义了算法的步骤,并依次调用相应的具体方法。
- 具体子类(Concrete Class):实现抽象类中的抽象方法,提供具体的算法实现。
相关图示
示例代码
// 抽象类,定义算法骨架
public abstract class AbstractTemplate {
// 具体方法
protected void step1() {
System.out.println("Step 1: Preparation");
}
// 抽象方法,由子类实现
protected abstract void step2();
// 具体方法
protected void step3() {
System.out.println("Step 3: Clean up");
}
// 模板方法,定义算法步骤
public final void templateMethod() {
step1();
step2();
step3();
}
}
// 具体子类A
public class ConcreteClassA extends AbstractTemplate {
@Override
protected void step2() {
System.out.println("Step 2: ConcreteClassA implementation");
}
}
// 具体子类B
public class ConcreteClassB extends AbstractTemplate {
@Override
protected void step2() {
System.out.println("Step 2: ConcreteClassB implementation");
}
}
public class TemplateMethodDemo {
public static void main(String[] args) {
AbstractTemplate templateA = new ConcreteClassA();
templateA.templateMethod();
System.out.println("--------------------");
AbstractTemplate templateB = new ConcreteClassB();
templateB.templateMethod();
}
}
运行结果
适用场景
- 一系列算法或操作的骨架已经确定,但其中的某些步骤可以有多种实现或可变化。通过使用模板方法,这些可变化的步骤可以被推迟到子类中实现,从而实现代码复用和灵活性。
- 避免代码重复。当存在多个类,它们之间的功能和操作步骤相似,但细节上存在差异时,可以考虑使用模板方法设计模式。将相同的部分提取到抽象类中,将可变部分交由子类实现,从而达到减少重复代码的目的。
- 封装不变部分,扩展可变部分。通过将不变的部分封装在抽象类中,将可变的部分延迟到具体子类实现,保证了代码的稳定性和可扩展性。
- 控制子类扩展。模板方法设计模式中的模板方法通常是一个不可被修改的方法,它定义了整个算法的执行顺序。子类可以重写模板方法中的某些步骤,但不能改变模板方法的结构和执行顺序。这样可以更好地控制子类的行为和扩展。
举个例子,一个软件安装程序可能包括以下步骤:验证许可证、选择安装路径、安装软件、配置软件。其中验证许可证和安装路径这两个步骤可能因产品不同而有所差异,而安装和配置软件的步骤基本相同。这时,可以使用模板方法设计模式,将验证许可证和选择安装路径的实现留给具体子类,而将相同的安装和配置软件的步骤放在抽象类中。