【JavaSE】Java设计模式详解(二)抽象模板模式

article/2025/10/25 18:55:20

💁 个人主页:Nezuko627的博客主页
❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
🎏 格言:立志做一个有思想的程序员 🌟
📫 作者介绍:本人本科软件工程在读,博客将主要分享JavaSE、JavaEE、MySQL、SpringBoot、算法等知识。专栏内容长期更新,如有错误,欢迎评论区或者私信指正!感谢大家的支持~~~

本篇学习目标:

  • ⭐️ 了解什么是抽象模板模式;
  • ⭐️ 了解模板模式的设计过程;
  • ⭐️ 体会抽象模板设计模式的好处。

本文来自专栏:JavaSE系列专题知识及项目 欢迎点击支持订阅专栏 ❤️
在这里插入图片描述

文章目录

  • 1 问题引入
  • 2 初步优化(每个类内部)
  • 3 抽象模板设计
  • 写在最后


1 问题引入

✈️ 老套路啦!我们先来看一个需求:

有多个类,假设有三个:小学生类Pupil、中学生类MStudent、大学生类CStudent ,其中每个类都有不同的 homework() 方法,要求你统计各自完成作业需要的时间。

Tips: 在实现需求时,我们假设小学生、中学生、大学生完成作业的时间是依次增加的,将其作业的任务设置成一个方法 homework,用于完成作业并计算完成作业的时间。

🍌 参考代码:

⭐️ Pupil类:

class Pupil{private String name = "小学生";public String getName(){return this.name;}// 完成作业public void homework(){long start = System.currentTimeMillis();long time = 0;for (int i = 0; i < 100000; i++) {time += i;}long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}
}

⭐️ MStudent类:

class MStudent{private String name = "中学生";public String getName(){return this.name;}// 完成作业public void homework(){long start = System.currentTimeMillis();long time = 0;for (int i = 0; i < 9000000; i++) {time += i;}long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}
}

⭐️ CStudent类:

class CStudent{private String name = "大学生";public String getName(){return this.name;}// 完成作业public void homework(){long start = System.currentTimeMillis();long time = 0;for (int i = 0; i < 90000000; i++) {time += i;}long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}
}

⭐️ 测试类:

