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设计模式之模板模式 的相关文章

  • 即使在轴上进行自动量程调整,我也可以保留积分刻度线吗?

    我 偷 了一些代码here http fxexperience com 2012 01 curve fitting and styling areachart 拥有一个AreaChart我在 FXML 中使用了 平滑线条 它的工作原理如下
  • 如何在 MSSQL 中获取 CURRENT_DATE?

    我正在使用 jpa 3 o 和 Hibernate 我有一个命名查询 SELECT COUNT wt id FROM WPSTransaction wt WHERE wt createdDate gt CURRENT DATE WPSTra
  • JavaFX使节点覆盖父节点边框颜色

    我有一个如下所示的节点 仅使用 css 我希望标签覆盖其父边框颜色 因此标签下方的边框颜色部分变得不可见 我用来制作这个边框的CSS代码 fx border color black fx border width 3 fx border r
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • 确定序列化对象的类型

    我需要通过套接字发送消息 从用户到引擎的请求 以及从引擎到用户的响应 所以流程本质上是 serialized request Server lt network gt Client serialized response request r
  • 在grails控制器中识别ajax请求或浏览器请求

    我正在开发一个使用大量ajax的grails应用程序 如果请求是ajax调用 那么它应该给出响应 这部分正在工作 但是如果我在浏览器中输入URL 它应该带我到主页 索引页面而不是请求的页面 下面是ajax调用的示例gsp代码
  • java setFullScreenWindow 在 Mac 中隐藏登录对话框

    我使用的是全屏窗口 类似于屏幕保护程序 使用这里的方法 GraphicsEnvironment getLocalGraphicsEnvironment getDefaultScreenDevice setFullScreenWindow t
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • 用于层次结构树角色的 Spring Security / Java EE 解决方案

    我知道 Spring Security 非常适合标准角色和基于权限的授权 我不确定的是这种情况 系统中管理着 10 000 名员工 员工被组织成组织结构图 跨部门的谁向谁报告的树 其中一些员工是用户 这些用户仅被允许访问其职责范围内的员工
  • 在 Java 中创建 XML 文件的最佳方法是什么?

    我们目前使用 dom4j 来创建 XML 文件 不过 我猜现在有更好的东西了 如果我们使用的是 Java 1 6 或更高版本 那么在编写 XML 文件时最好使用什么类 运行速度最快 使用简单 我不需要构建一个 DOM 然后编写整个 DOM
  • 嵌套字段的 Comparator.comparing(...)

    假设我有一个这样的域模型 class Lecture Course course getters class Course Teacher teacher int studentSize getters class Teacher int
  • 为什么无法从 WEB-INF 文件夹内加载 POSModel 文件?

    我在我的 Web 项目中使用 Spring MVC 我将模型文件放在 WEB INF 目录中 String taggerModelPath WEB INF lib en pos maxent bin String chunkerModelP
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]

    这个问题在这里已经有答案了 我无法使页面正常工作 我有要发布的表单方法和我的 servlet 实现doPost 然而 它不断地向我表明我并不支持POST方法 我只是想做一个简单的网站并将值插入到我的 MySQL 数据库中 type Stat
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • Android UnityPlayerActivity 操作栏

    我正在构建一个 Android 应用程序 其中包含 Unity 3d 交互体验 我已将 Unity 项目导入 Android Studio 但启动时该 Activity 是全屏的 并且不显示 Android 操作栏 我怎样才能做到这一点 整
  • 使用 PC/SC 读卡器验证 Ultralight EV1

    我在尝试使用 Java 中的 PC SC 读卡器 特别是 ACR1222L 验证 Ultralight EV1 卡时遇到问题 我能够使用 ISO 14443 3 标签的相应 APDU 在不受保护的标签上进行写入和读取 但是 我找不到运行 P
  • spring data jpa复合键重复键记录插入导致更新

    我有一个具有复合键的实体 我试图通过使用 spring data jpa 存储库到 mysql 数据库来持久化它 如下所示 Embeddable public class MobileVerificationKey implements S
  • 如何使用自定义 JDK 构建 Jenkins 项目?

    我有一个常规的 Jenkins 实例 运行一些多分支管道 该实例在 JDK 11 上运行 因为 Jenkins 并不真正支持更高版本 没关系 但不好的是 我的所有管道似乎也都受到 Java 11 的限制 Jenkins 仅使用它自己也使用的
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr

随机推荐