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

article/2025/10/25 21:46:03

Hi,大家好。今年的天气实在是太热了,七月份的厦门晒得我觉得身上冒出了烤肉香,不知道各位是否安好,但是在再热的天气也不能阻止我们学习的热情(doge)。今天的主题是模板(Template Method)模式,还是老样子,学习设计模式需要在具体的场景中学习,让我们先来构建一个问题的场景。

场景定义

今天产品经理给了你一个需求,需要构建一个小明上班的场景。小明每天8:00从家里出发,因为小明就租在公司附近,每天只需要骑15分钟的自行车就可以到达公司,然后从楼下大厅进入公司。

OK,就是这样一个简单的场景。我们先思考一下如何实现,如果是公司刚来的初级程序员一定会直接说:简单,让我来。接着噼里啪啦3分钟完成了这样一段程序

public class Main {public static void main(String[] args) {System.out.println("小明出门了");System.out.println("小明骑上自行车");System.out.println("小明从大厅进入公司");}
}

程序输出:

小明出门了
小明骑上自行车
小明从大厅进入公司

简单易懂,没有任何问题,新来的小家伙嘴角扬起了一丝得意的微笑,心想:我又完美的解决了一项任务,照这么下去老板迟早有一天能够发现我这块发光的金子。不知道老板有没有一位美丽又待秀闺中的女儿…

你作为一个已经有些许经验的程序猿,一下子就看出小伙子心里的小九九,摸了摸还算茂密的头发,无奈的摇摇头。心里想到:小伙子,我当年也是这么想的,你还是too young too naive。等着看吧,问题马上就要来了。

果不其然,不一会儿万恶的产品经理就再次出现,他说刚刚客户来了一个电话,要对需求进行一些补充:

小明虽然住在公司旁边,但是小明有一个缺点,爱睡懒觉。经常会赖床到8:50才出门,这时候小明就会打滴滴从地下停车场出发去公司。新来的小伙子这时候已经开始意识到有些不对劲,但是还是很快完成了任务。他又创建了一个类用来负责处理这种情况

public class Main2 {public static void main(String[] args) {System.out.println("小明从地下车库出门了");System.out.println("小明坐上了滴滴");System.out.println("小明从大厅进入公司");}
}

程序输出:

小明从地下车库出门了
小明坐上了滴滴
小明从大厅进入公司

这时候你一看时间6:00了,于是熟练的摸上你的包,唰的一下从公司门口溜了出去,回家喝上一杯快乐水,生活美滋滋。第二天早上,你才刚来到公司,就听见部门主管在办公室大发雷霆,将新来的小伙子骂了个狗血淋头。一问情况才知道昨晚小伙留下加班,产品经理又提出了更多的需求:

小明升职加薪,买房买车每天自己开车上班
小明年逾古稀,只能摇轮椅上班

小伙子通通创建一个新类来处理不同的情况,现在已经创建了大大小小十多个类,主管今天早上review代码的时候直接被绕晕了,其他模块需要调动接口时需要了解每一个类的细节,根本没法用。过了一会,你就看见小伙子哭丧着脸从主管办公室走了出来。你心里一阵叹息,准备日行一善来唤起小伙子的斗志。于是你准备教给他你当初被主管骂了四次才从这个老家伙那偷师学到的神兵利器,模板模式。

什么是模板模式

模板模式实际上是在父类中定义处理流程的框架,在子类中具体实现具体处理的模式。在上面的场景中,我们可以发现,虽然小明从家中出发去公司的方式各种各样,但是总体上可以分为三个步骤:

  • 出门

  • 选择交通工具

  • 到公司

因此,就可以将这三个方法作为抽象方法提升到父类中,而由不同的子类来实现具体需要的功能

让我们看看修改后的代码的类图

在这里插入图片描述

模板模式中出现的角色

实际上,模板模式中只有两个关键性角色

AbstractClass(抽象类)

AbstractClass角色(例子中的GoToCompany)不仅负责实现模板方法(goToCompany方法),还负责声明在模板方法中使用到的抽象方法。这些抽象方法由子类ConcreteClass角色负责实现。

ConcreteClass(具体类)

该角色负责实现AbstractClass角色中定义的抽象方法,这里的实现将会在AbstractClass的模板方法中调用。在该例子中,CommonGoToCompany和HurryGoToCompany都是具体类。

模板方法的具体实现

基础的概念都已经了解完毕,接下来就可以进入具体的代码实现:

GoToCompany的实现

