设计模式(一)- 模板方法模式

2023-11-05

模板方法模式

1.模板方法模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

1.介绍

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

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

关键代码:在抽象类实现,其他步骤在子类实现。

2.应用实例:

在做饭的时候,流程大致一致,都要1,2,3,4步骤,但是不同的饭,做法又有差异,但是清洗、加水 这一步 都是一样的
1.选食材,不同的饭选食材不一样
2.清洗食材
3.蒸煮食材
4.盛出打包装盘 等差异。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

代码
1.父类抽象模板,统一方法定为final
package com.jzj.design.demo.templateDesign;

/**
 * 做饭抽象类
 * 做饭流程
 * 1.选食材
 * 2.清洗食材
 * 3.放入锅中,蒸煮、大火、小火、多久时间
 * 4.盛出,打包
 */
public abstract class AbstractCookTemplate {

    /**
     * 定义做饭模板的主要流程
     */
    public final void cook() {

        /**
         * 1.选取食材
         */
        String material = selectMaterial();
        System.out.println("1.选取食材如下:" + material);

        /**
         * 2.抽象方法,清洗食材
         */
        System.out.println("2.开始清洗食材");
        washMaterial();



        /**
         * 3.抽象方法,蒸煮食材
         */
        System.out.println("3.开始蒸煮食材");
        cookMaterial();


        /**
         * 4.抽象方法,打包
         */
        System.out.println("4.打包装盘");
        pack();
    }


    /**
     * 1.抽象方法,选食材
     */
    public abstract String selectMaterial();


    /**
     * 2.抽象方法,清洗食材
     */
    void washMaterial() {
        //加入农夫山泉水
        System.out.println("往锅中加入农夫山泉水");
        System.out.println("流程统一的清洗");
    }

    ;

    /**
     * 3.抽象方法,蒸煮食材
     */
    abstract void cookMaterial();


    /**
     * 4.抽象方法,打包
     */
    abstract void pack();

}

2.子类去实现不同的方法

大米饭要放入食材大米、蒸煮30分钟、保温杯盛放,大米子类去实现 1,3,4步骤

package com.jzj.design.demo.templateDesign;

/**
 * 蒸米饭
 */
public class RiceCook extends AbstractCookTemplate {
    @Override
    public String selectMaterial() {
        return "东北大米";
    }

    @Override
    public void cookMaterial() {
        System.out.println("东北大米要小火 蒸30分钟,才能做出香喷喷的大米饭");
    }

    @Override
    public void pack() {
        System.out.println("大米饭要用保温杯装,防止凉了");
    }
}

3.其他子类实现不同的方法

八宝粥要用8中材料、然后要用高压锅蒸煮、还需要用密封罐子来盛放,防止撒漏

package com.jzj.design.demo.templateDesign;

/**
 * 做八宝粥
 */
public class CongeeCook extends AbstractCookTemplate {
    @Override
    public String selectMaterial() {
        return "红豆、绿豆、扁豆、花生、桂圆、红枣、大米、红米";
    }

    @Override
    public void cookMaterial() {
        System.out.println("八宝粥需要高压锅 蒸煮20分钟,然后再小火慢炖10分钟,才能软糯可口");
    }

    @Override
    public void pack() {
        System.out.println("八宝粥打包需要密封的管子,防止八宝粥撒漏");
    }
}

4.结果展示
package com.jzj.design.demo.templateDesign;

public class AbsTplMain {

    public static void main(String[] args) {

        CongeeCook congeeCook = new CongeeCook();
        congeeCook.cook();

        System.out.println("=======================");
        RiceCook riceCook = new RiceCook();
        riceCook.cook();

    }

}

在这里插入图片描述

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

