Template Method(模板方法)
1)意图
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2)结构
模板方法模式的结构图如图7-47 所示。
其中:
-
AbstractClass(抽象类) 定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤;实现模板方法,定一个算法的骨架,该模板方法不仅调用原语操作,也调用定义在 AbstractClass 或其他对象中的操作。
-
ConcreteClass(具体类) 实现原语操作以完成算法中与特定子类相关的步骤。
3)适用性
Template Method 模式适用于:
-
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
-
各子类中公共的行为应被提取出来并集中到一个公共父类中,以避免代码重复。
-
控制子类扩展。模板方法旨在特定点调用“hook”操作(默认的行为,子类可以在必要时进行重定义扩展),这就只允许在这些点进行扩展。
4 应用举例
制作咖啡和茶
假设我们要设计一个系统来模拟制作咖啡和茶的过程,虽然制作咖啡和茶的基本步骤相似(如烧水、倒水、加配料),但某些步骤会有差异(如是否需要磨豆子、是否需要泡茶叶)。这里可以使用模板方法模式来实现。
Java代码示例:
// 抽象类:定义制作饮品的模板方法
abstract class Beverage {// 模板方法,定义算法的骨架public final void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}protected void boilWater() {System.out.println("烧开水");}protected void pourInCup() {System.out.println("倒入杯中");}// 抽象方法,由子类实现abstract protected void brew();// 钩子方法,允许子类覆盖默认行为protected void addCondiments() {System.out.println("添加配料");}
}// 具体类:实现不同的饮品制作过程
class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("研磨咖啡豆");}@Overrideprotected void addCondiments() {System.out.println("加入糖和奶");}
}class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("浸泡茶叶");}
}public class TemplateMethodPatternDemo {public static void main(String[] args) {// 制作咖啡Beverage coffee = new Coffee();System.out.println("制作咖啡:");coffee.prepareRecipe();System.out.println();// 制作茶Beverage tea = new Tea();System.out.println("制作茶:");tea.prepareRecipe();}
}
在这个例子中:
Beverage
是抽象类,定义了制作饮品的模板方法prepareRecipe()
,其中包含了所有饮品制作的通用步骤。Coffee
和Tea
是具体类,它们分别实现了brew()
方法,以适应各自的特点。同时,addCondiments()
方法在Coffee
中被覆盖,以加入特定的配料。
通过模板方法模式,我们可以定义一个算法的框架,同时允许子类控制算法的细节,这有助于代码的复用和维护。