23种设计模式-行为型模式之模板方法模式(Java版本)

Java 模板方法模式(Template Method Pattern)详解

🧠 什么是模板方法模式?

模板方法模式是一种行为型设计模式,定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。通过模板方法模式,可以让子类在不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法模式通常用于那些具有固定结构的操作,在不改变整体流程的前提下允许某些步骤的定制。

模板方法模式常用于处理那些需要按照一定流程进行的任务,但每个步骤的具体实现可能不同的场景。


🎯 使用场景

  • 当一个算法的结构和步骤已经确定,但某些步骤的实现需要由子类来完成时。
  • 当一个操作的各个部分的实现步骤是相似的,且这些步骤的顺序不可改变时。
  • 当希望子类能够灵活地改变算法的某些部分,而不影响整体算法结构时。

🏗️ 模式结构

  • AbstractClass(抽象类):定义一个模板方法,规定算法的骨架,且实现一些步骤的默认行为。具体步骤的实现由子类提供。
  • ConcreteClass(具体类):实现模板方法中定义的某些步骤,可以覆盖抽象类中的默认实现。

✅ 示例:制作饮料的模板

抽象类(饮料)

java 复制代码
public abstract class Beverage {
    // 模板方法,定义了制作饮料的流程
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 基本步骤
    abstract void brew(); // 冲泡
    abstract void addCondiments(); // 添加配料

    // 固定步骤
    private void boilWater() {
        System.out.println("Boiling water");
    }

    private void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

具体类(茶)

java 复制代码
public class Tea extends Beverage {

    @Override
    void brew() {
        System.out.println("Steeping the tea");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding lemon");
    }
}

具体类(咖啡)

java 复制代码
public class Coffee extends Beverage {

    @Override
    void brew() {
        System.out.println("Dripping coffee through filter");
    }

    @Override
    void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

客户端

java 复制代码
public class Client {
    public static void main(String[] args) {
        Beverage tea = new Tea();
        tea.prepareRecipe();
        
        System.out.println();

        Beverage coffee = new Coffee();
        coffee.prepareRecipe();
    }
}

输出

复制代码
Boiling water
Steeping the tea
Pouring into cup
Adding lemon

Boiling water
Dripping coffee through filter
Pouring into cup
Adding sugar and milk

✅ 优点

  • 代码复用:模板方法模式通过在抽象类中定义算法骨架,减少了重复的代码,提高了代码的复用性。
  • 控制算法的执行顺序:模板方法控制了算法步骤的执行顺序,并且保证了步骤的一致性。
  • 灵活的扩展性:通过子类可以重写某些步骤,允许灵活定制算法的某些部分,而不影响整体结构。

⚠️ 缺点

  • 过度使用可能导致类的膨胀:模板方法模式的应用可能导致类数量增多,且子类之间的差异可能只是某些步骤的实现不同,导致类层次结构复杂。
  • 子类无法改变算法的骨架:模板方法模式的结构较为固定,子类只能修改某些步骤的实现,而无法改变算法的骨架。
  • 不适用于所有情况:如果子类的定制需求过于复杂,模板方法模式的灵活性可能不足。

🧩 使用建议

模板方法模式适用于需要对多个子类执行相同的操作流程,但每个子类的具体实现有所不同的场景。它可以帮助你避免代码重复,同时保持算法结构的一致性。

典型应用场景包括:

  • 定义一个固定的工作流程,并允许子类在不改变结构的前提下定制某些步骤。
  • 系统中存在多个类似的操作步骤,只是某些步骤的细节实现不同。

如果系统中的算法流程变动频繁或步骤较为复杂,可能需要考虑使用其他模式来增强灵活性。

相关推荐
二哈赛车手20 分钟前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu25 分钟前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小熊恋旧29 分钟前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合30 分钟前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J30 分钟前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
小羊没烦恼!1 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
will_net1 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央1 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>2 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
Fuyo_11192 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法