设计模式(一)- 模板方法模式 的相关文章

  • 为什么春季测试失败,不起作用@MockBean

    我尝试为一个简单的 spring boot 控制器创建我的第一个测试 但我得到Handler Type null 在浏览器中代码可以工作 但测试失败 我的应用程序使用 spring security 请帮助我解决问题并理解我的错误 谢谢 这
  • 在eclipse java项目中加载dll文件

    我正在尝试添加文件sqljdbc auth dll到项目库 我将包含 dll 的文件夹添加为外部类文件夹 在这里 我基本上尝试使用 Microsoft 提供的 SQL 驱动程序连接到我的 SQL SERVER 2008 数据库 我的代码是
  • 获取 get 或 post 请求的响应的响应字符集

    我正在努力在 java web 应用程序中提取响应字符集 我在其中使用 Apache HTTP 客户端 例如 从 Content Type 标头获得的一个可能值是 text html charset UTF 8 然后我的代码将提取 符号之后
  • Android 相机:线程?哪个应该做什么

    我试图弄清楚哪些线程应该在 Android 中执行哪些操作 我发现官方文档中唯一说明的是camera open 应该放入它自己的线程中 关于什么 camera startPreview camera stopPreview camera r
  • 使用现有同级属性值对属性进行 Jackson 多态反序列化

    我有一个现有的Request Response协议使用JSON我无法控制 示例1 响应JSON不需要任何多态反序列化 name simple response params success true 示例2 响应JSON需要对 params
  • 没有绑定 play.db.Database 的实现

    我在使用 hikaricp 时访问数据库时遇到问题 这是我的reference conf play modules enabled play api db DBModule enabled play api db HikariCPModul
  • 抽象数据类型和接口

    抽象数据类型和接口有什么区别 例如我们有一个ListADT interface MyListADT
  • 如何测试两个 Joda-Time DateTime 对象几乎相等?

    在单元测试中 我经常使用返回DateTime于或关于now 有没有办法说actual日期时间在几秒之内actual约会时间 这听起来是个坏主意 单元测试不应该以任何方式依赖于当前的实际时间 这就是为什么注入一些接口是一个很好的做法 称为Cl
  • Arrays.copyOf 产生浅拷贝还是深拷贝?

    对于是否应该这样做 似乎存在很多困惑和不同的意见 1 和其他来源 Arrays copyOf将产生深拷贝或浅拷贝 此测试表明副本很深 String sourceArray new String Foo String targetArray
  • PHP 和 ESB(使用 Mule)(ESB:企业服务总线)

    您在 PHP 项目中何时 何地以及为何使用 ESB 您认为在何处 何时以及为何在 PHP 项目中使用 ESB 有意义 ESB 以及像 Mule 这样的 ESB 促进者 是否提供了 PHP 和本地 LAMP 技术所缺乏的任何功能 Edit 我
  • 通过单击 imageView 打开活动

    我正在尝试做一个ImageView打开另一个活动 public class MainActivity extends Activity Override protected void onCreate Bundle savedInstanc
  • Unwrap 当使用 Collectors maxBy 和 groupingBy 时可选

    我有一堂课 有一个String and an int field public class Data private String name private int value private Data String name int va
  • Groovy 2.0.1,我自己的类上有 GroovyCastException?

    我在我的网络应用程序项目中广泛使用 Groovy 类 我可以创建类型的实例 定义为 groovy 类 但以后永远不能转换回它 GroovyCastException发生 org codehaus groovy runtime typehan
  • Hibernate 时间戳 - 毫秒精度

    似乎以毫秒精度存储时间戳是休眠的一个已知问题 我在数据库中的字段最初设置为时间戳 3 但我也尝试过日期时间 3 不幸的是 它没有任何区别 我尝试过使用 Timestamp 和 Date 类 最近我开始使用 joda time 库 经过所有这
  • 查看tomcat服务器的连接数

    我在 Tomcat Server 5 5 17 上部署了一个 Java Java EE Web 应用程序 我想知道连接到服务器的客户端数量 我们怎样才能找到它呢 最可靠的方法是搜索ip addr of srv port in netstat
  • 创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有什么区别

    这可能很愚蠢 但我想知道后台操作的区别 InputStream is new FileInputStream filepath FileInputStream is new FileInputStream filepath 上面两行代码有什
  • 我的递归条件是否正确计算二叉树高度?

    我想在你的帮助下知道我的代码是对还是错 因为遗憾的是我无法运行它来检查 没有编译错误 我想做的是找到二叉树的高度 当然 树不必是平衡的 二叉树中的每个节点可以有两个节点作为子节点 http en wikipedia org wiki Bin
  • 将 JVM 参数放入要在运行时获取的文件中

    我正在构建当前应用程序的 jar 它需要设置几个 JVM 参数 有没有办法在文件中而不是在命令行上设置这些 JVM 参数 我已经做了一些搜索 看起来我可以使用 java properties 文件做一些事情 可能通过设置 java args
  • 使用迭代器时无限循环

    Set key1 map keySet Iterator it1 key1 iterator int cnt 0 while it1 hasNext cnt 这段代码导致无限循环的可能性有多大 实际上这会导致无限循环 我怀疑是因为我没有服用
  • 无法声明接口:资源繁忙

    我正在使用 USB4Java 低级版本 并且基本上是根据这段代码工作的here http www mets blog com java usb communication usb4java 我在 Ubuntu 中工作 遇到了有关权限的问题

