Java设计模式之模板模式

2023-05-16

目录

模板模式的介绍

模板模式的案例

模板模式的优缺点

总结


模板模式的介绍

定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。

通俗易懂的话来说:父类中定义好一个操作的框架(方法),在框架中一个步骤就是一个抽象方法,具体的步骤交给子类来实现,而每个子类的实现的细节都不一致。已达到不同的子类完成一个相似的操作而细节都不一致。

模板模式的案例

先上案例的类图

父类定义了制作炸鸡的方法,而制作一只炸鸡需要养殖->屠宰->油炸,这三个步骤分别定义成一个方法等待子类来重写,因为不同的厂家制作炸鸡在每一步都是有一定的差异的。

Java代码如下:

炸鸡父类

/**
 * @author liha
 * @version 1.0
 * @date 2022/3/21 15:23
 * @description 炸鸡的父类
 */
public abstract class AbstractFriedChicken {

    /**
     * 定义一套制作炸鸡的步骤
     * */
    protected final void makeFriedChicken(){
        breed();
        slaughter();
        Fried();
    }

    // 养殖方法  等待子类实现
    protected abstract void breed();

    // 屠宰方法  等待子类实现
    protected abstract void slaughter();

    // 油炸方法  等待子类实现
    protected abstract void Fried();
    
}

麦当劳厂家

/**
 * @author liha
 * @version 1.0
 * @date 2022/3/21 15:27
 * @description 麦当劳厂家制作炸鸡
 */
public class McDonald extends AbstractFriedChicken{

    /**
     * 麦当劳厂家养殖
     * */
    @Override
    protected void breed() {
        System.out.println("麦当劳养殖鸡每天喂食4次");
    }

    /**
     * 麦当劳厂家屠宰
     * */
    @Override
    protected void slaughter() {
        System.out.println("麦当劳人工屠宰");
    }

    /**
     * 麦当劳厂家油炸
     * */
    @Override
    protected void Fried() {
        System.out.println("麦当劳油炸的油2天换一次");
    }
}

肯德基厂家

/**
 * @author liha
 * @version 1.0
 * @date 2022/3/21 15:28
 * @description 肯德基厂家制作炸鸡
 */
public class KFC extends AbstractFriedChicken{

    /**
     * 肯德基厂家养殖
     * */
    @Override
    protected void breed() {
        System.out.println("肯德基养殖鸡每天喂食2次");
    }

    /**
     * 肯德基厂家屠宰
     * */
    @Override
    protected void slaughter() {
        System.out.println("肯德基用机器屠宰");
    }

    /**
     * 肯德基厂家油炸
     * */
    @Override
    protected void Fried() {
        System.out.println("肯德基油炸的油半天换一次");
    }
}

测试类&控制台输出结果

模板模式的优缺点

优点:

  1. 公共的逻辑代码抽取,代码复用
  2. 父类控制行为,子类具体实现
  3. 封装不变的部分,重写可变的部分,易扩展

缺点:每来一个子类就要定义一套子类的规范,项目的体积会越来越大。

总结

简单的介绍了模板方式的概念和举了一个案例来方便理解,想要看框架源码中对模板模式的使用可以点击下面链接跳转。

模板设计模式在框架源码中的体现https://blog.csdn.net/qq_43799161/article/details/123639776

最后,大家有不懂的地方可以在评论区留言。如果此文章对您有一定的帮助,希望能点赞+关注+收藏,您的支持是我最大的动力,后续一直再更新各种框架的使用和源码解读~!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java设计模式之模板模式 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