模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个操作中的算法骨架,并允许子类为其中的某些步骤提供具体实现。这种模式使得子类可以在不改变算法整体结构的情况下,重新定义算法中某些可变部分的实现。
模板方法模式适用于以下场景:
例如,在软件开发过程中,可能需要构建一个通用的数据处理流程,如数据读取、预处理、计算和结果输出等步骤。这些步骤中的数据读取和输出方式可能会因项目需求而变化,但处理流程的基本框架保持不变。此时,可以使用模板方法模式来设计这个数据处理框架。
模板方法模式的核心组成部分包括:
以咖啡制作过程为例,来具体实现模板方法模式:
定义抽象类(AbstractClass):创建一个名为CoffeeMaker
的抽象类,它定义了煮咖啡的基本步骤,其中“煮水”和“添加调料”等步骤是固定的,而“选择咖啡豆”和“研磨咖啡豆”则作为抽象方法留给子类实现。
public abstract class CoffeeMaker {
// 模板方法
public final void makeCoffee() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addCondiments();
}
// 固定步骤
protected void boilWater() {
System.out.println("开始烧开水...");
}
protected void pourInCup() {
System.out.println("将咖啡倒入杯中...");
}
// 抽象方法,留给子类实现
protected abstract void chooseCoffeeBeans();
protected abstract void grindCoffeeBeans();
// 其他固定步骤
protected void brewCoffeeGrinds() {
System.out.println("开始冲泡咖啡粉...");
}
protected void addCondiments() {
System.out.println("加入调料...");
}
}
定义具体类(ConcreteClass):创建两个具体的咖啡机类EspressoMachine
和FrenchPressMachine
,它们继承自CoffeeMaker
并实现抽象方法。
public class EspressoMachine extends CoffeeMaker {
@Override
protected void chooseCoffeeBeans() {
System.out.println("选用浓缩咖啡豆...");
}
@Override
protected void grindCoffeeBeans() {
System.out.println("精细研磨浓缩咖啡豆...");
}
}
public class FrenchPressMachine extends CoffeeMaker {
@Override
protected void chooseCoffeeBeans() {
System.out.println("选用法式压滤咖啡豆...");
}
@Override
protected void grindCoffeeBeans() {
System.out.println("粗略研磨法式压滤咖啡豆...");
}
}
应用端使用:根据需要选择不同的咖啡机制作咖啡。
public class TemplateMethodPatternDemo {
public static void main(String[] args) {
CoffeeMaker espressoMaker = new EspressoMachine();
espressoMaker.makeCoffee();
System.out.println("===========================");
CoffeeMaker frenchPressMaker = new FrenchPressMachine();
frenchPressMaker.makeCoffee();
}
}
``
测试结果
优点:
潜在挑战:
模板方法模式通过在抽象类中定义一个算法骨架,并将可变步骤交由子类实现,有效地实现了算法结构的复用以及灵活扩展。在实际应用中,合理运用模板方法模式能有效组织复杂流程,降低代码重复度,并促进代码结构的清晰化和模块化。然而,在设计时应注意避免过度限制子类的行为,以及控制好抽象类与子类之间的耦合程度。