public abstract class GoToCompany {/*** 定义抽象的出门动作*/public abstract void goOut();/*** 定义抽象的选择交通工具动作*/public abstract void onTheWay();/*** 定义抽象的到达公司动作*/public abstract void arrivalCompany();/*** 定义好处理流程的框架,模板方法*/public void goToCompany(){//出发this.goOut();//选择交通工具this.onTheWay();//到达公司this.arrivalCompany();}
}

CommonGoToCompany的实现

public class CommonGoToCompany extends GoToCompany{/*** 出门方式的具体实现*/@Overridepublic void goOut() {System.out.println("小明出门了");}/*** 选择交通工具的具体实现*/@Overridepublic void onTheWay() {System.out.println("小明骑上自行车");}/*** 进入公司方式的具体实现*/@Overridepublic void arrivalCompany() {System.out.println("小明从大厅进入公司");}
}

HurryGoToCompany的实现

public class HurryGoToCompany extends GoToCompany{/*** 出门方式的具体实现*/@Overridepublic void goOut() {System.out.println("小明从地下车库出门了");}/*** 选择交通工具的具体实现*/@Overridepublic void onTheWay() {System.out.println("小明坐上了滴滴");}/*** 进入公司方式的具体实现*/@Overridepublic void arrivalCompany() {System.out.println("小明从大厅进入公司");}
}

Main的实现

public class Main {public static void main(String[] args) {// 如果需要修改小明的上班方式,只需要将CommonGoToCompany修改为HurryGoToCompany即可GoToCompany goToCompany = new CommonGoToCompany();goToCompany.goToCompany();}
}

拓展思路

如果你能看到这里,使用模板模式对你来说已经毫无困难。那么让我们更进一步,思考一下使用模板模式究竟能带来什么好处?

使用了通用的处理逻辑

使用模板模式的优点在于,我们只需要在父类中编写一次处理流程,而无需在子类中再次编写。如果我们采用最初的方法通过复制粘贴来拓展新方法,如果未来发现处理问题的逻辑发生错误,我们就不得不将所有的类进行修改。而采用模板方法,我们只需要修改父类中的模板方法。

父类与子类一致性

在例子中无论是使用HurryGoToCompany还是CommonGoToCompany的具体实现,他们都被保存在父类GoToCompany申明的变量中。无论父类变量中保存了哪一个子类的实例,程序都可以正常工作,这满足了里氏替换原则(LSP,不是老色批)的要求(什么?不知道什么是里氏替换原则,快来这篇文章看一看)

往期文章

一文搞懂设计模式–外传

一文搞懂设计模式–迭代器模式

一文搞懂设计模式–适配器模式


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

相关文章

设计模式 – 模板设计模式

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

【设计模式】模板模式

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

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

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

设计模式——模板模式

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

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

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

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

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

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

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

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

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

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

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

信贷全流程监控报表有哪些?

风险策略分析工作是风险管理的重要工作内容,其工作内容需要涉及风控领域中多个环节及细节内容,包含贷前策略调整、策略分析调优、贷中业务监控、贷后策略调整等模块内容,涉及相关模块工作细节及工作内容,我们将一一为大家梳理及分…

详解小微机构贷前准入规则

关注 “番茄风控大数据”,获取更多数据分析与风控大数据的实用干货 嗨同学们好,现在疫情的情况已经出现大反转,我们国内的疫情已经控制住,多个城市都出现了连续多年0增长,一二线城市的部分公共场合也陆续对外开放&…

催收评分卡是如何搭建的?

1、背景 在整个风控体系中,一般分为贷前、贷中和贷后,贷前一般包括反欺诈和A卡,贷中一般使用B卡,贷后一般使用C卡,随着现在监管的越来越严格,催收的合规性越来越重要,所以各持牌金融机构越来越…

贷款中介业务管理系统-具备完善的贷前审批及贷后监管功能

一、系统介绍 银行贷款中介平台(助保贷平台)是一套适用于当今时代的中介系统,对于借款人来说可以满足他们上学、培训、旅游、购物等。平台根据各借款人资质推介给各银行或用自有资金放款。贷款中介系统提供了一套完善的网络借贷系统&#xff…

一文带你了解助贷行业

原文作者:宁阿姨(知乎ID) 原文链接:https://zhuanlan.zhihu.com/p/485880345 注:仅限自己学习使用 日常消费用花呗用信用卡,个人周转用借呗或微粒贷,买车买房用车贷房贷,作为消费者…

贷后催收中的风险联动管控指标

在番茄风控大数据之前的文章中,之前跟大家介绍过催收相关内容:催收小词典,助你轻松讨回债务。 今天文章会再跟大家介绍在这些催收指标中,哪些指标是可以反馈到贷前贷中风控环节的。在策略整体优化流程而言,数据是流动…

现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、Axure原型

现金贷、信用贷、消费贷小贷系统后台、现金贷、消费贷、信用贷、助学贷、旅游贷、装修贷、准入授信 、贷款申请、产品授信、合同管理、放款审批、放款登记、还款管理、贷后检查、贷后预警、贷款结项、 Axure原型演示及下载地址:Axure Cloud - Generating Project …

什么是银行测试业务?银行测试业务包括哪些?

我们知道软件测试是为了保证软件的质量和可靠性而在新软件系统上线之前对软件进行的质量检测工作。通过软件测试这个过程找出软件中的错误,分析错误的产生原因和容易产生错误的区域,进而有针对性的设计测试方法提高软件测试的效率。 以上简单讲述了一下…

贷前贷中风控体系

消费金融服务方:金融系、场景系、互联网系 第三方支撑平台:获客平台、风控支持、系统服务、支付平台、贷后管理 消费金融风控全流程 贷前审查:信息采集、信息验证、反欺诈 贷中评估:信用评估、授信 贷后管理:贷后…

贷中管理-理论

Part1 什么是贷中管理 贷中管理:值从贷款发放之日起,至贷款本息收回日期为止的贷款管理。 不同于贷前和贷后管理,贷后管理早期在信贷管理较为薄弱,且没有明确的业务目标。但随着催收压力逐渐加大,且贷中管理存在大量的…

贷前中后简单记录

前中后 贷前贷中贷后是一个业务分类,是用户信贷生命周期的三个阶段。并不是一个业务架构或者技术架构。以下的贷前贷中贷后主要是互金领域的情况,传统银行也有贷前贷中贷后,但是做法不同。 贷前 1、准入/额度/利率 贷前的核心就是两个&am…