文章目录
- 模式结构
- 模式特点
- 示例代码
- 输出结果
- 关键点解析
- 模式的优缺点
- 使用场景
- 总结
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中的算法骨架,而将某些步骤的实现延迟到子类中。通过这种方式,模板方法模式可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤
模式结构
模板方法模式的结构包括以下几个关键部分:
- 抽象类(Abstract Class):定义算法的骨架,并包含一个或多个抽象方法,留给子类实现
- 具体子类(Concrete Class):实现抽象类中的抽象方法,完成具体的算法步骤
- 模板方法(Template Method):在抽象类中定义的具体方法,按照一定的步骤调用抽象方法,确保算法的整体结构
模式特点
- 封装不变部分,扩展可变部分:算法的骨架固定在抽象类中,具体实现细节由子类完成
- 遵循开闭原则:新增功能时,只需扩展子类,而不需要修改抽象类
- 减少代码重复:公共逻辑封装在抽象类中,避免子类重复实现
示例代码
以下是一个使用模板方法模式的示例:制作饮品的过程
// 抽象类:饮品制作流程
abstract class Beverage {// 模板方法:定义饮品制作的算法骨架public final void prepareRecipe() {boilWater();brew();pourInCup();if (customerWantsCondiments()) {addCondiments();}}// 公共步骤,所有饮品都需要private void boilWater() {System.out.println("Boiling water.");}private void pourInCup() {System.out.println("Pouring into cup.");}// 抽象步骤,由子类实现protected abstract void brew();protected abstract void addCondiments();// 钩子方法:提供默认实现,子类可选择覆盖protected boolean customerWantsCondiments() {return true;}
}// 具体类:制作茶
class Tea extends Beverage {@Overrideprotected void brew() {System.out.println("Steeping the tea.");}@Overrideprotected void addCondiments() {System.out.println("Adding lemon.");}
}// 具体类:制作咖啡
class Coffee extends Beverage {@Overrideprotected void brew() {System.out.println("Dripping coffee through filter.");}@Overrideprotected void addCondiments() {System.out.println("Adding sugar and milk.");}
}// 测试代码
public class TemplateMethodExample {public static void main(String[] args) {System.out.println("Making tea:");Beverage tea = new Tea();tea.prepareRecipe();System.out.println("\nMaking coffee:");Beverage coffee = new Coffee();coffee.prepareRecipe();}
}
输出结果
Making tea:
Boiling water.
Steeping the tea.
Pouring into cup.
Adding lemon.Making coffee:
Boiling water.
Dripping coffee through filter.
Pouring into cup.
Adding sugar and milk.
关键点解析
- 模板方法的作用:
prepareRecipe()
是模板方法,定义了制作饮品的固定流程。- 子类通过实现
brew()
和addCondiments()
方法,提供具体的制作细节。
- 钩子方法的灵活性:
- 钩子方法
customerWantsCondiments()
提供了默认实现,子类可以选择性地覆盖它来改变行为。
- 钩子方法
- 防止子类修改流程:
- 模板方法通常使用
final
修饰,防止子类改变算法骨架。
- 模板方法通常使用
模式的优缺点
优点:
- 代码复用:将通用代码封装在抽象类中,减少重复代码。
- 灵活扩展:子类可以通过实现或重写方法定制具体行为。
- 清晰的流程控制:模板方法明确了算法的步骤和执行顺序。
缺点:
- 类的数量增加:每个具体实现都需要定义一个子类,可能导致类的数量增多。
- 继承的限制:模板方法模式依赖继承,可能降低灵活性,子类之间存在强耦合。
使用场景
模板方法模式适用于以下场景:
- 具有固定流程的操作:算法的步骤固定,但某些步骤的实现可能变化。
- 复用公共逻辑:多个子类有相同的操作步骤,可以抽取到抽象类中。
- 需要灵活扩展的流程:通过钩子方法和抽象方法,子类可以灵活定制行为。
总结
模板方法模式通过将算法的骨架固定在抽象类中,确保了流程的稳定性,同时允许子类定制具体实现,达到了复用与扩展的平衡。它是一种经典的设计模式,广泛应用于框架设计、业务流程管理等场景中。