设计模式:模板方法模式详解与实战应用
引言
在软件开发中,我们经常会遇到一些业务流程相似但具体实现细节不同的场景。例如,制作咖啡和制作茶的过程非常相似:烧水、冲泡、加入配料等步骤基本一致,但具体的茶叶种类、咖啡粉类型以及添加的糖奶比例却各不相同。如果为每一种饮品都编写一套完整的流程代码,会导致大量的重复代码。此时,模板方法模式(Template Method Pattern) 便应运而生。
模板方法模式是一种基于继承的代码复用行为型模式。它通过定义一个操作中的算法框架,将某些步骤延迟到子类中实现,从而使得子类可以在不改变算法结构的前提下重定义特定步骤。本文将深入探讨该模式的定义、结构、经典案例以及在 Android 和 Java 核心类库中的应用。
定义与 UML 结构
定义
模板方法模式(Template Method Pattern)定义了一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML 结构
模板方法模式主要包含以下两个核心角色:
-
抽象类(AbstractClass):
- 在抽象类中定义了一系列基本操作(Primitive Operations),这些基本操作可以是具体的,也可以是抽象的。每一个基本操作对应算法的一个步骤。
- 在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架。模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在子类的子类中实现的基本方法,还可以调用其他对象中的方法。
- 通常,父类提供的构建步骤和顺序或者算法骨架是不希望甚至是不允许子类去覆盖的,因此在某些场景中,可以直接将父类中提供骨架的方法声明为
final类型。
-
具体子类(ConcreteClass):
- 它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤。
- 也可以覆盖在父类中已经实现的具体基本操作,以改变算法的局部行为。
(此处为模板方法模式 UML 类图示意)
经典示例:冲饮制作
为了更直观地理解,我们先看一个经典的非业务场景示例:冲饮制作。
// 抽象父类
abstract class Drink {
// 模板方法,定义算法骨架
public final void prepare() {
boilWater(); // 烧水
brew(); // 冲泡 (由子类实现)
pourInCup(); // 倒入杯中
addCondiments(); // 加调料 (由子类实现)
}
// 具体方法
private void boilWater() {
System.out.println("烧开水");
}
{
System.out.println();
}
;
;
}
{
{
System.out.println();
}
{
System.out.println();
}
}
{
{
System.out.println();
}
{
System.out.println();
}
}


