目录
一、简介
模板模式(Template Method Pattern)是一种行为型设计模式,它通过在一个方法中定义一个算法的框架,而将某些步骤的具体实现延迟到子类中。模板模式允许子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
模式核心概念
- 模板方法:
- 在基类中定义一个方法,该方法包含算法的框架(骨架)。
- 使用基类中的其他方法来实现算法的各个步骤。
- 抽象方法:
- 在基类中声明但不实现,具体实现由子类提供。
- 钩子方法(可选):
- 提供在算法执行过程中插入自定义行为的机会,通常有默认的空实现,子类可以选择性地重写。
模板模式的优缺点
优点:
- 复用性高:将不变的部分封装在基类中,子类只需要实现具体逻辑,避免重复代码。
- 灵活性强:通过子类的扩展,改变某些步骤的实现方式,满足不同需求。
- 可控性好:模板方法封装了算法的框架,子类无法更改算法的整体流程。
缺点:
- 继承局限性:基类中定义的逻辑对所有子类强制约束,子类的灵活性受到限制。
- 维护复杂性:随着子类的增加,可能会导致系统复杂度增加,维护变得困难。
二、实现步骤
- 创建一个抽象基类,定义模板方法和抽象方法。
- 在模板方法中定义算法框架,调用抽象方法完成具体步骤。
- 子类继承基类并实现抽象方法。
- (可选)通过钩子方法扩展功能。
三、与其他模式的比较
-
与策略模式:
- 模板模式关注算法结构,子类实现细节。
- 策略模式关注行为替换,通过组合替代继承。
-
与工厂方法模式:
- 模板模式定义整体流程,允许子类定制具体步骤。
- 工厂方法模式专注于创建对象的过程,子类提供特定实现
四、代码实现
1. 抽象方法类
public abstract class Beverage {
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
protected abstract void addCondiments();
private void pourInCup() {
System.out.println("装杯");
}
protected abstract void brew();
private void boilWater() {
System.out.println("热水");
}
}
2. 子类实现具体的方法
public class Tea extends Beverage{
@Override
protected void addCondiments() {
System.out.println("展茗");
}
@Override
protected void brew() {
System.out.println("泡茶");
}
}
public class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("泡咖啡");
}
@Override
protected void addCondiments() {
System.out.println("加糖和牛奶");
}
}
3. 结果测试
public class TemplateMethodTest {
public static void main(String[] args) {
Beverage tea = new Tea();
tea.prepareRecipe();
Beverage coffee = new Coffee();
coffee.prepareRecipe();
}
}