23种设计模式-模板方法(Template Method)设计模式

模板方法设计模式

🚩什么是模板方法设计模式?

模板方法设计模式(Template Method Pattern) 是一种 行为型设计模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些特定步骤。

使用场景

  • 当多个类有相同的方法,且逻辑基本相同,只有某些细节不同时

  • 当需要控制子类扩展的粒度,只允许子类重写特定操作时

  • 当需要提取公共行为到父类,避免代码重复时

  • 适用于 框架设计 、流程固定但步骤实现不同 的场景

🚩模板方法设计模式的特点

  • 定义算法骨架:父类定义不变的部分和可变的抽象方法

  • 代码复用:公共代码放在父类中实现

  • 扩展控制:子类只能重写特定步骤,不能改变算法结构

  • 反向控制:父类调用子类操作,而非子类调用父类

🚩模板方法设计模式的结构

模板方法模式主要包含以下部分:

  • AbstractClass(抽象类):定义模板方法和抽象的基本操作

  • ConcreteClass(具体子类):实现抽象类定义的抽象操作

图例:

🚩模板方法设计模式的优缺点

✅ 优点

  • 代码复用:将公共行为放在父类中,避免代码重复

  • 扩展性好:子类可以通过重写方法扩展特定步骤

  • 反向控制:父类控制流程,子类只需关注实现细节

  • 符合开闭原则:对扩展开放,对修改关闭

  • 提高可维护性:算法结构清晰,易于维护

❌ 缺点

  • 限制灵活性:子类必须遵循父类定义的算法结构

  • 可能导致类膨胀:每个不同实现都需要一个子类

  • 继承的缺点:Java单继承限制,子类无法再继承其他类

  • 调试困难:模板方法中的流程控制可能使调试变得复杂

🚩模板方法设计模式的Java实现

代码地址:GitHub

  • 创建Person抽象类,定义一个抽象方法TemplateMethod() 和两个抽象操作
java 复制代码
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Person
 * @Description 抽象类定义了模板方法TemplateMethod
 * @date 2025/3/26 13:14
 **/
public abstract class Person {

    public void TemplateMethod() {
        System.out.println("上课 去教室"); // 1
        PrimitiveOperation1(); // 2
        System.out.println("下课 离开教室"); // 3
        PrimitiveOperation2(); // 4
    }

    public abstract void PrimitiveOperation1(); // 原语操作 1 :上课过程 学生 听课...... 老师 讲课
    public abstract void PrimitiveOperation2(); // 原语操作 2 :作业     学生 写作业 提交作业...... 老师 批改作业 打分数
}
  • 创建两个具体子类Student 和 Teacher,各自实现抽象操作

    • Student 子类
    java 复制代码
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName Student
     * @Description 具体子类 Student
     * @date 2025/3/26 13:15
     **/
    public class Student extends Person {
    
        @Override
        public void PrimitiveOperation1() {
            System.out.println("学生:听课 学习 做笔记 提出问题");
        }
    
        @Override
        public void PrimitiveOperation2() {
            System.out.println("学生:写作业 提交作业");
        }
    }
    • Teacher 子类
    java 复制代码
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName Teacher
     * @Description 具体子类 Teacher
     * @date 2025/3/26 13:24
     **/
    public class Teacher extends Person {
    
        @Override
        public void PrimitiveOperation1() {
            System.out.println("老师:上课 讲课 解答问题 布置作业");
        }
    
        @Override
        public void PrimitiveOperation2() {
            System.out.println("老师:批改作业 打分数");
        }
    }
  • 测试模板方法模式

java 复制代码
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName TemplateMethodPattern
 * @Description 测试模板方法模式
 * @date 2025/3/26 13:25
 **/
public class TemplateMethodPattern {

    public static void main(String[] args) {
        // 父类名 对象名 = new 子类名();
        Person student = new Student();
        Person teacher = new Teacher();

        student.TemplateMethod();

        System.out.println("=====我是分割线=====");

        teacher.TemplateMethod();
    }
}

📌 运行结果

🚩代码总结

  • Person 抽象类定义了模板方法 TemplateMethod() 和两个抽象操作

  • Student 和 Teacher 是具体子类,实现了各自的抽象操作

  • 模板方法固定了流程顺序,子类只需实现特定步骤

  • 客户端调用时,不同子类表现出不同的行为,但流程结构一致

🚩总结

  • 模板方法设计模式 定义算法骨架 ,将具体步骤延迟到子类实现

  • 核心是 封装不变部分 ,扩展可变部分 ,实现代码复用

  • 适用于 流程固定但某些步骤实现不同 的场景

✅ Java源码中的应用场景:

  • Java IO类中的InputStream/OutputStream:

    • 定义了读取/写入的基本流程,具体实现由子类完成

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关推荐
二哈赛车手20 分钟前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu25 分钟前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小羊没烦恼!1 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
Fuyo_11192 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
Sarvartha2 小时前
Date、LocalDate、LocalTime、LocalDateTime、DateTimeFormatter类
java
阿俊-全栈开发3 小时前
LikeShop 多商户 Java 版商城微服务模块拆分与部署架构演进实践
java·微服务·架构·likeshop开源商城·多商户源码
Wang's Blog3 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123453 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
香蕉大香蕉(06敬畏市场)4 小时前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
LaughingZhu4 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion