问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/weixin_45683778/article/details/146524482

模板方法设计模式是一种行为型设计模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。本文将详细介绍模板方法设计模式的定义、特点、结构、优缺点以及Java实现,并通过具体的代码示例帮助读者理解其原理和应用场景。

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

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

使用场景

  • 当多个类有相同的方法,且逻辑基本相同,只有某些细节不同时
  • 当需要控制子类扩展的粒度,只允许子类重写特定操作时
  • 当需要提取公共行为到父类,避免代码重复时
  • 适用于框架设计流程固定但步骤实现不同的场景

模板方法设计模式的特点

  • 定义算法骨架:父类定义不变的部分和可变的抽象方法
  • 代码复用:公共代码放在父类中实现
  • 扩展控制:子类只能重写特定步骤,不能改变算法结构
  • 反向控制:父类调用子类操作,而非子类调用父类

模板方法设计模式的结构

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

  • AbstractClass(抽象类):定义模板方法和抽象的基本操作
  • ConcreteClass(具体子类):实现抽象类定义的抽象操作

图例:

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

优点

  • 代码复用:将公共行为放在父类中,避免代码重复
  • 扩展性好:子类可以通过重写方法扩展特定步骤
  • 反向控制:父类控制流程,子类只需关注实现细节
  • 符合开闭原则:对扩展开放,对修改关闭
  • 提高可维护性:算法结构清晰,易于维护

缺点

  • 限制灵活性:子类必须遵循父类定义的算法结构
  • 可能导致类膨胀:每个不同实现都需要一个子类
  • 继承的缺点:Java单继承限制,子类无法再继承其他类
  • 调试困难:模板方法中的流程控制可能使调试变得复杂

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

创建Person抽象类

/**
 * 定义了模板方法TemplateMethod
 */
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子类

/**
 * 具体子类 Student
 */
public class Student extends Person {
    @Override
    public void PrimitiveOperation1() {
        System.out.println("学生:听课 学习 做笔记 提出问题");
    }
    @Override
    public void PrimitiveOperation2() {
        System.out.println("学生:写作业 提交作业");
    }
}

Teacher子类

/**
 * 具体子类 Teacher
 */
public class Teacher extends Person {
    @Override
    public void PrimitiveOperation1() {
        System.out.println("老师:上课 讲课 解答问题 布置作业");
    }
    @Override
    public void PrimitiveOperation2() {
        System.out.println("老师:批改作业 打分数");
    }
}

测试模板方法模式

/**
 * 测试模板方法模式
 */
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
  • 定义了读取/写入的基本流程,具体实现由子类完成
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号