1、简述
模板方法模式(Template Method Pattern)是一种行为型设计模式,它通过定义一个模板方法,将算法的结构定义在基类中,但允许子类重写某些步骤的实现。通过这种方式,可以在保持算法结构一致的前提下,实现算法的灵活扩展。
设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git
2、 核心思想
模板方法模式的核心在于:
- 固定流程:在基类中定义一个方法,包含算法的整体流程。
- 可扩展性:允许子类实现或重写流程中的某些具体步骤。
模板方法模式由以下几个核心角色组成:
- 抽象类(AbstractClass):定义算法的骨架和模板方法,并声明部分抽象方法,供子类实现。
- 具体类(ConcreteClass):实现抽象方法,并根据具体需求自定义行为。
- 模板方法(TemplateMethod):在抽象类中定义,调用一系列基本方法,完成算法整体逻辑。
3. 实际案例
假设我们需要制作不同种类的饮料,如茶和咖啡。制作饮料的流程是固定的:
- 煮水。
- 冲泡饮料。
- 倒入杯中。
- 添加调料。
不同饮料的步骤如"冲泡"和"添加调料"可以由子类实现。
// 抽象类:饮料
abstract class Beverage {
// 模板方法
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
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();
}
// 具体类:茶
class Tea extends Beverage {
@Override
protected void brew() {
System.out.println("Steeping the tea");
}
@Override
protected void addCondiments() {
System.out.println("Adding lemon");
}
}
// 具体类:咖啡
class Coffee extends Beverage {
@Override
protected void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
protected void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
// 测试类
public class TemplateMethodDemo {
public static void main(String[] args) {
Beverage tea = new Tea();
System.out.println("Making tea:");
tea.prepareRecipe();
System.out.println();
Beverage coffee = new Coffee();
System.out.println("Making 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
4、优缺点
优点
- 代码复用:模板方法在基类中实现公共逻辑,减少代码重复。
- 灵活性:允许子类覆盖部分逻辑,满足特定需求。
- 一致性:确保算法的整体结构在各个子类中保持一致。
缺点
- 对子类的依赖:实现模板方法需要依赖子类的具体实现,可能导致子类数量增加。
- 复杂性增加:当模板方法涉及的步骤较多时,代码可能变得难以维护。
5、应用场景
- 固定流程的场景:如数据处理的多步骤操作、文档生成流程等。
- 具有相似逻辑的系统:如游戏中的关卡生成、报告生成工具。
- 框架设计:模板方法模式在框架中应用广泛,允许用户扩展具体功能。
6、总结
模板方法模式是一种非常实用的设计模式,尤其适合需要复用固定逻辑并允许灵活扩展的场景。在实际开发中,可以通过它来提高代码的可复用性和一致性,同时保持足够的灵活性。
希望本文能帮助您更好地理解和应用模板方法模式!如果有任何问题或建议,欢迎留言交流!
评论区