随机推荐

  • Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析

    paper Channel wise Knowledge Distillation for Dense Prediction official implementation https github com irfanICMLL Torch
  • Vue3的从入门到实战的培训教程大纲

    Vue3的从入门到实战的培训教程大纲 第一部分 Vue3入门 Vue框架概述 介绍Vue的历史和特点 解释Vue的MVVM架构 Vue3的新特性 对比Vue2和Vue3的主要差异 强调Vue3的性能改进和优化 安装与配置Vue3 下载和安装
  • java 多线程-03-等待wait 和 通知 notify

    等待wait 和 通知 notify 引入 java多线程协作支持 wait notify是object类 任何对象都可以调用这两个方法 public final void wait throws InterruptedException
  • 如何使用宝塔部署网站

    1 根据自己的版本输入不同安装宝塔的命令 我用的使用的是finashell软件 安装及使用前一篇已经介绍过了 用的是第一个安装命令 yum install y wget wget O install sh https download bt
  • 图的遍历(详解DFS与BFS)

    首先 我们来看一下涉及的知识点 图 图 G V E 由顶点集 V 和边集 E 组成 每条边对应一个点对 v w 其中 v w 属于 V 如果图中的点对是有序的 那么该图就是有向图 反之为无向图 邻接点 若顶点 v 与 w 之间存在一条边 则
  • 6、状态模式

    文章目录 概念 3个角色 demo 概念 状态模式属于行为型模式 只需要改变对象状态即可改变对象的行为 状态模式对 开闭原则 的支持并不太好 所以对象状态最好为有限个且不常变动 场景 1 行为随状态 属性改变而改变的场景 2 条件 分支语句
  • 终于拿下淘宝了。淘宝抓取,淘宝爬虫。taobao spider

    上个demo先
  • Linux 查看当前路径下所有文件夹大小的方法

    进入需要查看的目录 例如 根目录 cd 查看当前目录下每个文件夹的大小 du sh 查看当前目录下每个文件夹的大小并排序 单位 字节 n 按照数值排序 du s sort n 补充 du sh 查看当前目录总共占的容量 而不单独列出各子项占
  • Task-Oriented Conversation Generation Using Heterogeneous Memory Networks

    EMNLP 2019 录用长文 Abstract 如何将外部知识库与对话模型结合起来是一个重要的问题 传统上人们是使用了Memory Network 然而当面对多种来源的 异构的info时 Mem对这些info的处理并不好 我理解的是权重的
  • Numpy基础数据结构

    Numpy基础数据结构 NumPy数组是一个多维数组对象 称为ndarray 其由两部分组成 实际的数据 描述这些数据的元数据 Numpy Python开源的科学计算工具包 高级的数据编程工具 ndarray 是强大的N维数组对象 对数据结
  • Eclipse导入项目No projects are found to import

    如果发现导入工程 impot 的时候 出现 No projects are found to import 的提示 首先查看项目目录中是否有隐藏文件 project 还有目录结构也还要有一个隐藏文件 classpath 如果没有 你可以参考
  • 不能不知道的OS模块的那些常用函数(附内置变量)

    文章目录 OS 模块 1 1 常用函数 1 2 使用示例 1 3 内置变量 1 4 附 内置变量详解 OS 模块 该模块提供了各种函数 允许您操作文件路径和检查与路径相关的信息 比如是否存在 文件扩展名 目录名等等 1 1 常用函数 其中一
  • [DIP]如何提取文件中的公章,并识别其朝向是否准确

    任务描述 我们需要知道 我们盖在文件上的红章是否是端正的 需要解决的问题 1 图章的识别 2 图章的定位 3 图章的方向判定 思路 图章基本上是红色的 我们先根据颜色提取可能的图章区域 当然 假如文档中 还有其他红色的区域 这一步都会提取出
  • 从Authy中导出账户和secret

    文章作者 GoodBoyboy 文章链接 https blog goodboyboy top posts 2689781648 html 版权声明 本博客所有文章除特别声明外 均采用 CC BY NC SA 4 0 许可协议 转载请注明来自
  • oracle bulk collect forall,Oracle批量绑定forallbulkcollect用法

    采用bulk collect 可以将查询结果一次性的加载到collections中 而不是通过CURSOR一条一条地处理 可以在select into fetchinto 采用bulk collect 可以将查询结果一次性的加载到colle
  • 银行项目测试

    主要的核心业务 存款业务 吸收客户的存款 为客户发放利息 属于负债业务 贷款业务 发放贷款给客户 收取客户的利息 属于银行的资产业务 中间业务 银行已中间人的身份 为客户办理业务 收取客户的手续费 例如 批量代发工资 批量代收水 电 燃气费
  • 华为OD机试 Python 【单词加密】

    题目 给你一句英文 里面有很多单词 单词间用空格隔开 我们要对这句子做点的变化 加密规则 如果单词里有元音 a e i o u 大小写都算 就把元音变成 如果一个单词完全没有元音 那就让这个单词的第一个和最后一个字母交换位置 输入 一句英文
  • SKB几个复制函数的区别

    1 skb clone Skb clone 函数只是复制sk buff结构 并不复制skb的数据缓冲区 Clone后的sk buff结构与原始的sk buff指向同一数据缓冲区 原始的和clone后的skb描述符的cloned值都会被置1
  • 前端基础之滚动显示

    marquee滚动标签 注 该标签已经过时 被w3c弃用 使用样例
  • 设计模式(一)- 模板方法模式

    模板方法模式 文章目录 模板方法模式 1 模板方法模式 1 介绍 2 应用实例 代码 1 父类抽象模板 统一方法定为final 2 子类去实现不同的方法 3 其他子类实现不同的方法 4 结果展示 1 模板方法模式 在模板模式 Templat