public class TestTemplate {public static void main(String[] args) {new Pupil().homework();  // 小学生new MStudent().homework();  // 中学生new CStudent().homework();  // 大学生}
}

🍎 实现结果:

小学生完成作业用时:1h
中学生完成作业用时:5h
大学生完成作业用时:26h

好啦,到这里我们已经实现了需求,但是,小伙伴们,有没有发现一个问题?我们来比较一下小学生、中学生、大学生三个类中的 homework() 方法就会发现: 代码的冗余度过高,在方法内有很多重复的步骤,代码的复用性不强! 怎么解决呢?别急继续往下看~


2 初步优化(每个类内部)

😦 我们可以从 homework() 方法中将重复的部分单独提出来,设置成一个 computingTime() 方法,用于计算作业完成所需要的时间,具体见下图(以大学生类为例,其他两个类进行一样的操作):

⭐️ Star 1: 将公共部分提取成一个方法

在这里插入图片描述
⭐️ Star 2: 其余部分在该方法中调用

在这里插入图片描述

🍌 优化后的代码如下:

public class TestTemplate {public static void main(String[] args) {new Pupil().computingTime();  // 小学生new MStudent().computingTime();  // 中学生new CStudent().computingTime();  // 大学生}
}class Pupil{private String name = "小学生";public String getName(){return this.name;}// 计算作业完成所需要的时间public void computingTime(){long start = System.currentTimeMillis();homework(); // 写作业long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}// 完成作业public void homework(){long time = 0;for (int i = 0; i < 100000; i++) {time += i;}}
}class MStudent{private String name = "中学生";public String getName(){return this.name;}// 计算作业完成所需要的时间public void computingTime(){long start = System.currentTimeMillis();homework(); // 写作业long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}// 完成作业public void homework(){long time = 0;for (int i = 0; i < 9000000; i++) {time += i;}}
}class CStudent{private String name = "大学生";public String getName(){return this.name;}// 计算作业完成所需要的时间public void computingTime(){long start = System.currentTimeMillis();homework(); // 写作业long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}// 完成作业public void homework(){long time = 0;for (int i = 0; i < 90000000; i++) {time += i;}}
}

🍑 现在,我们已经成功将方法中的公共部分给提取出来,单独设置成了 computingTime() 方法,但是,很快我们又发现了问题:一共有三个类,每个类都需要提取一次,设置出一个单独的方法,还是过于繁琐,需要进一步优化,我们接着往下看。


3 抽象模板设计

😎 既然重复,我们为何不 尝试将重复的部分提取到一个模板类里,让这三个类继承 呢?这样每个类都不需要声明该方法,就可以使用啦!具体如下图:
在这里插入图片描述
🍑 在这里,我们将三个类中共有的computingTime() 方法提取到 Template类作为模板,让子类继承。并且,将三个类中不同的部分 homework类 在父类中抽象,子类实现。在实际调用中,由于动态绑定机制,使用的则是 new 创建的对象所绑定的方法,先是子类,若子类不存在该方法再访问父类,这点在之前的文章讲过,这里直接上传送门哈!
❤️ 【JavaSE】面向对象之多态、向上转型与向下转型
具体方式如下:

在这里插入图片描述
🍌 优化后的完整代码:

public class TestTemplate {public static void main(String[] args) {new Pupil().computingTime();  // 小学生new MStudent().computingTime();  // 中学生new CStudent().computingTime();  // 大学生}
}// 模板类
abstract class Template{private String name;public String getName(){return this.name;}// 计算作业完成所需要的时间public void computingTime(){long start = System.currentTimeMillis();homework(); // 写作业long end = System.currentTimeMillis();System.out.println(getName() + "完成作业用时:" + (end-start) + "h");}abstract void homework();
}class Pupil extends Template{private String name = "小学生";public String getName(){return this.name;}// 完成作业public void homework(){long time = 0;for (int i = 0; i < 100000; i++) {time += i;}}
}class MStudent extends Template{private String name = "中学生";public String getName(){return this.name;}// 完成作业public void homework(){long time = 0;for (int i = 0; i < 9000000; i++) {time += i;}}
}class CStudent extends Template{private String name = "大学生";public String getName(){return this.name;}// 完成作业public void homework(){long time = 0;for (int i = 0; i < 90000000; i++) {time += i;}}
}

🍎 实现结果:

小学生完成作业用时:1h
中学生完成作业用时:4h
大学生完成作业用时:26h


写在最后

🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
在这里插入图片描述

共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
在这里插入图片描述


http://chatgpt.dhexx.cn/article/OWIjXTZC.shtml

相关文章

设计模式之模板设计模式

设计模式之模板设计模式 代码下载 1.概念 定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。Template Method使得子类可以不改变一 个算法的结构即可重定义该算法的某些特定步骤。 2.类图 代码下载

10.7 抽象类最佳实践-模板设计模式

10.7.1 基本介绍 10.7.2 模板设计模式能解决的问题 10.7.3 最佳实践 abstract public class Template { //抽象类-模板设计模式 public abstract void job();//抽象方法 public void calculateTime() { //实现方法&#xff0c;调用 job 方法 //得到开始的时间 long start …

【设计模式-模板模式】

设计模式-模板模式 模板模式模板模式的优缺点实现模板代码 模板模式 在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。这种类…

设计模式学习(一)—— 模板方法设计模式

设计模式在开发当中有时候挺重要的&#xff0c;可以让你的代码设计变得更加合理巧妙。方便开发。这篇作为我学习设计模式的开篇啦。平时其实也看了不少&#xff0c;就是没用到就没那么深刻&#xff0c;有时候也很懒去记录这些东西。所以现在写出来&#xff0c;也好自己学习整理…

设计模式-模板模式及应用

一般生活中我们办理一件事需要一套指定的流水线。例如银行办事&#xff0c;需要先去营业厅取号、排队、办理业务、综合评分。这一套固有的流程&#xff0c;取号、排队、综合评分等都是固定的&#xff0c;不同的客户会办理不同的业务&#xff0c;只有这块是没个客户不同的。类似…

Java设计模式——模板设计模式

模板设计模式 1.模板模式简介 模板模式&#xff08;Template &#xff09;&#xff1a;模板方法模式是类的行为模式。准备一个抽象类&#xff0c;将部分逻辑以具体方法以及具体构造函数的形式实现&#xff0c;然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以…

【设计模式】--模板模式

豆浆制作 编写制作豆浆的程序&#xff0c;说明如下: 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎通过添加不同的配料&#xff0c;可以制作出不同口味的豆浆选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的请使用 模板方法模式 …

Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式

Java 设计模式 --- Template 模式 Java Template 模式 Java 模板设计模式 一、概述 模板设计模式&#xff1a; 父类定义通用抽象的功能方法&#xff0c;子类负责具体的实现。 本文将以一个通用的定时任务&#xff0c;处理模式&#xff0c;来讲解java 模板设计模式。 假设定时任…

设计模式——模板设计模式

一 前言 在面向对象开发过程中&#xff0c;通常会遇到这样的一个问题&#xff0c;我们知道一个算法所需的关键步骤&#xff0c;并确定了这些步骤的执行顺序&#xff0c;但是&#xff0c;某些步骤的具体实现是未知的&#xff0c;或者说某些步骤的实现是会随着环境的变化而改变&…

java设计模式之模板方法设计模式

什么是模板方法设计模式 模板方法是基于继承实现的&#xff0c;在抽象父类中声明一个模板方法&#xff0c;并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中&#xff0c;可以将子类共性的部分放在父类里实现&#xff0c;而特性部分在子类中实现&#xff0c;只需…

一文搞懂设计模式--模板模式

Hi&#xff0c;大家好。今年的天气实在是太热了&#xff0c;七月份的厦门晒得我觉得身上冒出了烤肉香&#xff0c;不知道各位是否安好&#xff0c;但是在再热的天气也不能阻止我们学习的热情&#xff08;doge&#xff09;。今天的主题是模板&#xff08;Template Method&#x…

设计模式 – 模板设计模式

模板设计模式 模板方法模式&#xff08;Template Method Pattern&#xff09;&#xff0c;又叫模板模式(Template Pattern)&#xff0c;在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。 该模式的主…

【设计模式】模板模式

博主声明&#xff1a; 转载请在开头附加本文链接及作者信息&#xff0c;并标记为转载。本文由博主 威威喵 原创&#xff0c;请多支持与指教。 本文首发于此 博主&#xff1a;威威喵 | 博客主页&#xff1a;https://blog.csdn.net/smile_running 这是23种设计模式中的模板模…

设计模式之模板模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、模板模式是什么&#xff1f; 模板模式是一种行为型的软件设计模式&#xff0c;在父类中定义了一个模板算法&#xff0c;只实现…

设计模式——模板模式

更多内容&#xff0c;前往 IT-BLOG 在面向对象程序设计过程中&#xff0c;程序员常常会遇到如下情况&#xff1a;设计一个系统时知道算法所需的关键步骤&#xff0c;且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体…

深入理解设计模式之模板模式

我们平时办理入职的流程是&#xff1a;填写入职登记表->打印简历->复印学历->复印身份证->签订劳动合同->建立花名册->办理工牌->安排工位。我平时在家里炒菜的流程是&#xff1a;洗锅->点火->热锅->上油->下原料->翻炒->放调料->出…

数据化风控与催收人员策略管理

在印象中催收也许是个玄学&#xff0c;一个做得好的催收员除了催收技巧外、你需要了解心理学、懂声音学、懂人性、懂风水易经&#xff0c;比如就有个认识的人对什么岁数的人在哪个时辰拨打电话才比较好&#xff0c;都有讲究…总之一切尽在不言中… 但催收的管理却与之相反&…

信贷产品年终总结之风控评分模型

叮咚&#xff0c;信贷年终总结的又一个专题来了&#xff0c;作为报告总结类的系列型文章&#xff0c;近期我们番茄知识星球平台陆续发布了相关年终总结专题&#xff0c;依次为客群特征画像、贷中行为分析、贷后逾期表现等&#xff0c;以上文章可详见之前陆续发布的内容。该业务…

实操信贷场景中的反欺诈模型

今天的文章&#xff0c;关于反欺诈模型的实操&#xff0c;之前有跟大家分享过相关内容&#xff0c;部分反欺诈的领域的童鞋感觉内容比较有帮助&#xff0c;今天就该内容进行讲解。本文介绍的产品适合在消费零售信贷及现金场景贷中的中短期产品&#xff0c;其中涉及的变量参考有…

信贷全生命周期监控报表开发

对于任何一家从事信贷业务的机构而言&#xff0c;监控报表的设计及搭建尤为重要。因为监控报表不仅涉及信贷风控的资产监控&#xff0c;更能反馈客群质量的变化、内部管理手段的调整、策略规则对客群质量的影响等方面。为此&#xff0c;番茄风控输出此系列文章&#xff0c;我们…